diff --git a/.gitattributes b/.gitattributes index 2f5a030981fb94..b70318d226f81b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -20,6 +20,9 @@ # Specific binary files PC/classicAppCompat.* binary +# JIT stencils are generated by the build and should not be modified +Tools/jit/stencils/* text eol=lf + # Text files that should not be subject to eol conversion [attr]noeol -text diff --git a/.github/workflows/jit.yml b/.github/workflows/jit.yml index d9e2ffc3fd4da6..1c466adbca3965 100644 --- a/.github/workflows/jit.yml +++ b/.github/workflows/jit.yml @@ -58,7 +58,7 @@ jobs: - aarch64-pc-windows-msvc/msvc - x86_64-apple-darwin/clang - aarch64-apple-darwin/clang - - x86_64-unknown-linux-gnu/gcc + - x86_64-pc-linux-gnu/gcc - aarch64-unknown-linux-gnu/gcc debug: - true @@ -81,7 +81,7 @@ jobs: - target: aarch64-apple-darwin/clang architecture: aarch64 runner: macos-14 - - target: x86_64-unknown-linux-gnu/gcc + - target: x86_64-pc-linux-gnu/gcc architecture: x86_64 runner: ubuntu-24.04 - target: aarch64-unknown-linux-gnu/gcc @@ -133,6 +133,71 @@ jobs: make all --jobs 4 ./python -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + - name: Check if stencils need regeneration + id: check-stencils + if: ${{!matrix.debug }} + shell: bash + run: | + git add Tools/jit/stencils + + if ! git diff --staged --exit-code --quiet; then + git diff --staged > jit_stencils.patch + exit 1 + fi + + - name: Format target name + if: ${{ failure() && steps.check-stencils.conclusion == 'failure' && !matrix.debug }} + id: strip-target + shell: bash + run: | + target=${{ matrix.target }} + target="${target%%/*}" + echo "target=$target" >> $GITHUB_OUTPUT + + - name: Upload stencil patch + if: ${{ failure() && steps.check-stencils.conclusion == 'failure' && !matrix.debug }} + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.strip-target.outputs.target }}-jit-stencils + path: jit_stencils.patch + + aggregate-stencil-patches: + name: Aggregate stencil patches + needs: jit + runs-on: ubuntu-24.04 + if: ${{ failure() }} + steps: + - name: Download stencil artifacts + run: | + mkdir -p artifacts + gh run download ${{ github.run_id }} --pattern '*jit-stencils*' --dir artifacts --repo ${{ github.repository }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Aggregate stencil patches + run: | + temp_file="$(mktemp)" + : > "$temp_file" + + find artifacts -mindepth 1 -maxdepth 1 -type d | while read -r dir; do + find "$dir" -type f -name "*.patch" -exec cat {} + >> "$temp_file" + done + + sed_command="s/[[:space:]]*$//" + if [[ "$(uname)" == "Darwin" ]]; then + sed -i '' "$sed_command" "$temp_file" + else + sed -i "$sed_command" "$temp_file" + fi + + mv "$temp_file" aggregated_jit_stencils.patch + + - name: Upload aggregated stencil patch + uses: actions/upload-artifact@v4 + with: + name: aggregated-jit-stencils + path: aggregated_jit_stencils.patch + jit-with-disabled-gil: name: Free-Threaded (Debug) needs: interpreter diff --git a/.gitignore b/.gitignore index 8872e9d5508ff1..0ea10a77f07ca9 100644 --- a/.gitignore +++ b/.gitignore @@ -138,6 +138,7 @@ Tools/unicode/data/ /.ccache /cross-build/ /jit_stencils.h +/jit_stencils.h.digest /platform /profile-clean-stamp /profile-run-stamp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fb44c27704d455..7885226030998e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,7 @@ repos: args: [--line-length=79] - id: black name: Run Black on Tools/jit/ - files: ^Tools/jit/ + files: ^Tools/jit/(?!stencils/).* - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-01-27-02-40-30.gh-issue-115869.QeXSGb.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-27-02-40-30.gh-issue-115869.QeXSGb.rst new file mode 100644 index 00000000000000..0529e4539b4791 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-27-02-40-30.gh-issue-115869.QeXSGb.rst @@ -0,0 +1 @@ +Removes the LLVM build-time requirement for JIT-enabled builds of Python diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets index 416241d9d0df10..2f692621c66bad 100644 --- a/PCbuild/regen.targets +++ b/PCbuild/regen.targets @@ -30,7 +30,7 @@ <_KeywordOutputs Include="$(PySourcePath)Lib\keyword.py" /> <_JITSources Include="$(PySourcePath)Python\executor_cases.c.h;$(GeneratedPyConfigDir)pyconfig.h;$(PySourcePath)Tools\jit\**"/> - <_JITOutputs Include="$(GeneratedPyConfigDir)jit_stencils.h"/> + <_JITOutputs Include="$(GeneratedPyConfigDir)jit_stencils.h;$(PySourcePath)Tools\jit\stencils\**"/> <_CasesSources Include="$(PySourcePath)Python\bytecodes.c;$(PySourcePath)Python\optimizer_bytecodes.c;"/> <_CasesOutputs Include="$(PySourcePath)Python\generated_cases.c.h;$(PySourcePath)Include\opcode_ids.h;$(PySourcePath)Include\internal\pycore_uop_ids.h;$(PySourcePath)Python\opcode_targets.h;$(PySourcePath)Include\internal\pycore_opcode_metadata.h;$(PySourcePath)Include\internal\pycore_uop_metadata.h;$(PySourcePath)Python\optimizer_cases.c.h;$(PySourcePath)Lib\_opcode_metadata.py"/> <_SbomSources Include="$(PySourcePath)PCbuild\get_externals.bat" /> diff --git a/Tools/jit/README.md b/Tools/jit/README.md index 4107265754f6ec..41253e1cf47bff 100644 --- a/Tools/jit/README.md +++ b/Tools/jit/README.md @@ -1,11 +1,25 @@ The JIT Compiler ================ -This version of CPython can be built with an experimental just-in-time compiler[^pep-744]. While most everything you already know about building and using CPython is unchanged, you will probably need to install a compatible version of LLVM first. +This version of CPython can be built with an experimental just-in-time compiler[^pep-744]. + +## Building CPython with the JIT enabled + +For `PCbuild`-based builds, pass the new `--experimental-jit` option to `build.bat`. + +For all other builds, pass the new `--enable-experimental-jit` option to `configure`. + +Otherwise, just configure and build as you normally would. Cross-compiling "just works", since the JIT is built for the host platform. + +The JIT can also be enabled or disabled using the `PYTHON_JIT` environment variable, even on builds where it is enabled or disabled by default. More details about configuring CPython with the JIT and optional values for `--enable-experimental-jit` can be found [here](https://docs.python.org/dev/whatsnew/3.13.html#experimental-jit-compiler). Python 3.11 or newer is required to build the JIT. -## Installing LLVM +## Contributing to the JIT + +While LLVM is not a build-time dependency as stencils are hosted in `Tools/jit/stencils`, you may still want to install LLVM to simplify your local development process (e.g. not have to wait for a CI run to regenerate the stencil for your platform). + +### Installing LLVM The JIT compiler does not require end users to install any third-party dependencies, but part of it must be *built* using LLVM[^why-llvm]. You are *not* required to build the rest of CPython using LLVM, or even the same version of LLVM (in fact, this is uncommon). @@ -13,7 +27,7 @@ LLVM version 19 is required. Both `clang` and `llvm-readobj` need to be installe It's easy to install all of the required tools: -### Linux +#### Linux Install LLVM 19 on Ubuntu/Debian: @@ -29,7 +43,7 @@ Install LLVM 19 on Fedora Linux 40 or newer: sudo dnf install 'clang(major) = 19' 'llvm(major) = 19' ``` -### macOS +#### macOS Install LLVM 19 with [Homebrew](https://brew.sh): @@ -39,7 +53,7 @@ brew install llvm@19 Homebrew won't add any of the tools to your `$PATH`. That's okay; the build script knows how to find them. -### Windows +#### Windows Install LLVM 19 [by searching for it on LLVM's GitHub releases page](https://github.com/llvm/llvm-project/releases?q=19), clicking on "Assets", downloading the appropriate Windows installer for your platform (likely the file ending with `-win64.exe`), and running it. **When installing, be sure to select the option labeled "Add LLVM to the system PATH".** @@ -47,8 +61,13 @@ Alternatively, you can use [chocolatey](https://chocolatey.org): ```sh choco install llvm --version=19.1.0 + ``` +### Applying stencil patches from CI + +Stencil files are validated and updated when changes are made to JIT-related files in CI as part of the `jit.yml` workflow. The final step in the `jit` job diffs the current +stencils in the repo against those generated in CI. If there is a diff for a platform’s stencil, a patch file for the updated stencil is generated and the step will fail. After CI is finished running across all platforms, the patches are aggregated into a single patch file for convenience. You can download this aggregated patch, apply it locally (i.e. `git apply`), and commit the updated stencils back to your branch. Then, the subsequent CI run will pass. ## Building diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index 7eb433e2a5b207..8b748f9846eaae 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -7,7 +7,9 @@ import os import pathlib import re +import shutil import sys +import sysconfig import tempfile import typing @@ -21,10 +23,19 @@ TOOLS_JIT_BUILD = pathlib.Path(__file__).resolve() TOOLS_JIT = TOOLS_JIT_BUILD.parent +TOOLS_JIT_STENCILS = TOOLS_JIT / "stencils" TOOLS = TOOLS_JIT.parent CPYTHON = TOOLS.parent PYTHON_EXECUTOR_CASES_C_H = CPYTHON / "Python" / "executor_cases.c.h" TOOLS_JIT_TEMPLATE_C = TOOLS_JIT / "template.c" +SUPPORTED_TRIPLES = { + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "i686-pc-windows-msvc", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-pc-linux-gnu", +} _S = typing.TypeVar("_S", _schema.COFFSection, _schema.ELFSection, _schema.MachOSection) _R = typing.TypeVar( @@ -43,6 +54,7 @@ class _Target(typing.Generic[_S, _R]): debug: bool = False verbose: bool = False known_symbols: dict[str, int] = dataclasses.field(default_factory=dict) + stencil_name: str = "" def _compute_digest(self, out: pathlib.Path) -> str: hasher = hashlib.sha256() @@ -52,6 +64,8 @@ def _compute_digest(self, out: pathlib.Path) -> str: hasher.update(PYTHON_EXECUTOR_CASES_C_H.read_bytes()) hasher.update((out / "pyconfig.h").read_bytes()) for dirpath, _, filenames in sorted(os.walk(TOOLS_JIT)): + if pathlib.Path(dirpath) == TOOLS_JIT_STENCILS: + continue for filename in filenames: hasher.update(pathlib.Path(dirpath, filename).read_bytes()) return hasher.hexdigest() @@ -176,41 +190,72 @@ async def _build_stencils(self) -> dict[str, _stencils.StencilGroup]: ) return stencil_groups - def build( - self, out: pathlib.Path, *, comment: str = "", force: bool = False - ) -> None: + def build(self, out: pathlib.Path, *, force: bool = False) -> None: """Build jit_stencils.h in the given directory.""" if not self.stable: warning = f"JIT support for {self.triple} is still experimental!" request = "Please report any issues you encounter.".center(len(warning)) outline = "=" * len(warning) print("\n".join(["", outline, warning, request, outline, ""])) - digest = f"// {self._compute_digest(out)}\n" + digest = f"{self._compute_digest(out)}\n" jit_stencils = out / "jit_stencils.h" + jit_stencils_digest = out / "jit_stencils.h.digest" + hosted_stencil = TOOLS_JIT_STENCILS / f"{self.stencil_name}.h" + if ( not force + and jit_stencils_digest.exists() and jit_stencils.exists() - and jit_stencils.read_text().startswith(digest) + and hosted_stencil.exists() ): - return + if jit_stencils_digest.read_text() == digest: + print("Skipping JIT stencil generation") + return + stencil_groups = asyncio.run(self._build_stencils()) jit_stencils_new = out / "jit_stencils.h.new" try: - with jit_stencils_new.open("w") as file: - file.write(digest) - if comment: - file.write(f"// {comment}\n") - file.write("\n") + with jit_stencils_new.open("w", newline="\n") as file: for line in _writer.dump(stencil_groups, self.known_symbols): file.write(f"{line}\n") try: jit_stencils_new.replace(jit_stencils) + + if "windows" in self.triple: + JIT_ARGS = { + "--experimental-jit" + } # TODO: Need to figure out the right flags here for Windows + copy_stencils = True + + else: + # TODO: Need to revisit which flags are actually needed here + # JIT_ARGS = { + # "--enable-experimental-jit", + # "--with-lto", + # "--enable-optimizations", + # } + makefile = out / "Makefile" + match = re.search(r"CONFIG_ARGS\s*=\s*'(.*)'", makefile.read_text()) + assert match is not None + config_args = match.group(1) + if config_args: + # copy_stencils = all( + # arg in JIT_ARGS for arg in config_args.split() + # ) + copy_stencils = not ("--with-debug" in config_args) and not ( + "--disable-gil" in config_args + ) + + copy_stencils = copy_stencils and self.stencil_name in SUPPORTED_TRIPLES + if copy_stencils: + shutil.copy(jit_stencils, hosted_stencil) except FileNotFoundError: # another process probably already moved the file if not jit_stencils.is_file(): raise finally: jit_stencils_new.unlink(missing_ok=True) + jit_stencils_digest.write_text(digest) class _COFF( @@ -497,9 +542,12 @@ def get_target(host: str) -> _COFF | _ELF | _MachO: """Build a _Target for the given host "triple" and options.""" target: _COFF | _ELF | _MachO if re.fullmatch(r"aarch64-apple-darwin.*", host): - target = _MachO(host, alignment=8, prefix="_") + target = _MachO( + host, alignment=8, prefix="_", stencil_name="aarch64-apple-darwin" + ) elif re.fullmatch(r"aarch64-pc-windows-msvc", host): args = ["-fms-runtime-lib=dll"] + # stencil_name is omitted since aarch64-pc-windows-msvc is Tier 3 target = _COFF(host, alignment=8, args=args) elif re.fullmatch(r"aarch64-.*-linux-gnu", host): args = [ @@ -508,22 +556,24 @@ def get_target(host: str) -> _COFF | _ELF | _MachO: # was required to disable them. "-mno-outline-atomics", ] - target = _ELF(host, alignment=8, args=args) + target = _ELF( + host, alignment=8, args=args, stencil_name="aarch64-unknown-linux-gnu" + ) elif re.fullmatch(r"i686-pc-windows-msvc", host): args = [ "-DPy_NO_ENABLE_SHARED", # __attribute__((preserve_none)) is not supported "-Wno-ignored-attributes", ] - target = _COFF(host, args=args, prefix="_") + target = _COFF(host, args=args, prefix="_", stencil_name="i686-pc-windows-msvc") elif re.fullmatch(r"x86_64-apple-darwin.*", host): - target = _MachO(host, prefix="_") + target = _MachO(host, prefix="_", stencil_name="x86_64-apple-darwin") elif re.fullmatch(r"x86_64-pc-windows-msvc", host): args = ["-fms-runtime-lib=dll"] - target = _COFF(host, args=args) + target = _COFF(host, args=args, stencil_name="x86_64-pc-windows-msvc") elif re.fullmatch(r"x86_64-.*-linux-gnu", host): args = ["-fpic"] - target = _ELF(host, args=args) + target = _ELF(host, args=args, stencil_name="x86_64-pc-linux-gnu") else: raise ValueError(host) return target diff --git a/Tools/jit/_writer.py b/Tools/jit/_writer.py index 090b52660f009c..d7cf6cd3b13372 100644 --- a/Tools/jit/_writer.py +++ b/Tools/jit/_writer.py @@ -48,7 +48,7 @@ def _dump_stencil(opname: str, group: _stencils.StencilGroup) -> typing.Iterator yield "{" for part, stencil in [("code", group.code), ("data", group.data)]: for line in stencil.disassembly: - yield f" // {line}" + yield f" // {line}".rstrip() stripped = stencil.body.rstrip(b"\x00") if stripped: yield f" const unsigned char {part}_body[{len(stencil.body)}] = {{" diff --git a/Tools/jit/build.py b/Tools/jit/build.py index a8cb0f67c36363..b37fc7bb7dd914 100644 --- a/Tools/jit/build.py +++ b/Tools/jit/build.py @@ -2,13 +2,10 @@ import argparse import pathlib -import shlex -import sys import _targets if __name__ == "__main__": - comment = f"$ {shlex.join([pathlib.Path(sys.executable).name] + sys.argv)}" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "target", type=_targets.get_target, help="a PEP 11 target triple to compile for" @@ -25,4 +22,4 @@ args = parser.parse_args() args.target.debug = args.debug args.target.verbose = args.verbose - args.target.build(pathlib.Path.cwd(), comment=comment, force=args.force) + args.target.build(pathlib.Path.cwd(), force=args.force) diff --git a/Tools/jit/stencils/aarch64-apple-darwin.h b/Tools/jit/stencils/aarch64-apple-darwin.h new file mode 100644 index 00000000000000..cb0df59a0af9b7 --- /dev/null +++ b/Tools/jit/stencils/aarch64-apple-darwin.h @@ -0,0 +1,21553 @@ +void +emit_shim( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // shim.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 6db63bef stp d15, d14, [sp, #-0xa0]! + // 4: 6d0133ed stp d13, d12, [sp, #0x10] + // 8: 6d022beb stp d11, d10, [sp, #0x20] + // c: 6d0323e9 stp d9, d8, [sp, #0x30] + // 10: a9046ffc stp x28, x27, [sp, #0x40] + // 14: a90567fa stp x26, x25, [sp, #0x50] + // 18: a9065ff8 stp x24, x23, [sp, #0x60] + // 1c: a90757f6 stp x22, x21, [sp, #0x70] + // 20: a9084ff4 stp x20, x19, [sp, #0x80] + // 24: a9097bfd stp x29, x30, [sp, #0x90] + // 28: 910243fd add x29, sp, #0x90 + // 2c: aa0003f4 mov x20, x0 + // 30: aa0103f5 mov x21, x1 + // 34: aa0203f6 mov x22, x2 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: a9497bfd ldp x29, x30, [sp, #0x90] + // 40: a9484ff4 ldp x20, x19, [sp, #0x80] + // 44: a94757f6 ldp x22, x21, [sp, #0x70] + // 48: a9465ff8 ldp x24, x23, [sp, #0x60] + // 4c: a94567fa ldp x26, x25, [sp, #0x50] + // 50: a9446ffc ldp x28, x27, [sp, #0x40] + // 54: 6d4323e9 ldp d9, d8, [sp, #0x30] + // 58: 6d422beb ldp d11, d10, [sp, #0x20] + // 5c: 6d4133ed ldp d13, d12, [sp, #0x10] + // 60: 6cca3bef ldp d15, d14, [sp], #0xa0 + // 64: d65f03c0 ret + const unsigned char code_body[104] = { + 0xef, 0x3b, 0xb6, 0x6d, 0xed, 0x33, 0x01, 0x6d, + 0xeb, 0x2b, 0x02, 0x6d, 0xe9, 0x23, 0x03, 0x6d, + 0xfc, 0x6f, 0x04, 0xa9, 0xfa, 0x67, 0x05, 0xa9, + 0xf8, 0x5f, 0x06, 0xa9, 0xf6, 0x57, 0x07, 0xa9, + 0xf4, 0x4f, 0x08, 0xa9, 0xfd, 0x7b, 0x09, 0xa9, + 0xfd, 0x43, 0x02, 0x91, 0xf4, 0x03, 0x00, 0xaa, + 0xf5, 0x03, 0x01, 0xaa, 0xf6, 0x03, 0x02, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0x49, 0xa9, + 0xf4, 0x4f, 0x48, 0xa9, 0xf6, 0x57, 0x47, 0xa9, + 0xf8, 0x5f, 0x46, 0xa9, 0xfa, 0x67, 0x45, 0xa9, + 0xfc, 0x6f, 0x44, 0xa9, 0xe9, 0x23, 0x43, 0x6d, + 0xeb, 0x2b, 0x42, 0x6d, 0xed, 0x33, 0x41, 0x6d, + 0xef, 0x3b, 0xca, 0x6c, 0xc0, 0x03, 0x5f, 0xd6, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: f9002295 str x21, [x20, #0x40] + // 18: 92403d08 and x8, x8, #0xffff + // 1c: 90000009 adrp x9, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyEval_BinaryOps + // 20: f9400129 ldr x9, [x9] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyEval_BinaryOps + // 24: f8687928 ldr x8, [x9, x8, lsl #3] + // 28: aa1703e0 mov x0, x23 + // 2c: aa1303e1 mov x1, x19 + // 30: d63f0100 blr x8 + // 34: aa0003f5 mov x21, x0 + // 38: f9402298 ldr x24, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b94002e8 ldr w8, [x23] + // 44: 37f800c8 tbnz w8, #0x1f, 0x5c + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b90002e8 str w8, [x23] + // 50: 54000061 b.ne 0x5c + // 54: aa1703e0 mov x0, x23 + // 58: 94000000 bl 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 5c: b9400268 ldr w8, [x19] + // 60: 37f80088 tbnz w8, #0x1f, 0x70 + // 64: 71000508 subs w8, w8, #0x1 + // 68: b9000268 str w8, [x19] + // 6c: 540000c0 b.eq 0x84 + // 70: b4000115 cbz x21, 0x90 + // 74: f81f0315 stur x21, [x24, #-0x10] + // 78: d1002315 sub x21, x24, #0x8 + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: aa1303e0 mov x0, x19 + // 88: 94000000 bl 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 8c: b5ffff55 cbnz x21, 0x74 + // 90: d1004315 sub x21, x24, #0x10 + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 9c: 00 00 00 00 + const unsigned char code_body[160] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x79, 0x68, 0xf8, + 0xe0, 0x03, 0x17, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0xf5, 0x03, 0x00, 0xaa, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x15, 0x01, 0x00, 0xb4, 0x15, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x55, 0xff, 0xff, 0xb5, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_BinaryOps+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_BinaryOps); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x58, 0x0, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x88, 0x0, state); + patch_aarch64_26r(code + 0x98, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_ADD_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8ea1 ldr x1, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e60 ldr x0, [x19, #-0x8]! + // 14: fd400800 ldr d0, [x0, #0x10] + // 18: fd400821 ldr d1, [x1, #0x10] + // 1c: 1e612800 fadd d0, d0, d1 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __PyFloat_FromDouble_ConsumeInputs + // 24: b4000080 cbz x0, 0x34 + // 28: f9000260 str x0, [x19] + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: aa1303f5 mov x21, x19 + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa1, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x60, 0x8e, 0x5f, 0xf8, 0x00, 0x08, 0x40, 0xfd, + 0x21, 0x08, 0x40, 0xfd, 0x00, 0x28, 0x61, 0x1e, + 0x00, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0xb4, + 0x60, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x20, 0x1, state); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_ADD_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8eb9 ldr x25, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e78 ldr x24, [x19, #-0x8]! + // 14: aa1803e0 mov x0, x24 + // 18: aa1903e1 mov x1, x25 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyLong_Add + // 20: aa0003f7 mov x23, x0 + // 24: b9400328 ldr w8, [x25] + // 28: 37f801c8 tbnz w8, #0x1f, 0x60 + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000328 str w8, [x25] + // 34: 54000161 b.ne 0x60 + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 40: f9532128 ldr x8, [x9, #0x2640] + // 44: b40000a8 cbz x8, 0x58 + // 48: f9532522 ldr x2, [x9, #0x2648] + // 4c: aa1903e0 mov x0, x25 + // 50: 52800021 mov w1, #0x1 ; =1 + // 54: d63f0100 blr x8 + // 58: aa1903e0 mov x0, x25 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // 60: b9400308 ldr w8, [x24] + // 64: 37f80088 tbnz w8, #0x1f, 0x74 + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b9000308 str w8, [x24] + // 70: 540000a0 b.eq 0x84 + // 74: b40001f7 cbz x23, 0xb0 + // 78: f9000277 str x23, [x19] + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8c: f9532128 ldr x8, [x9, #0x2640] + // 90: b40000a8 cbz x8, 0xa4 + // 94: f9532522 ldr x2, [x9, #0x2648] + // 98: aa1803e0 mov x0, x24 + // 9c: 52800021 mov w1, #0x1 ; =1 + // a0: d63f0100 blr x8 + // a4: aa1803e0 mov x0, x24 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // ac: b5fffe77 cbnz x23, 0x78 + // b0: aa1303f5 mov x21, x19 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb9, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x78, 0x8e, 0x5f, 0xf8, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xf7, 0x01, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x77, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x3, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x5c, 0x2, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa8, 0x2, state); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_UNICODE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8eb9 ldr x25, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e78 ldr x24, [x19, #-0x8]! + // 14: aa1803e0 mov x0, x24 + // 18: aa1903e1 mov x1, x25 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 _PyUnicode_Concat + // 20: aa0003f7 mov x23, x0 + // 24: b9400328 ldr w8, [x25] + // 28: 37f801c8 tbnz w8, #0x1f, 0x60 + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000328 str w8, [x25] + // 34: 54000161 b.ne 0x60 + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 40: f9532128 ldr x8, [x9, #0x2640] + // 44: b40000a8 cbz x8, 0x58 + // 48: f9532522 ldr x2, [x9, #0x2648] + // 4c: aa1903e0 mov x0, x25 + // 50: 52800021 mov w1, #0x1 ; =1 + // 54: d63f0100 blr x8 + // 58: aa1903e0 mov x0, x25 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __PyUnicode_ExactDealloc + // 60: b9400308 ldr w8, [x24] + // 64: 37f80088 tbnz w8, #0x1f, 0x74 + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b9000308 str w8, [x24] + // 70: 540000a0 b.eq 0x84 + // 74: b40001f7 cbz x23, 0xb0 + // 78: f9000277 str x23, [x19] + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8c: f9532128 ldr x8, [x9, #0x2640] + // 90: b40000a8 cbz x8, 0xa4 + // 94: f9532522 ldr x2, [x9, #0x2648] + // 98: aa1803e0 mov x0, x24 + // 9c: 52800021 mov w1, #0x1 ; =1 + // a0: d63f0100 blr x8 + // a4: aa1803e0 mov x0, x24 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyUnicode_ExactDealloc + // ac: b5fffe77 cbnz x23, 0x78 + // b0: aa1303f5 mov x21, x19 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb9, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x78, 0x8e, 0x5f, 0xf8, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xf7, 0x01, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x77, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x5, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x5c, 0x4, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa8, 0x4, state); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_EXTEND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: 90000008 adrp x8, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 18: f9400908 ldr x8, [x8, #0x10] + // 1c: aa1703e0 mov x0, x23 + // 20: aa1303e1 mov x1, x19 + // 24: d63f0100 blr x8 + // 28: aa0003f5 mov x21, x0 + // 2c: f9402298 ldr x24, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: b94002e8 ldr w8, [x23] + // 38: 37f800c8 tbnz w8, #0x1f, 0x50 + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b90002e8 str w8, [x23] + // 44: 54000061 b.ne 0x50 + // 48: aa1703e0 mov x0, x23 + // 4c: 94000000 bl 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 50: b9400268 ldr w8, [x19] + // 54: 37f80088 tbnz w8, #0x1f, 0x64 + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000268 str w8, [x19] + // 60: 540000a0 b.eq 0x74 + // 64: f81f0315 stur x21, [x24, #-0x10] + // 68: d1002315 sub x21, x24, #0x8 + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: aa1303e0 mov x0, x19 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 7c: f81f0315 stur x21, [x24, #-0x10] + // 80: d1002315 sub x21, x24, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x09, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0xf5, 0x03, 0x00, 0xaa, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x15, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x15, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x4c, 0x0, state); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x78, 0x0, state); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP_INPLACE_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_INPLACE_ADD_UNICODE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f0eb7 ldr x23, [x21, #-0x10]! + // 8: 91014298 add x24, x20, #0x50 + // c: 90000019 adrp x25, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400339 ldr x25, [x25] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: f879db09 ldr x9, [x24, w25, sxtw #3] + // 18: eb17013f cmp x9, x23 + // 1c: 54000060 b.eq 0x28 + // 20: aa0803f5 mov x21, x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 28: d10083ff sub sp, sp, #0x20 + // 2c: a9017bfd stp x29, x30, [sp, #0x10] + // 30: 910043fd add x29, sp, #0x10 + // 34: f85f8113 ldur x19, [x8, #-0x8] + // 38: b94002e8 ldr w8, [x23] + // 3c: 37f801c8 tbnz w8, #0x1f, 0x74 + // 40: 71000508 subs w8, w8, #0x1 + // 44: b90002e8 str w8, [x23] + // 48: 54000161 b.ne 0x74 + // 4c: 90000009 adrp x9, 0x0 + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 50: f9400129 ldr x9, [x9] + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 54: f9532128 ldr x8, [x9, #0x2640] + // 58: b40000a8 cbz x8, 0x6c + // 5c: f9532522 ldr x2, [x9, #0x2648] + // 60: aa1703e0 mov x0, x23 + // 64: 52800021 mov w1, #0x1 ; =1 + // 68: d63f0100 blr x8 + // 6c: aa1703e0 mov x0, x23 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __PyUnicode_ExactDealloc + // 74: f879db08 ldr x8, [x24, w25, sxtw #3] + // 78: f90007e8 str x8, [sp, #0x8] + // 7c: 910023e0 add x0, sp, #0x8 + // 80: aa1303e1 mov x1, x19 + // 84: 94000000 bl 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 _PyUnicode_Append + // 88: f94007e8 ldr x8, [sp, #0x8] + // 8c: f839db08 str x8, [x24, w25, sxtw #3] + // 90: b9400269 ldr w9, [x19] + // 94: 37f801e9 tbnz w9, #0x1f, 0xd0 + // 98: 71000528 subs w8, w9, #0x1 + // 9c: b9000268 str w8, [x19] + // a0: 54000161 b.ne 0xcc + // a4: 90000009 adrp x9, 0x0 + // 00000000000000a4: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // a8: f9400129 ldr x9, [x9] + // 00000000000000a8: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // ac: f9532128 ldr x8, [x9, #0x2640] + // b0: b40000a8 cbz x8, 0xc4 + // b4: f9532522 ldr x2, [x9, #0x2648] + // b8: aa1303e0 mov x0, x19 + // bc: 52800021 mov w1, #0x1 ; =1 + // c0: d63f0100 blr x8 + // c4: aa1303e0 mov x0, x19 + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __PyUnicode_ExactDealloc + // cc: f879db08 ldr x8, [x24, w25, sxtw #3] + // d0: a9417bfd ldp x29, x30, [sp, #0x10] + // d4: 910083ff add sp, sp, #0x20 + // d8: b4000048 cbz x8, 0xe0 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: 14000000 b 0xe0 + // 00000000000000e0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // e4: 00 00 00 00 + const unsigned char code_body[232] = { + 0xe8, 0x03, 0x15, 0xaa, 0xb7, 0x0e, 0x5f, 0xf8, + 0x98, 0x42, 0x01, 0x91, 0x19, 0x00, 0x00, 0x90, + 0x39, 0x03, 0x40, 0xf9, 0x09, 0xdb, 0x79, 0xf8, + 0x3f, 0x01, 0x17, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xf5, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x13, 0x81, 0x5f, 0xf8, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x08, 0xdb, 0x79, 0xf8, + 0xe8, 0x07, 0x00, 0xf9, 0xe0, 0x23, 0x00, 0x91, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x07, 0x40, 0xf9, 0x08, 0xdb, 0x39, 0xf8, + 0x69, 0x02, 0x40, 0xb9, 0xe9, 0x01, 0xf8, 0x37, + 0x28, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x08, 0xdb, 0x79, 0xf8, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x48, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x70, 0x4, state); + patch_aarch64_trampoline(code + 0x84, 0x6, state); + patch_aarch64_33rx(code + 0xa4, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xc8, 0x4, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xe0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_MULTIPLY_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8ea1 ldr x1, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e60 ldr x0, [x19, #-0x8]! + // 14: fd400800 ldr d0, [x0, #0x10] + // 18: fd400821 ldr d1, [x1, #0x10] + // 1c: 1e610800 fmul d0, d0, d1 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __PyFloat_FromDouble_ConsumeInputs + // 24: b4000080 cbz x0, 0x34 + // 28: f9000260 str x0, [x19] + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: aa1303f5 mov x21, x19 + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa1, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x60, 0x8e, 0x5f, 0xf8, 0x00, 0x08, 0x40, 0xfd, + 0x21, 0x08, 0x40, 0xfd, 0x00, 0x08, 0x61, 0x1e, + 0x00, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0xb4, + 0x60, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x20, 0x1, state); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_MULTIPLY_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8eb9 ldr x25, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e78 ldr x24, [x19, #-0x8]! + // 14: aa1803e0 mov x0, x24 + // 18: aa1903e1 mov x1, x25 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyLong_Multiply + // 20: aa0003f7 mov x23, x0 + // 24: b9400328 ldr w8, [x25] + // 28: 37f801c8 tbnz w8, #0x1f, 0x60 + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000328 str w8, [x25] + // 34: 54000161 b.ne 0x60 + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 40: f9532128 ldr x8, [x9, #0x2640] + // 44: b40000a8 cbz x8, 0x58 + // 48: f9532522 ldr x2, [x9, #0x2648] + // 4c: aa1903e0 mov x0, x25 + // 50: 52800021 mov w1, #0x1 ; =1 + // 54: d63f0100 blr x8 + // 58: aa1903e0 mov x0, x25 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // 60: b9400308 ldr w8, [x24] + // 64: 37f80088 tbnz w8, #0x1f, 0x74 + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b9000308 str w8, [x24] + // 70: 540000a0 b.eq 0x84 + // 74: b40001f7 cbz x23, 0xb0 + // 78: f9000277 str x23, [x19] + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8c: f9532128 ldr x8, [x9, #0x2640] + // 90: b40000a8 cbz x8, 0xa4 + // 94: f9532522 ldr x2, [x9, #0x2648] + // 98: aa1803e0 mov x0, x24 + // 9c: 52800021 mov w1, #0x1 ; =1 + // a0: d63f0100 blr x8 + // a4: aa1803e0 mov x0, x24 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // ac: b5fffe77 cbnz x23, 0x78 + // b0: aa1303f5 mov x21, x19 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb9, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x78, 0x8e, 0x5f, 0xf8, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xf7, 0x01, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x77, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x7, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x5c, 0x2, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa8, 0x2, state); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_SUBSCR_CHECK_FUNC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_CHECK_FUNC.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 3942a528 ldrb w8, [x9, #0xa9] + // c: 360802a8 tbz w8, #0x1, 0x60 + // 10: f941c928 ldr x8, [x9, #0x390] + // 14: b4000268 cbz x8, 0x60 + // 18: b9439929 ldr w9, [x9, #0x398] + // 1c: b940910a ldr w10, [x8, #0x90] + // 20: 6b09015f cmp w10, w9 + // 24: 540001e1 b.ne 0x60 + // 28: f9407ac9 ldr x9, [x22, #0xf0] + // 2c: b40001a9 cbz x9, 0x60 + // 30: f940190a ldr x10, [x8, #0x30] + // 34: b9804d4a ldrsw x10, [x10, #0x4c] + // 38: f9407ecb ldr x11, [x22, #0xf8] + // 3c: cb090169 sub x9, x11, x9 + // 40: eb890d5f cmp x10, x9, asr #3 + // 44: 540000ea b.ge 0x60 + // 48: b9400109 ldr w9, [x8] + // 4c: 37f80069 tbnz w9, #0x1f, 0x58 + // 50: 11000529 add w9, w9, #0x1 + // 54: b9000109 str w9, [x8] + // 58: f80086a8 str x8, [x21], #0x8 + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x28, 0xa5, 0x42, 0x39, 0xa8, 0x02, 0x08, 0x36, + 0x28, 0xc9, 0x41, 0xf9, 0x68, 0x02, 0x00, 0xb4, + 0x29, 0x99, 0x43, 0xb9, 0x0a, 0x91, 0x40, 0xb9, + 0x5f, 0x01, 0x09, 0x6b, 0xe1, 0x01, 0x00, 0x54, + 0xc9, 0x7a, 0x40, 0xf9, 0xa9, 0x01, 0x00, 0xb4, + 0x0a, 0x19, 0x40, 0xf9, 0x4a, 0x4d, 0x80, 0xb9, + 0xcb, 0x7e, 0x40, 0xf9, 0x69, 0x01, 0x09, 0xcb, + 0x5f, 0x0d, 0x89, 0xeb, 0xea, 0x00, 0x00, 0x54, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x5c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->jump_target]); +} + +void +emit__BINARY_OP_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f85f02b8 ldur x24, [x21, #-0x10] + // 10: f9400708 ldr x8, [x24, #0x8] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 1c: eb09011f cmp x8, x9 + // 20: 54000080 b.eq 0x30 + // 24: a9417bfd ldp x29, x30, [sp, #0x10] + // 28: 910083ff add sp, sp, #0x20 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 30: f85f82b3 ldur x19, [x21, #-0x8] + // 34: f9002295 str x21, [x20, #0x40] + // 38: 910023e2 add x2, sp, #0x8 + // 3c: aa1803e0 mov x0, x24 + // 40: aa1303e1 mov x1, x19 + // 44: 94000000 bl 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 _PyDict_GetItemRef + // 48: aa0003f7 mov x23, x0 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 350000c0 cbnz w0, 0x6c + // 58: f9002295 str x21, [x20, #0x40] + // 5c: aa1303e0 mov x0, x19 + // 60: 94000000 bl 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __PyErr_SetKeyError + // 64: f9402295 ldr x21, [x20, #0x40] + // 68: f900229f str xzr, [x20, #0x40] + // 6c: b9400308 ldr w8, [x24] + // 70: 37f800c8 tbnz w8, #0x1f, 0x88 + // 74: 71000508 subs w8, w8, #0x1 + // 78: b9000308 str w8, [x24] + // 7c: 54000061 b.ne 0x88 + // 80: aa1803e0 mov x0, x24 + // 84: 94000000 bl 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 88: b9400268 ldr w8, [x19] + // 8c: 37f80088 tbnz w8, #0x1f, 0x9c + // 90: 71000508 subs w8, w8, #0x1 + // 94: b9000268 str w8, [x19] + // 98: 54000120 b.eq 0xbc + // 9c: 710002ff cmp w23, #0x0 + // a0: 5400016d b.le 0xcc + // a4: f94007e8 ldr x8, [sp, #0x8] + // a8: f81f02a8 stur x8, [x21, #-0x10] + // ac: d10022b5 sub x21, x21, #0x8 + // b0: a9417bfd ldp x29, x30, [sp, #0x10] + // b4: 910083ff add sp, sp, #0x20 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // bc: aa1303e0 mov x0, x19 + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c4: 710002ff cmp w23, #0x0 + // c8: 54fffeec b.gt 0xa4 + // cc: d10042b5 sub x21, x21, #0x10 + // d0: a9417bfd ldp x29, x30, [sp, #0x10] + // d4: 910083ff add sp, sp, #0x20 + // d8: 14000000 b 0xd8 + // 00000000000000d8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // dc: 00 00 00 00 + const unsigned char code_body[224] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xb8, 0x02, 0x5f, 0xf8, + 0x08, 0x07, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x80, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe2, 0x23, 0x00, 0x91, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0x35, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x08, 0x03, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x20, 0x01, 0x00, 0x54, 0xff, 0x02, 0x00, 0x71, + 0x6d, 0x01, 0x00, 0x54, 0xe8, 0x07, 0x40, 0xf9, + 0xa8, 0x02, 0x1f, 0xf8, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xff, 0x02, 0x00, 0x71, + 0xec, 0xfe, 0xff, 0x54, 0xb5, 0x42, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x44, 0x9, state); + patch_aarch64_trampoline(code + 0x60, 0x8, state); + patch_aarch64_trampoline(code + 0x84, 0x0, state); + patch_aarch64_26r(code + 0xb8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xc0, 0x0, state); + patch_aarch64_26r(code + 0xd8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_SUBSCR_INIT_CALL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_INIT_CALL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82aa ldur x10, [x21, #-0x8] + // 4: 3cde82a0 ldur q0, [x21, #-0x18] + // 8: f9401948 ldr x8, [x10, #0x30] + // c: f9407ac9 ldr x9, [x22, #0xf0] + // 10: b9804d0b ldrsw x11, [x8, #0x4c] + // 14: 8b0b0d2b add x11, x9, x11, lsl #3 + // 18: f9007acb str x11, [x22, #0xf0] + // 1c: a900a934 stp x20, x10, [x9, #0x8] + // 20: b940010b ldr w11, [x8] + // 24: 37f8006b tbnz w11, #0x1f, 0x30 + // 28: 1100056b add w11, w11, #0x1 + // 2c: b900010b str w11, [x8] + // 30: f9000128 str x8, [x9] + // 34: 3dc00541 ldr q1, [x10, #0x10] + // 38: 3c818121 stur q1, [x9, #0x18] + // 3c: b980490a ldrsw x10, [x8, #0x48] + // 40: 8b0a0d2b add x11, x9, x10, lsl #3 + // 44: 9101416b add x11, x11, #0x50 + // 48: a902fd3f stp xzr, xzr, [x9, #0x28] + // 4c: 9103410c add x12, x8, #0xd0 + // 50: a903ad2c stp x12, x11, [x9, #0x38] + // 54: b900493f str wzr, [x9, #0x48] + // 58: 71000d5f cmp w10, #0x3 + // 5c: 5400010b b.lt 0x7c + // 60: 9101812a add x10, x9, #0x60 + // 64: 5280004b mov w11, #0x2 ; =2 + // 68: f800855f str xzr, [x10], #0x8 + // 6c: 9100056b add x11, x11, #0x1 + // 70: b980490c ldrsw x12, [x8, #0x48] + // 74: eb0c017f cmp x11, x12 + // 78: 54ffff8b b.lt 0x68 + // 7c: d10042a8 sub x8, x21, #0x10 + // 80: 3d801520 str q0, [x9, #0x50] + // 84: 528000ca mov w10, #0x6 ; =6 + // 88: 7900928a strh w10, [x20, #0x48] + // 8c: f81e82a9 stur x9, [x21, #-0x18] + // 90: aa0803f5 mov x21, x8 + // 94: 14000000 b 0x94 + // 0000000000000094: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[152] = { + 0xaa, 0x82, 0x5f, 0xf8, 0xa0, 0x82, 0xde, 0x3c, + 0x48, 0x19, 0x40, 0xf9, 0xc9, 0x7a, 0x40, 0xf9, + 0x0b, 0x4d, 0x80, 0xb9, 0x2b, 0x0d, 0x0b, 0x8b, + 0xcb, 0x7a, 0x00, 0xf9, 0x34, 0xa9, 0x00, 0xa9, + 0x0b, 0x01, 0x40, 0xb9, 0x6b, 0x00, 0xf8, 0x37, + 0x6b, 0x05, 0x00, 0x11, 0x0b, 0x01, 0x00, 0xb9, + 0x28, 0x01, 0x00, 0xf9, 0x41, 0x05, 0xc0, 0x3d, + 0x21, 0x81, 0x81, 0x3c, 0x0a, 0x49, 0x80, 0xb9, + 0x2b, 0x0d, 0x0a, 0x8b, 0x6b, 0x41, 0x01, 0x91, + 0x3f, 0xfd, 0x02, 0xa9, 0x0c, 0x41, 0x03, 0x91, + 0x2c, 0xad, 0x03, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0x5f, 0x0d, 0x00, 0x71, 0x0b, 0x01, 0x00, 0x54, + 0x2a, 0x81, 0x01, 0x91, 0x4b, 0x00, 0x80, 0x52, + 0x5f, 0x85, 0x00, 0xf8, 0x6b, 0x05, 0x00, 0x91, + 0x0c, 0x49, 0x80, 0xb9, 0x7f, 0x01, 0x0c, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0xa8, 0x42, 0x00, 0xd1, + 0x20, 0x15, 0x80, 0x3d, 0xca, 0x00, 0x80, 0x52, + 0x8a, 0x92, 0x00, 0x79, 0xa9, 0x82, 0x1e, 0xf8, + 0xf5, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_LIST_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f8 mov x24, x21 + // 4: a9ff5f13 ldp x19, x23, [x24, #-0x10]! + // 8: f94006e8 ldr x8, [x23, #0x8] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 14: eb09011f cmp x8, x9 + // 18: 54000641 b.ne 0xe0 + // 1c: f9400668 ldr x8, [x19, #0x8] + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 _PyList_Type + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyList_Type + // 28: eb09011f cmp x8, x9 + // 2c: 540005a1 b.ne 0xe0 + // 30: f9400ae8 ldr x8, [x23, #0x10] + // 34: 927df908 and x8, x8, #0xfffffffffffffffb + // 38: f100251f cmp x8, #0x9 + // 3c: 54000522 b.hs 0xe0 + // 40: b9401ae8 ldr w8, [x23, #0x18] + // 44: f9400a69 ldr x9, [x19, #0x10] + // 48: eb08013f cmp x9, x8 + // 4c: 540004ad b.le 0xe0 + // 50: f9400e69 ldr x9, [x19, #0x18] + // 54: f8687939 ldr x25, [x9, x8, lsl #3] + // 58: b9400328 ldr w8, [x25] + // 5c: 37f80068 tbnz w8, #0x1f, 0x68 + // 60: 11000508 add w8, w8, #0x1 + // 64: b9000328 str w8, [x25] + // 68: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 6c: 910003fd mov x29, sp + // 70: b94002e8 ldr w8, [x23] + // 74: 37f801c8 tbnz w8, #0x1f, 0xac + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b90002e8 str w8, [x23] + // 80: 54000161 b.ne 0xac + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8c: f9532128 ldr x8, [x9, #0x2640] + // 90: b40000a8 cbz x8, 0xa4 + // 94: f9532522 ldr x2, [x9, #0x2648] + // 98: aa1703e0 mov x0, x23 + // 9c: 52800021 mov w1, #0x1 ; =1 + // a0: d63f0100 blr x8 + // a4: aa1703e0 mov x0, x23 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // ac: f9002298 str x24, [x20, #0x40] + // b0: b9400268 ldr w8, [x19] + // b4: 37f800c8 tbnz w8, #0x1f, 0xcc + // b8: 71000508 subs w8, w8, #0x1 + // bc: b9000268 str w8, [x19] + // c0: 54000061 b.ne 0xcc + // c4: aa1303e0 mov x0, x19 + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // cc: f9402295 ldr x21, [x20, #0x40] + // d0: f900229f str xzr, [x20, #0x40] + // d4: f80086b9 str x25, [x21], #0x8 + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: 14000000 b 0xe0 + // 00000000000000e0: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // e4: 00 00 00 00 + const unsigned char code_body[232] = { + 0xf8, 0x03, 0x15, 0xaa, 0x13, 0x5f, 0xff, 0xa9, + 0xe8, 0x06, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x41, 0x06, 0x00, 0x54, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xa1, 0x05, 0x00, 0x54, + 0xe8, 0x0a, 0x40, 0xf9, 0x08, 0xf9, 0x7d, 0x92, + 0x1f, 0x25, 0x00, 0xf1, 0x22, 0x05, 0x00, 0x54, + 0xe8, 0x1a, 0x40, 0xb9, 0x69, 0x0a, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xad, 0x04, 0x00, 0x54, + 0x69, 0x0e, 0x40, 0xf9, 0x39, 0x79, 0x68, 0xf8, + 0x28, 0x03, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x28, 0x03, 0x00, 0xb9, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x98, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb9, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + // 8: &PyList_Type+0x0 + // 10: &PyLong_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa8, 0x2, state); + patch_aarch64_trampoline(code + 0xc8, 0x0, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xe0, state->instruction_starts[instruction->jump_target]); +} + +void +emit__BINARY_OP_SUBSCR_STR_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_STR_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f8 mov x24, x21 + // 4: a9ff5f13 ldp x19, x23, [x24, #-0x10]! + // 8: f94006e8 ldr x8, [x23, #0x8] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 14: eb09011f cmp x8, x9 + // 18: 540006a1 b.ne 0xec + // 1c: f9400668 ldr x8, [x19, #0x8] + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 _PyUnicode_Type + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyUnicode_Type + // 28: eb09011f cmp x8, x9 + // 2c: 54000601 b.ne 0xec + // 30: f9400ae8 ldr x8, [x23, #0x10] + // 34: 927df908 and x8, x8, #0xfffffffffffffffb + // 38: f100251f cmp x8, #0x9 + // 3c: 54000582 b.hs 0xec + // 40: b9401ae8 ldr w8, [x23, #0x18] + // 44: f9400a69 ldr x9, [x19, #0x10] + // 48: eb08013f cmp x9, x8 + // 4c: 5400050d b.le 0xec + // 50: 79404669 ldrh w9, [x19, #0x22] + // 54: 1200092a and w10, w9, #0x7 + // 58: 7100095f cmp w10, #0x2 + // 5c: 540000e0 b.eq 0x78 + // 60: 7100055f cmp w10, #0x1 + // 64: 54000121 b.ne 0x88 + // 68: 37180169 tbnz w9, #0x3, 0x94 + // 6c: f9401e69 ldr x9, [x19, #0x38] + // 70: 38686939 ldrb w25, [x9, x8] + // 74: 1400001c b 0xe4 + // 78: 371801c9 tbnz w9, #0x3, 0xb0 + // 7c: f9401e69 ldr x9, [x19, #0x38] + // 80: 78687939 ldrh w25, [x9, x8, lsl #1] + // 84: 14000018 b 0xe4 + // 88: 37180229 tbnz w9, #0x3, 0xcc + // 8c: f9401e69 ldr x9, [x19, #0x38] + // 90: 14000014 b 0xe0 + // 94: 721c013f tst w9, #0x10 + // 98: 52800509 mov w9, #0x28 ; =40 + // 9c: 5280070a mov w10, #0x38 ; =56 + // a0: 9a890149 csel x9, x10, x9, eq + // a4: 8b090269 add x9, x19, x9 + // a8: 38686939 ldrb w25, [x9, x8] + // ac: 1400000e b 0xe4 + // b0: 721c013f tst w9, #0x10 + // b4: 52800509 mov w9, #0x28 ; =40 + // b8: 5280070a mov w10, #0x38 ; =56 + // bc: 9a890149 csel x9, x10, x9, eq + // c0: 8b090269 add x9, x19, x9 + // c4: 78687939 ldrh w25, [x9, x8, lsl #1] + // c8: 14000007 b 0xe4 + // cc: 721c013f tst w9, #0x10 + // d0: 52800509 mov w9, #0x28 ; =40 + // d4: 5280070a mov w10, #0x38 ; =56 + // d8: 9a890149 csel x9, x10, x9, eq + // dc: 8b090269 add x9, x19, x9 + // e0: b8687939 ldr w25, [x9, x8, lsl #2] + // e4: 7102033f cmp w25, #0x80 + // e8: 54000043 b.lo 0xf0 + // ec: 14000000 b 0xec + // 00000000000000ec: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // f0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // f4: 910003fd mov x29, sp + // f8: b94002e8 ldr w8, [x23] + // fc: 90000015 adrp x21, 0x0 + // 00000000000000fc: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 100: f94002b5 ldr x21, [x21] + // 0000000000000100: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 104: 37f80188 tbnz w8, #0x1f, 0x134 + // 108: 71000508 subs w8, w8, #0x1 + // 10c: b90002e8 str w8, [x23] + // 110: 54000121 b.ne 0x134 + // 114: f95322a8 ldr x8, [x21, #0x2640] + // 118: b40000a8 cbz x8, 0x12c + // 11c: f95326a2 ldr x2, [x21, #0x2648] + // 120: aa1703e0 mov x0, x23 + // 124: 52800021 mov w1, #0x1 ; =1 + // 128: d63f0100 blr x8 + // 12c: aa1703e0 mov x0, x23 + // 130: 94000000 bl 0x130 + // 0000000000000130: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // 134: f9002298 str x24, [x20, #0x40] + // 138: b9400268 ldr w8, [x19] + // 13c: 37f800c8 tbnz w8, #0x1f, 0x154 + // 140: 71000508 subs w8, w8, #0x1 + // 144: b9000268 str w8, [x19] + // 148: 54000061 b.ne 0x154 + // 14c: aa1303e0 mov x0, x19 + // 150: 94000000 bl 0x150 + // 0000000000000150: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 154: 52800608 mov w8, #0x30 ; =48 + // 158: 9ba85728 umaddl x8, w25, w8, x21 + // 15c: 91404908 add x8, x8, #0x12, lsl #12 ; =0x12000 + // 160: 9104a108 add x8, x8, #0x128 + // 164: f9402295 ldr x21, [x20, #0x40] + // 168: f900229f str xzr, [x20, #0x40] + // 16c: f80086a8 str x8, [x21], #0x8 + // 170: a8c17bfd ldp x29, x30, [sp], #0x10 + // 174: 14000000 b 0x174 + // 0000000000000174: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[376] = { + 0xf8, 0x03, 0x15, 0xaa, 0x13, 0x5f, 0xff, 0xa9, + 0xe8, 0x06, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0xa1, 0x06, 0x00, 0x54, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x01, 0x06, 0x00, 0x54, + 0xe8, 0x0a, 0x40, 0xf9, 0x08, 0xf9, 0x7d, 0x92, + 0x1f, 0x25, 0x00, 0xf1, 0x82, 0x05, 0x00, 0x54, + 0xe8, 0x1a, 0x40, 0xb9, 0x69, 0x0a, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x0d, 0x05, 0x00, 0x54, + 0x69, 0x46, 0x40, 0x79, 0x2a, 0x09, 0x00, 0x12, + 0x5f, 0x09, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x54, + 0x5f, 0x05, 0x00, 0x71, 0x21, 0x01, 0x00, 0x54, + 0x69, 0x01, 0x18, 0x37, 0x69, 0x1e, 0x40, 0xf9, + 0x39, 0x69, 0x68, 0x38, 0x1c, 0x00, 0x00, 0x14, + 0xc9, 0x01, 0x18, 0x37, 0x69, 0x1e, 0x40, 0xf9, + 0x39, 0x79, 0x68, 0x78, 0x18, 0x00, 0x00, 0x14, + 0x29, 0x02, 0x18, 0x37, 0x69, 0x1e, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0x14, 0x3f, 0x01, 0x1c, 0x72, + 0x09, 0x05, 0x80, 0x52, 0x0a, 0x07, 0x80, 0x52, + 0x49, 0x01, 0x89, 0x9a, 0x69, 0x02, 0x09, 0x8b, + 0x39, 0x69, 0x68, 0x38, 0x0e, 0x00, 0x00, 0x14, + 0x3f, 0x01, 0x1c, 0x72, 0x09, 0x05, 0x80, 0x52, + 0x0a, 0x07, 0x80, 0x52, 0x49, 0x01, 0x89, 0x9a, + 0x69, 0x02, 0x09, 0x8b, 0x39, 0x79, 0x68, 0x78, + 0x07, 0x00, 0x00, 0x14, 0x3f, 0x01, 0x1c, 0x72, + 0x09, 0x05, 0x80, 0x52, 0x0a, 0x07, 0x80, 0x52, + 0x49, 0x01, 0x89, 0x9a, 0x69, 0x02, 0x09, 0x8b, + 0x39, 0x79, 0x68, 0xb8, 0x3f, 0x03, 0x02, 0x71, + 0x43, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe8, 0x02, 0x40, 0xb9, 0x15, 0x00, 0x00, 0x90, + 0xb5, 0x02, 0x40, 0xf9, 0x88, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x21, 0x01, 0x00, 0x54, 0xa8, 0x22, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0xa2, 0x26, 0x53, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x98, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x06, 0x80, 0x52, + 0x28, 0x57, 0xa8, 0x9b, 0x08, 0x49, 0x40, 0x91, + 0x08, 0xa1, 0x04, 0x91, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa8, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + // 8: &PyUnicode_Type+0x0 + // 10: &PyLong_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x10, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xec, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0xfc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x130, 0x2, state); + patch_aarch64_trampoline(code + 0x150, 0x0, state); + patch_aarch64_26r(code + 0x174, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_TUPLE_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_TUPLE_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f8 mov x24, x21 + // 4: a9ff5f13 ldp x19, x23, [x24, #-0x10]! + // 8: f94006e8 ldr x8, [x23, #0x8] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 14: eb09011f cmp x8, x9 + // 18: 54000641 b.ne 0xe0 + // 1c: f9400668 ldr x8, [x19, #0x8] + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 _PyTuple_Type + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyTuple_Type + // 28: eb09011f cmp x8, x9 + // 2c: 540005a1 b.ne 0xe0 + // 30: f9400ae8 ldr x8, [x23, #0x10] + // 34: 927df908 and x8, x8, #0xfffffffffffffffb + // 38: f100251f cmp x8, #0x9 + // 3c: 54000522 b.hs 0xe0 + // 40: b9401ae8 ldr w8, [x23, #0x18] + // 44: f9400a69 ldr x9, [x19, #0x10] + // 48: eb08013f cmp x9, x8 + // 4c: 540004ad b.le 0xe0 + // 50: 8b080e68 add x8, x19, x8, lsl #3 + // 54: f9400d19 ldr x25, [x8, #0x18] + // 58: b9400328 ldr w8, [x25] + // 5c: 37f80068 tbnz w8, #0x1f, 0x68 + // 60: 11000508 add w8, w8, #0x1 + // 64: b9000328 str w8, [x25] + // 68: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 6c: 910003fd mov x29, sp + // 70: b94002e8 ldr w8, [x23] + // 74: 37f801c8 tbnz w8, #0x1f, 0xac + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b90002e8 str w8, [x23] + // 80: 54000161 b.ne 0xac + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8c: f9532128 ldr x8, [x9, #0x2640] + // 90: b40000a8 cbz x8, 0xa4 + // 94: f9532522 ldr x2, [x9, #0x2648] + // 98: aa1703e0 mov x0, x23 + // 9c: 52800021 mov w1, #0x1 ; =1 + // a0: d63f0100 blr x8 + // a4: aa1703e0 mov x0, x23 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // ac: f9002298 str x24, [x20, #0x40] + // b0: b9400268 ldr w8, [x19] + // b4: 37f800c8 tbnz w8, #0x1f, 0xcc + // b8: 71000508 subs w8, w8, #0x1 + // bc: b9000268 str w8, [x19] + // c0: 54000061 b.ne 0xcc + // c4: aa1303e0 mov x0, x19 + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // cc: f9402295 ldr x21, [x20, #0x40] + // d0: f900229f str xzr, [x20, #0x40] + // d4: f80086b9 str x25, [x21], #0x8 + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: 14000000 b 0xe0 + // 00000000000000e0: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // e4: 00 00 00 00 + const unsigned char code_body[232] = { + 0xf8, 0x03, 0x15, 0xaa, 0x13, 0x5f, 0xff, 0xa9, + 0xe8, 0x06, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x41, 0x06, 0x00, 0x54, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xa1, 0x05, 0x00, 0x54, + 0xe8, 0x0a, 0x40, 0xf9, 0x08, 0xf9, 0x7d, 0x92, + 0x1f, 0x25, 0x00, 0xf1, 0x22, 0x05, 0x00, 0x54, + 0xe8, 0x1a, 0x40, 0xb9, 0x69, 0x0a, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xad, 0x04, 0x00, 0x54, + 0x68, 0x0e, 0x08, 0x8b, 0x19, 0x0d, 0x40, 0xf9, + 0x28, 0x03, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x28, 0x03, 0x00, 0xb9, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x98, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb9, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + // 8: &PyTuple_Type+0x0 + // 10: &PyLong_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x10, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa8, 0x2, state); + patch_aarch64_trampoline(code + 0xc8, 0x0, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xe0, state->instruction_starts[instruction->jump_target]); +} + +void +emit__BINARY_OP_SUBTRACT_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8ea1 ldr x1, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e60 ldr x0, [x19, #-0x8]! + // 14: fd400800 ldr d0, [x0, #0x10] + // 18: fd400821 ldr d1, [x1, #0x10] + // 1c: 1e613800 fsub d0, d0, d1 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __PyFloat_FromDouble_ConsumeInputs + // 24: b4000080 cbz x0, 0x34 + // 28: f9000260 str x0, [x19] + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: aa1303f5 mov x21, x19 + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa1, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x60, 0x8e, 0x5f, 0xf8, 0x00, 0x08, 0x40, 0xfd, + 0x21, 0x08, 0x40, 0xfd, 0x00, 0x38, 0x61, 0x1e, + 0x00, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0xb4, + 0x60, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x20, 0x1, state); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_SUBTRACT_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8eb9 ldr x25, [x21, #-0x8]! + // c: aa1503f3 mov x19, x21 + // 10: f85f8e78 ldr x24, [x19, #-0x8]! + // 14: aa1803e0 mov x0, x24 + // 18: aa1903e1 mov x1, x25 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyLong_Subtract + // 20: aa0003f7 mov x23, x0 + // 24: b9400328 ldr w8, [x25] + // 28: 37f801c8 tbnz w8, #0x1f, 0x60 + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000328 str w8, [x25] + // 34: 54000161 b.ne 0x60 + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 40: f9532128 ldr x8, [x9, #0x2640] + // 44: b40000a8 cbz x8, 0x58 + // 48: f9532522 ldr x2, [x9, #0x2648] + // 4c: aa1903e0 mov x0, x25 + // 50: 52800021 mov w1, #0x1 ; =1 + // 54: d63f0100 blr x8 + // 58: aa1903e0 mov x0, x25 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // 60: b9400308 ldr w8, [x24] + // 64: 37f80088 tbnz w8, #0x1f, 0x74 + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b9000308 str w8, [x24] + // 70: 540000a0 b.eq 0x84 + // 74: b40001f7 cbz x23, 0xb0 + // 78: f9000277 str x23, [x19] + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8c: f9532128 ldr x8, [x9, #0x2640] + // 90: b40000a8 cbz x8, 0xa4 + // 94: f9532522 ldr x2, [x9, #0x2648] + // 98: aa1803e0 mov x0, x24 + // 9c: 52800021 mov w1, #0x1 ; =1 + // a0: d63f0100 blr x8 + // a4: aa1803e0 mov x0, x24 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // ac: b5fffe77 cbnz x23, 0x78 + // b0: aa1303f5 mov x21, x19 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb9, 0x8e, 0x5f, 0xf8, 0xf3, 0x03, 0x15, 0xaa, + 0x78, 0x8e, 0x5f, 0xf8, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xf7, 0x01, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x77, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0xa, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x5c, 0x2, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa8, 0x2, state); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_SLICE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f06a0 ldp x0, x1, [x21, #-0x10] + // c: f85e82b3 ldur x19, [x21, #-0x18] + // 10: f9002295 str x21, [x20, #0x40] + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __PyBuildSlice_ConsumeRefs + // 18: f9402288 ldr x8, [x20, #0x40] + // 1c: b40002c0 cbz x0, 0x74 + // 20: aa0003f7 mov x23, x0 + // 24: d1004108 sub x8, x8, #0x10 + // 28: f9002288 str x8, [x20, #0x40] + // 2c: aa1303e0 mov x0, x19 + // 30: aa1703e1 mov x1, x23 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 _PyObject_GetItem + // 38: aa0003f8 mov x24, x0 + // 3c: b94002e8 ldr w8, [x23] + // 40: 37f800c8 tbnz w8, #0x1f, 0x58 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b90002e8 str w8, [x23] + // 4c: 54000061 b.ne 0x58 + // 50: aa1703e0 mov x0, x23 + // 54: 94000000 bl 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 58: f9402288 ldr x8, [x20, #0x40] + // 5c: 91004108 add x8, x8, #0x10 + // 60: d1006108 sub x8, x8, #0x18 + // 64: f9002288 str x8, [x20, #0x40] + // 68: b9400268 ldr w8, [x19] + // 6c: 36f800e8 tbz w8, #0x1f, 0x88 + // 70: 14000009 b 0x94 + // 74: d2800018 mov x24, #0x0 ; =0 + // 78: d1006108 sub x8, x8, #0x18 + // 7c: f9002288 str x8, [x20, #0x40] + // 80: b9400268 ldr w8, [x19] + // 84: 37f80088 tbnz w8, #0x1f, 0x94 + // 88: 71000508 subs w8, w8, #0x1 + // 8c: b9000268 str w8, [x19] + // 90: 540000e0 b.eq 0xac + // 94: f9402295 ldr x21, [x20, #0x40] + // 98: f900229f str xzr, [x20, #0x40] + // 9c: b4000138 cbz x24, 0xc0 + // a0: f80086b8 str x24, [x21], #0x8 + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // ac: aa1303e0 mov x0, x19 + // b0: 94000000 bl 0xb0 + // 00000000000000b0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b4: f9402295 ldr x21, [x20, #0x40] + // b8: f900229f str xzr, [x20, #0x40] + // bc: b5ffff38 cbnz x24, 0xa0 + // c0: a8c17bfd ldp x29, x30, [sp], #0x10 + // c4: 14000000 b 0xc4 + // 00000000000000c4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[200] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x06, 0x7f, 0xa9, 0xb3, 0x82, 0x5e, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0xc0, 0x02, 0x00, 0xb4, + 0xf7, 0x03, 0x00, 0xaa, 0x08, 0x41, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf8, 0x03, 0x00, 0xaa, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x41, 0x00, 0x91, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x36, + 0x09, 0x00, 0x00, 0x14, 0x18, 0x00, 0x80, 0xd2, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x38, 0x01, 0x00, 0xb4, + 0xb8, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x38, 0xff, 0xff, 0xb5, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0xc, state); + patch_aarch64_trampoline(code + 0x34, 0xb, state); + patch_aarch64_trampoline(code + 0x54, 0x0, state); + patch_aarch64_26r(code + 0xa8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xb0, 0x0, state); + patch_aarch64_26r(code + 0xc4, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_LIST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: cb282eb3 sub x19, x21, w8, uxth #3 + // 14: 92403d01 and x1, x8, #0xffff + // 18: aa1303e0 mov x0, x19 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyList_FromStackRefStealOnSuccess + // 20: b4000120 cbz x0, 0x44 + // 24: f9000260 str x0, [x19] + // 28: 90000008 adrp x8, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 30: 52800029 mov w9, #0x1 ; =1 + // 34: cb282128 sub x8, x9, w8, uxth + // 38: 8b080eb5 add x21, x21, x8, lsl #3 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x2e, 0x28, 0xcb, 0x01, 0x3d, 0x40, 0x92, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x20, 0x01, 0x00, 0xb4, 0x60, 0x02, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x52, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x1c, 0xd, state); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_MAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_MAP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: d280001a mov x26, #0x0 ; =0 + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 12003d1b and w27, w8, #0xffff + // 18: 92403d17 and x23, x8, #0xffff + // 1c: cb282758 sub x24, x26, w8, uxth #1 + // 20: cb2832a0 sub x0, x21, w8, uxth #4 + // 24: f9002295 str x21, [x20, #0x40] + // 28: 91002002 add x2, x0, #0x8 + // 2c: 52800041 mov w1, #0x2 ; =2 + // 30: 52800043 mov w3, #0x2 ; =2 + // 34: aa1703e4 mov x4, x23 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __PyDict_FromItems + // 3c: aa0003f3 mov x19, x0 + // 40: f9402299 ldr x25, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: 3400027b cbz w27, 0x94 + // 4c: 52800028 mov w8, #0x1 ; =1 + // 50: aa17051a orr x26, x8, x23, lsl #1 + // 54: d37ceee8 lsl x8, x23, #4 + // 58: 8b180d08 add x8, x8, x24, lsl #3 + // 5c: 8b150108 add x8, x8, x21 + // 60: d1002115 sub x21, x8, #0x8 + // 64: 14000004 b 0x74 + // 68: d100075a sub x26, x26, #0x1 + // 6c: f100075f cmp x26, #0x1 + // 70: 54000129 b.ls 0x94 + // 74: f85f86a0 ldr x0, [x21], #-0x8 + // 78: b9400008 ldr w8, [x0] + // 7c: 37ffff68 tbnz w8, #0x1f, 0x68 + // 80: 71000508 subs w8, w8, #0x1 + // 84: b9000008 str w8, [x0] + // 88: 54ffff01 b.ne 0x68 + // 8c: 94000000 bl 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 90: 17fffff6 b 0x68 + // 94: b4000133 cbz x19, 0xb8 + // 98: 90000008 adrp x8, 0x0 + // 0000000000000098: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 9c: f9400108 ldr x8, [x8] + // 000000000000009c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // a0: f8387b33 str x19, [x25, x24, lsl #3] + // a4: 52800029 mov w9, #0x1 ; =1 + // a8: cb282528 sub x8, x9, w8, uxth #1 + // ac: 8b080f35 add x21, x25, x8, lsl #3 + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b8: 8b180f35 add x21, x25, x24, lsl #3 + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // c4: 00 00 00 00 + const unsigned char code_body[200] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x1a, 0x00, 0x80, 0xd2, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1b, 0x3d, 0x00, 0x12, + 0x17, 0x3d, 0x40, 0x92, 0x58, 0x27, 0x28, 0xcb, + 0xa0, 0x32, 0x28, 0xcb, 0x95, 0x22, 0x00, 0xf9, + 0x02, 0x20, 0x00, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x43, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x7b, 0x02, 0x00, 0x34, 0x28, 0x00, 0x80, 0x52, + 0x1a, 0x05, 0x17, 0xaa, 0xe8, 0xee, 0x7c, 0xd3, + 0x08, 0x0d, 0x18, 0x8b, 0x08, 0x01, 0x15, 0x8b, + 0x15, 0x21, 0x00, 0xd1, 0x04, 0x00, 0x00, 0x14, + 0x5a, 0x07, 0x00, 0xd1, 0x5f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xf6, 0xff, 0xff, 0x17, 0x33, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x33, 0x7b, 0x38, 0xf8, 0x29, 0x00, 0x80, 0x52, + 0x28, 0x25, 0x28, 0xcb, 0x35, 0x0f, 0x08, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x38, 0xe, state); + patch_aarch64_trampoline(code + 0x8c, 0x0, state); + patch_aarch64_33rx(code + 0x98, (uintptr_t)data); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xc0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SET.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: d2800017 mov x23, #0x0 ; =0 + // c: 9000001a adrp x26, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f940035a ldr x26, [x26] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: cb3a22f8 sub x24, x23, w26, uxth + // 18: f9002295 str x21, [x20, #0x40] + // 1c: d2800000 mov x0, #0x0 ; =0 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 _PySet_New + // 24: f9402299 ldr x25, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: b4000740 cbz x0, 0x114 + // 30: aa0003f3 mov x19, x0 + // 34: 90000008 adrp x8, 0x0 + // 0000000000000034: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 3c: 72003d1f tst w8, #0xffff + // 40: 540005c0 b.eq 0xf8 + // 44: 52800017 mov w23, #0x0 ; =0 + // 48: aa1803fb mov x27, x24 + // 4c: 14000003 b 0x58 + // 50: b100077b adds x27, x27, #0x1 + // 54: 54000142 b.hs 0x7c + // 58: 35ffffd7 cbnz w23, 0x50 + // 5c: f9002299 str x25, [x20, #0x40] + // 60: f87b7aa1 ldr x1, [x21, x27, lsl #3] + // 64: aa1303e0 mov x0, x19 + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 _PySet_Add + // 6c: aa0003f7 mov x23, x0 + // 70: f9402299 ldr x25, [x20, #0x40] + // 74: f900229f str xzr, [x20, #0x40] + // 78: 17fffff6 b 0x50 + // 7c: 90000008 adrp x8, 0x0 + // 000000000000007c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 84: 72003d1f tst w8, #0xffff + // 88: 54000200 b.eq 0xc8 + // 8c: 92403d08 and x8, x8, #0xffff + // 90: 9100051b add x27, x8, #0x1 + // 94: d10022b5 sub x21, x21, #0x8 + // 98: 14000004 b 0xa8 + // 9c: d100077b sub x27, x27, #0x1 + // a0: f100077f cmp x27, #0x1 + // a4: 54000129 b.ls 0xc8 + // a8: f85f86a0 ldr x0, [x21], #-0x8 + // ac: b9400008 ldr w8, [x0] + // b0: 37ffff68 tbnz w8, #0x1f, 0x9c + // b4: 71000508 subs w8, w8, #0x1 + // b8: b9000008 str w8, [x0] + // bc: 54ffff01 b.ne 0x9c + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c4: 17fffff6 b 0x9c + // c8: 34000197 cbz w23, 0xf8 + // cc: 8b180f28 add x8, x25, x24, lsl #3 + // d0: f9002288 str x8, [x20, #0x40] + // d4: b9400268 ldr w8, [x19] + // d8: 37f80088 tbnz w8, #0x1f, 0xe8 + // dc: 71000508 subs w8, w8, #0x1 + // e0: b9000268 str w8, [x19] + // e4: 54000440 b.eq 0x16c + // e8: f9402295 ldr x21, [x20, #0x40] + // ec: f900229f str xzr, [x20, #0x40] + // f0: a8c17bfd ldp x29, x30, [sp], #0x10 + // f4: 14000000 b 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // f8: 12003f48 and w8, w26, #0xffff + // fc: f8387b33 str x19, [x25, x24, lsl #3] + // 100: 52800029 mov w9, #0x1 ; =1 + // 104: 4b080128 sub w8, w9, w8 + // 108: 8b28cf35 add x21, x25, w8, sxtw #3 + // 10c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 110: 14000000 b 0x110 + // 0000000000000110: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 114: 90000008 adrp x8, 0x0 + // 0000000000000114: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 118: f9400108 ldr x8, [x8] + // 0000000000000118: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 11c: 72003d1f tst w8, #0xffff + // 120: 54000200 b.eq 0x160 + // 124: 92403d08 and x8, x8, #0xffff + // 128: 91000513 add x19, x8, #0x1 + // 12c: d10022b5 sub x21, x21, #0x8 + // 130: 14000004 b 0x140 + // 134: d1000673 sub x19, x19, #0x1 + // 138: f100067f cmp x19, #0x1 + // 13c: 54000129 b.ls 0x160 + // 140: f85f86a0 ldr x0, [x21], #-0x8 + // 144: b9400008 ldr w8, [x0] + // 148: 37ffff68 tbnz w8, #0x1f, 0x134 + // 14c: 71000508 subs w8, w8, #0x1 + // 150: b9000008 str w8, [x0] + // 154: 54ffff01 b.ne 0x134 + // 158: 94000000 bl 0x158 + // 0000000000000158: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 15c: 17fffff6 b 0x134 + // 160: 8b180f35 add x21, x25, x24, lsl #3 + // 164: a8c17bfd ldp x29, x30, [sp], #0x10 + // 168: 14000000 b 0x168 + // 0000000000000168: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 16c: aa1303e0 mov x0, x19 + // 170: 94000000 bl 0x170 + // 0000000000000170: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 174: f9402295 ldr x21, [x20, #0x40] + // 178: f900229f str xzr, [x20, #0x40] + // 17c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 180: 14000000 b 0x180 + // 0000000000000180: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 184: 00 00 00 00 + const unsigned char code_body[392] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x17, 0x00, 0x80, 0xd2, 0x1a, 0x00, 0x00, 0x90, + 0x5a, 0x03, 0x40, 0xf9, 0xf8, 0x22, 0x3a, 0xcb, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x00, 0x94, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x40, 0x07, 0x00, 0xb4, + 0xf3, 0x03, 0x00, 0xaa, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0xc0, 0x05, 0x00, 0x54, 0x17, 0x00, 0x80, 0x52, + 0xfb, 0x03, 0x18, 0xaa, 0x03, 0x00, 0x00, 0x14, + 0x7b, 0x07, 0x00, 0xb1, 0x42, 0x01, 0x00, 0x54, + 0xd7, 0xff, 0xff, 0x35, 0x99, 0x22, 0x00, 0xf9, + 0xa1, 0x7a, 0x7b, 0xf8, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf7, 0x03, 0x00, 0xaa, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xf6, 0xff, 0xff, 0x17, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x00, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1b, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x7b, 0x07, 0x00, 0xd1, + 0x7f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0x97, 0x01, 0x00, 0x34, 0x28, 0x0f, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x40, 0x04, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x48, 0x3f, 0x00, 0x12, 0x33, 0x7b, 0x38, 0xf8, + 0x29, 0x00, 0x80, 0x52, 0x28, 0x01, 0x08, 0x4b, + 0x35, 0xcf, 0x28, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x00, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x13, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0xd1, + 0x7f, 0x06, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x20, 0x10, state); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x68, 0xf, state); + patch_aarch64_33rx(code + 0x7c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xc0, 0x0, state); + patch_aarch64_26r(code + 0xf4, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x110, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x114, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x158, 0x0, state); + patch_aarch64_26r(code + 0x168, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x170, 0x0, state); + patch_aarch64_26r(code + 0x180, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SLICE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d09 and w9, w8, #0xffff + // c: cb282eb3 sub x19, x21, w8, uxth #3 + // 10: a9400660 ldp x0, x1, [x19] + // 14: 71000d3f cmp w9, #0x3 + // 18: 54000061 b.ne 0x24 + // 1c: f9400a62 ldr x2, [x19, #0x10] + // 20: 14000002 b 0x28 + // 24: d2800002 mov x2, #0x0 ; =0 + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 910003fd mov x29, sp + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 _PySlice_New + // 34: aa0003f7 mov x23, x0 + // 38: 90000008 adrp x8, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 40: 72003d1f tst w8, #0xffff + // 44: 54000200 b.eq 0x84 + // 48: 92403d08 and x8, x8, #0xffff + // 4c: 91000518 add x24, x8, #0x1 + // 50: d10022b9 sub x25, x21, #0x8 + // 54: 14000004 b 0x64 + // 58: d1000718 sub x24, x24, #0x1 + // 5c: f100071f cmp x24, #0x1 + // 60: 54000129 b.ls 0x84 + // 64: f85f8720 ldr x0, [x25], #-0x8 + // 68: b9400008 ldr w8, [x0] + // 6c: 37ffff68 tbnz w8, #0x1f, 0x58 + // 70: 71000508 subs w8, w8, #0x1 + // 74: b9000008 str w8, [x0] + // 78: 54ffff01 b.ne 0x58 + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 80: 17fffff6 b 0x58 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: b4000117 cbz x23, 0xa8 + // 8c: f9000277 str x23, [x19] + // 90: 90000008 adrp x8, 0x0 + // 0000000000000090: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 94: f9400108 ldr x8, [x8] + // 0000000000000094: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 98: 52800029 mov w9, #0x1 ; =1 + // 9c: cb282128 sub x8, x9, w8, uxth + // a0: 8b080eb5 add x21, x21, x8, lsl #3 + // a4: 14000000 b 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // a8: aa1303f5 mov x21, x19 + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[176] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x3d, 0x00, 0x12, 0xb3, 0x2e, 0x28, 0xcb, + 0x60, 0x06, 0x40, 0xa9, 0x3f, 0x0d, 0x00, 0x71, + 0x61, 0x00, 0x00, 0x54, 0x62, 0x0a, 0x40, 0xf9, + 0x02, 0x00, 0x00, 0x14, 0x02, 0x00, 0x80, 0xd2, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x00, 0x02, 0x00, 0x54, + 0x08, 0x3d, 0x40, 0x92, 0x18, 0x05, 0x00, 0x91, + 0xb9, 0x22, 0x00, 0xd1, 0x04, 0x00, 0x00, 0x14, + 0x18, 0x07, 0x00, 0xd1, 0x1f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0x20, 0x87, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xf6, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xc1, 0xa8, + 0x17, 0x01, 0x00, 0xb4, 0x77, 0x02, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x52, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x30, 0x11, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x7c, 0x0, state); + patch_aarch64_33rx(code + 0x90, (uintptr_t)data); + patch_aarch64_26r(code + 0xa4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xac, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_STRING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_STRING.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d19 and w25, w8, #0xffff + // 14: 92403d18 and x24, x8, #0xffff + // 18: cb282eb3 sub x19, x21, w8, uxth #3 + // 1c: 90000008 adrp x8, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 24: 5290fc09 mov w9, #0x87e0 ; =34784 + // 28: 8b090100 add x0, x8, x9 + // 2c: aa1303e1 mov x1, x19 + // 30: aa1803e2 mov x2, x24 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __PyUnicode_JoinArray + // 38: aa0003f7 mov x23, x0 + // 3c: 340001f9 cbz w25, 0x78 + // 40: 91000718 add x24, x24, #0x1 + // 44: d10022b9 sub x25, x21, #0x8 + // 48: 14000004 b 0x58 + // 4c: d1000718 sub x24, x24, #0x1 + // 50: f100071f cmp x24, #0x1 + // 54: 54000129 b.ls 0x78 + // 58: f85f8720 ldr x0, [x25], #-0x8 + // 5c: b9400008 ldr w8, [x0] + // 60: 37ffff68 tbnz w8, #0x1f, 0x4c + // 64: 71000508 subs w8, w8, #0x1 + // 68: b9000008 str w8, [x0] + // 6c: 54ffff01 b.ne 0x4c + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 74: 17fffff6 b 0x4c + // 78: b4000137 cbz x23, 0x9c + // 7c: f9000277 str x23, [x19] + // 80: 90000008 adrp x8, 0x0 + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 88: 52800029 mov w9, #0x1 ; =1 + // 8c: cb282128 sub x8, x9, w8, uxth + // 90: 8b080eb5 add x21, x21, x8, lsl #3 + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 9c: aa1303f5 mov x21, x19 + // a0: a8c17bfd ldp x29, x30, [sp], #0x10 + // a4: 14000000 b 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x19, 0x3d, 0x00, 0x12, 0x18, 0x3d, 0x40, 0x92, + 0xb3, 0x2e, 0x28, 0xcb, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0xfc, 0x90, 0x52, + 0x00, 0x01, 0x09, 0x8b, 0xe1, 0x03, 0x13, 0xaa, + 0xe2, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0xf9, 0x01, 0x00, 0x34, + 0x18, 0x07, 0x00, 0x91, 0xb9, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x18, 0x07, 0x00, 0xd1, + 0x1f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0x20, 0x87, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0x37, 0x01, 0x00, 0xb4, 0x77, 0x02, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x52, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x34, 0x12, state); + patch_aarch64_trampoline(code + 0x70, 0x0, state); + patch_aarch64_33rx(code + 0x80, (uintptr_t)data); + patch_aarch64_26r(code + 0x98, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xa4, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: cb282eb3 sub x19, x21, w8, uxth #3 + // 14: 92403d01 and x1, x8, #0xffff + // 18: aa1303e0 mov x0, x19 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyTuple_FromStackRefStealOnSuccess + // 20: b4000120 cbz x0, 0x44 + // 24: f9000260 str x0, [x19] + // 28: 90000008 adrp x8, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 30: 52800029 mov w9, #0x1 ; =1 + // 34: cb282128 sub x8, x9, w8, uxth + // 38: 8b080eb5 add x21, x21, x8, lsl #3 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x2e, 0x28, 0xcb, 0x01, 0x3d, 0x40, 0x92, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x20, 0x01, 0x00, 0xb4, 0x60, 0x02, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x52, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x1c, 0x13, state); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_CLASS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 92800028 mov x8, #-0x2 ; =-2 + // 14: cb292117 sub x23, x8, w9, uxth + // 18: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 1c: f9400408 ldr x8, [x0, #0x8] + // 20: 3942ad08 ldrb w8, [x8, #0xab] + // 24: 363806a8 tbz w8, #0x7, 0xf8 + // 28: f940c808 ldr x8, [x0, #0x190] + // 2c: b4000668 cbz x8, 0xf8 + // 30: 12003d2a and w10, w9, #0xffff + // 34: 2a2a03eb mvn w11, w10 + // 38: 93407d78 sxtw x24, w11 + // 3c: f8787aab ldr x11, [x21, x24, lsl #3] + // 40: cb292ea9 sub x9, x21, w9, uxth #3 + // 44: 928000ec mov x12, #-0x8 ; =-8 + // 48: f100017f cmp x11, #0x0 + // 4c: 9a9f118b csel x11, x12, xzr, ne + // 50: 1a8a0542 cinc w2, w10, ne + // 54: f9002295 str x21, [x20, #0x40] + // 58: 8b0b0121 add x1, x9, x11 + // 5c: d2800003 mov x3, #0x0 ; =0 + // 60: d63f0100 blr x8 + // 64: aa0003f3 mov x19, x0 + // 68: f9402299 ldr x25, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 74: b9400008 ldr w8, [x0] + // 78: 37f800a8 tbnz w8, #0x1f, 0x8c + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000008 str w8, [x0] + // 84: 54000041 b.ne 0x8c + // 88: 94000000 bl 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 8c: f8787aa0 ldr x0, [x21, x24, lsl #3] + // 90: b40000e0 cbz x0, 0xac + // 94: b9400008 ldr w8, [x0] + // 98: 37f800a8 tbnz w8, #0x1f, 0xac + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000008 str w8, [x0] + // a4: 54000041 b.ne 0xac + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // ac: 90000008 adrp x8, 0x0 + // 00000000000000ac: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // b0: f9400108 ldr x8, [x8] + // 00000000000000b0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // b4: 72003d1f tst w8, #0xffff + // b8: 54000240 b.eq 0x100 + // bc: 92403d08 and x8, x8, #0xffff + // c0: 9100051a add x26, x8, #0x1 + // c4: d10022b5 sub x21, x21, #0x8 + // c8: 14000004 b 0xd8 + // cc: d100075a sub x26, x26, #0x1 + // d0: f100075f cmp x26, #0x1 + // d4: 54000169 b.ls 0x100 + // d8: f85f86a0 ldr x0, [x21], #-0x8 + // dc: b9400008 ldr w8, [x0] + // e0: 37ffff68 tbnz w8, #0x1f, 0xcc + // e4: 71000508 subs w8, w8, #0x1 + // e8: b9000008 str w8, [x0] + // ec: 54ffff01 b.ne 0xcc + // f0: 94000000 bl 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // f4: 17fffff6 b 0xcc + // f8: a8c17bfd ldp x29, x30, [sp], #0x10 + // fc: 14000000 b 0xfc + // 00000000000000fc: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 100: b40000b3 cbz x19, 0x114 + // 104: f8377b33 str x19, [x25, x23, lsl #3] + // 108: 8b180f35 add x21, x25, x24, lsl #3 + // 10c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 110: 14000000 b 0x110 + // 0000000000000110: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 114: 8b170f35 add x21, x25, x23, lsl #3 + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c + // 000000000000011c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[288] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x00, 0x80, 0x92, 0x17, 0x21, 0x29, 0xcb, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0xa8, 0x06, 0x38, 0x36, + 0x08, 0xc8, 0x40, 0xf9, 0x68, 0x06, 0x00, 0xb4, + 0x2a, 0x3d, 0x00, 0x12, 0xeb, 0x03, 0x2a, 0x2a, + 0x78, 0x7d, 0x40, 0x93, 0xab, 0x7a, 0x78, 0xf8, + 0xa9, 0x2e, 0x29, 0xcb, 0xec, 0x00, 0x80, 0x92, + 0x7f, 0x01, 0x00, 0xf1, 0x8b, 0x11, 0x9f, 0x9a, + 0x42, 0x05, 0x8a, 0x1a, 0x95, 0x22, 0x00, 0xf9, + 0x21, 0x01, 0x0b, 0x8b, 0x03, 0x00, 0x80, 0xd2, + 0x00, 0x01, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0xaa, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x78, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1a, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x69, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xb3, 0x00, 0x00, 0xb4, 0x33, 0x7b, 0x37, 0xf8, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x88, 0x0, state); + patch_aarch64_trampoline(code + 0xa8, 0x0, state); + patch_aarch64_33rx(code + 0xac, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xf0, 0x0, state); + patch_aarch64_26r(code + 0xfc, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x110, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x11c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d0c and w12, w8, #0xffff + // 14: 2a2c03eb mvn w11, w12 + // 18: 92800029 mov x9, #-0x2 ; =-2 + // 1c: cb282137 sub x23, x9, w8, uxth + // 20: f8777aa9 ldr x9, [x21, x23, lsl #3] + // 24: f86bdaaa ldr x10, [x21, w11, sxtw #3] + // 28: 928000ed mov x13, #-0x8 ; =-8 + // 2c: f100015f cmp x10, #0x0 + // 30: 9a9f11aa csel x10, x13, xzr, ne + // 34: 1a8c0582 cinc w2, w12, ne + // 38: f940052c ldr x12, [x9, #0x8] + // 3c: 9000000d adrp x13, 0x0 + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyCFunction_Type + // 40: f94001ad ldr x13, [x13] + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyCFunction_Type + // 44: eb0d019f cmp x12, x13 + // 48: 54000621 b.ne 0x10c + // 4c: f940092c ldr x12, [x9, #0x10] + // 50: b940118d ldr w13, [x12, #0x10] + // 54: 710201bf cmp w13, #0x80 + // 58: 540005a1 b.ne 0x10c + // 5c: 93407d78 sxtw x24, w11 + // 60: f940058b ldr x11, [x12, #0x8] + // 64: f9002295 str x21, [x20, #0x40] + // 68: f9400d20 ldr x0, [x9, #0x18] + // 6c: cb282ea8 sub x8, x21, w8, uxth #3 + // 70: 8b0a0101 add x1, x8, x10 + // 74: d63f0160 blr x11 + // 78: aa0003f3 mov x19, x0 + // 7c: f9402299 ldr x25, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 88: b9400008 ldr w8, [x0] + // 8c: 37f800a8 tbnz w8, #0x1f, 0xa0 + // 90: 71000508 subs w8, w8, #0x1 + // 94: b9000008 str w8, [x0] + // 98: 54000041 b.ne 0xa0 + // 9c: 94000000 bl 0x9c + // 000000000000009c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a0: f8787aa0 ldr x0, [x21, x24, lsl #3] + // a4: b40000e0 cbz x0, 0xc0 + // a8: b9400008 ldr w8, [x0] + // ac: 37f800a8 tbnz w8, #0x1f, 0xc0 + // b0: 71000508 subs w8, w8, #0x1 + // b4: b9000008 str w8, [x0] + // b8: 54000041 b.ne 0xc0 + // bc: 94000000 bl 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c0: 90000008 adrp x8, 0x0 + // 00000000000000c0: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c4: f9400108 ldr x8, [x8] + // 00000000000000c4: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // c8: 72003d1f tst w8, #0xffff + // cc: 54000240 b.eq 0x114 + // d0: 92403d08 and x8, x8, #0xffff + // d4: 9100051a add x26, x8, #0x1 + // d8: d10022b5 sub x21, x21, #0x8 + // dc: 14000004 b 0xec + // e0: d100075a sub x26, x26, #0x1 + // e4: f100075f cmp x26, #0x1 + // e8: 54000169 b.ls 0x114 + // ec: f85f86a0 ldr x0, [x21], #-0x8 + // f0: b9400008 ldr w8, [x0] + // f4: 37ffff68 tbnz w8, #0x1f, 0xe0 + // f8: 71000508 subs w8, w8, #0x1 + // fc: b9000008 str w8, [x0] + // 100: 54ffff01 b.ne 0xe0 + // 104: 94000000 bl 0x104 + // 0000000000000104: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 108: 17fffff6 b 0xe0 + // 10c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 110: 14000000 b 0x110 + // 0000000000000110: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 114: b40000b3 cbz x19, 0x128 + // 118: f8377b33 str x19, [x25, x23, lsl #3] + // 11c: 8b180f35 add x21, x25, x24, lsl #3 + // 120: a8c17bfd ldp x29, x30, [sp], #0x10 + // 124: 14000000 b 0x124 + // 0000000000000124: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 128: 8b170f35 add x21, x25, x23, lsl #3 + // 12c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 130: 14000000 b 0x130 + // 0000000000000130: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 134: 00 00 00 00 + const unsigned char code_body[312] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0c, 0x3d, 0x00, 0x12, 0xeb, 0x03, 0x2c, 0x2a, + 0x29, 0x00, 0x80, 0x92, 0x37, 0x21, 0x28, 0xcb, + 0xa9, 0x7a, 0x77, 0xf8, 0xaa, 0xda, 0x6b, 0xf8, + 0xed, 0x00, 0x80, 0x92, 0x5f, 0x01, 0x00, 0xf1, + 0xaa, 0x11, 0x9f, 0x9a, 0x82, 0x05, 0x8c, 0x1a, + 0x2c, 0x05, 0x40, 0xf9, 0x0d, 0x00, 0x00, 0x90, + 0xad, 0x01, 0x40, 0xf9, 0x9f, 0x01, 0x0d, 0xeb, + 0x21, 0x06, 0x00, 0x54, 0x2c, 0x09, 0x40, 0xf9, + 0x8d, 0x11, 0x40, 0xb9, 0xbf, 0x01, 0x02, 0x71, + 0xa1, 0x05, 0x00, 0x54, 0x78, 0x7d, 0x40, 0x93, + 0x8b, 0x05, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x20, 0x0d, 0x40, 0xf9, 0xa8, 0x2e, 0x28, 0xcb, + 0x01, 0x01, 0x0a, 0x8b, 0x60, 0x01, 0x3f, 0xd6, + 0xf3, 0x03, 0x00, 0xaa, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x7a, 0x77, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xa0, 0x7a, 0x78, 0xf8, 0xe0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x40, 0x02, 0x00, 0x54, + 0x08, 0x3d, 0x40, 0x92, 0x1a, 0x05, 0x00, 0x91, + 0xb5, 0x22, 0x00, 0xd1, 0x04, 0x00, 0x00, 0x14, + 0x5a, 0x07, 0x00, 0xd1, 0x5f, 0x07, 0x00, 0xf1, + 0x69, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xf6, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x00, 0x00, 0xb4, + 0x33, 0x7b, 0x37, 0xf8, 0x35, 0x0f, 0x18, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x9c, 0x0, state); + patch_aarch64_trampoline(code + 0xbc, 0x0, state); + patch_aarch64_33rx(code + 0xc0, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x104, 0x0, state); + patch_aarch64_26r(code + 0x110, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x124, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x130, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST_WITH_KEYWORDS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d0c and w12, w8, #0xffff + // 14: 2a2c03eb mvn w11, w12 + // 18: 92800029 mov x9, #-0x2 ; =-2 + // 1c: cb282137 sub x23, x9, w8, uxth + // 20: f8777aa9 ldr x9, [x21, x23, lsl #3] + // 24: f86bdaaa ldr x10, [x21, w11, sxtw #3] + // 28: 928000ed mov x13, #-0x8 ; =-8 + // 2c: f100015f cmp x10, #0x0 + // 30: 9a9f11aa csel x10, x13, xzr, ne + // 34: 1a8c0582 cinc w2, w12, ne + // 38: f940052c ldr x12, [x9, #0x8] + // 3c: 9000000d adrp x13, 0x0 + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyCFunction_Type + // 40: f94001ad ldr x13, [x13] + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyCFunction_Type + // 44: eb0d019f cmp x12, x13 + // 48: 54000641 b.ne 0x110 + // 4c: f940092c ldr x12, [x9, #0x10] + // 50: b940118d ldr w13, [x12, #0x10] + // 54: 710209bf cmp w13, #0x82 + // 58: 540005c1 b.ne 0x110 + // 5c: 93407d78 sxtw x24, w11 + // 60: f940058b ldr x11, [x12, #0x8] + // 64: f9002295 str x21, [x20, #0x40] + // 68: f9400d20 ldr x0, [x9, #0x18] + // 6c: cb282ea8 sub x8, x21, w8, uxth #3 + // 70: 8b0a0101 add x1, x8, x10 + // 74: d2800003 mov x3, #0x0 ; =0 + // 78: d63f0160 blr x11 + // 7c: aa0003f3 mov x19, x0 + // 80: f9402299 ldr x25, [x20, #0x40] + // 84: f900229f str xzr, [x20, #0x40] + // 88: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 8c: b9400008 ldr w8, [x0] + // 90: 37f800a8 tbnz w8, #0x1f, 0xa4 + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000008 str w8, [x0] + // 9c: 54000041 b.ne 0xa4 + // a0: 94000000 bl 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a4: f8787aa0 ldr x0, [x21, x24, lsl #3] + // a8: b40000e0 cbz x0, 0xc4 + // ac: b9400008 ldr w8, [x0] + // b0: 37f800a8 tbnz w8, #0x1f, 0xc4 + // b4: 71000508 subs w8, w8, #0x1 + // b8: b9000008 str w8, [x0] + // bc: 54000041 b.ne 0xc4 + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c4: 90000008 adrp x8, 0x0 + // 00000000000000c4: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c8: f9400108 ldr x8, [x8] + // 00000000000000c8: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // cc: 72003d1f tst w8, #0xffff + // d0: 54000240 b.eq 0x118 + // d4: 92403d08 and x8, x8, #0xffff + // d8: 9100051a add x26, x8, #0x1 + // dc: d10022b5 sub x21, x21, #0x8 + // e0: 14000004 b 0xf0 + // e4: d100075a sub x26, x26, #0x1 + // e8: f100075f cmp x26, #0x1 + // ec: 54000169 b.ls 0x118 + // f0: f85f86a0 ldr x0, [x21], #-0x8 + // f4: b9400008 ldr w8, [x0] + // f8: 37ffff68 tbnz w8, #0x1f, 0xe4 + // fc: 71000508 subs w8, w8, #0x1 + // 100: b9000008 str w8, [x0] + // 104: 54ffff01 b.ne 0xe4 + // 108: 94000000 bl 0x108 + // 0000000000000108: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 10c: 17fffff6 b 0xe4 + // 110: a8c17bfd ldp x29, x30, [sp], #0x10 + // 114: 14000000 b 0x114 + // 0000000000000114: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 118: b40000b3 cbz x19, 0x12c + // 11c: f8377b33 str x19, [x25, x23, lsl #3] + // 120: 8b180f35 add x21, x25, x24, lsl #3 + // 124: a8c17bfd ldp x29, x30, [sp], #0x10 + // 128: 14000000 b 0x128 + // 0000000000000128: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 12c: 8b170f35 add x21, x25, x23, lsl #3 + // 130: a8c17bfd ldp x29, x30, [sp], #0x10 + // 134: 14000000 b 0x134 + // 0000000000000134: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[312] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0c, 0x3d, 0x00, 0x12, 0xeb, 0x03, 0x2c, 0x2a, + 0x29, 0x00, 0x80, 0x92, 0x37, 0x21, 0x28, 0xcb, + 0xa9, 0x7a, 0x77, 0xf8, 0xaa, 0xda, 0x6b, 0xf8, + 0xed, 0x00, 0x80, 0x92, 0x5f, 0x01, 0x00, 0xf1, + 0xaa, 0x11, 0x9f, 0x9a, 0x82, 0x05, 0x8c, 0x1a, + 0x2c, 0x05, 0x40, 0xf9, 0x0d, 0x00, 0x00, 0x90, + 0xad, 0x01, 0x40, 0xf9, 0x9f, 0x01, 0x0d, 0xeb, + 0x41, 0x06, 0x00, 0x54, 0x2c, 0x09, 0x40, 0xf9, + 0x8d, 0x11, 0x40, 0xb9, 0xbf, 0x09, 0x02, 0x71, + 0xc1, 0x05, 0x00, 0x54, 0x78, 0x7d, 0x40, 0x93, + 0x8b, 0x05, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x20, 0x0d, 0x40, 0xf9, 0xa8, 0x2e, 0x28, 0xcb, + 0x01, 0x01, 0x0a, 0x8b, 0x03, 0x00, 0x80, 0xd2, + 0x60, 0x01, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0xaa, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x78, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1a, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x69, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xb3, 0x00, 0x00, 0xb4, 0x33, 0x7b, 0x37, 0xf8, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0xa0, 0x0, state); + patch_aarch64_trampoline(code + 0xc0, 0x0, state); + patch_aarch64_33rx(code + 0xc4, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x108, 0x0, state); + patch_aarch64_26r(code + 0x114, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x128, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x134, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_O.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d0a and w10, w8, #0xffff + // 14: 2a2a03e9 mvn w9, w10 + // 18: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 1c: 928000eb mov x11, #-0x8 ; =-8 + // 20: f100013f cmp x9, #0x0 + // 24: 9a9f1169 csel x9, x11, xzr, ne + // 28: 1a8a054a cinc w10, w10, ne + // 2c: 7100055f cmp w10, #0x1 + // 30: 54000681 b.ne 0x100 + // 34: 9280002a mov x10, #-0x2 ; =-2 + // 38: cb282158 sub x24, x10, w8, uxth + // 3c: f8787aaa ldr x10, [x21, x24, lsl #3] + // 40: f940054b ldr x11, [x10, #0x8] + // 44: 9000000c adrp x12, 0x0 + // 0000000000000044: ARM64_RELOC_GOT_LOAD_PAGE21 _PyCFunction_Type + // 48: f940018c ldr x12, [x12] + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyCFunction_Type + // 4c: eb0c017f cmp x11, x12 + // 50: 54000581 b.ne 0x100 + // 54: f940094b ldr x11, [x10, #0x10] + // 58: b940116c ldr w12, [x11, #0x10] + // 5c: 7100219f cmp w12, #0x8 + // 60: 54000501 b.ne 0x100 + // 64: b94036cc ldr w12, [x22, #0x34] + // 68: 7100019f cmp w12, #0x0 + // 6c: 540004ad b.le 0x100 + // 70: cb282ea8 sub x8, x21, w8, uxth #3 + // 74: f940056b ldr x11, [x11, #0x8] + // 78: f8696917 ldr x23, [x8, x9] + // 7c: 51000588 sub w8, w12, #0x1 + // 80: b90036c8 str w8, [x22, #0x34] + // 84: f9002295 str x21, [x20, #0x40] + // 88: f9400d40 ldr x0, [x10, #0x18] + // 8c: aa1703e1 mov x1, x23 + // 90: d63f0160 blr x11 + // 94: aa0003f3 mov x19, x0 + // 98: b94036c8 ldr w8, [x22, #0x34] + // 9c: 11000508 add w8, w8, #0x1 + // a0: b90036c8 str w8, [x22, #0x34] + // a4: b94002e8 ldr w8, [x23] + // a8: 37f800c8 tbnz w8, #0x1f, 0xc0 + // ac: 71000508 subs w8, w8, #0x1 + // b0: b90002e8 str w8, [x23] + // b4: 54000061 b.ne 0xc0 + // b8: aa1703e0 mov x0, x23 + // bc: 94000000 bl 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c0: f9402288 ldr x8, [x20, #0x40] + // c4: 8b180d08 add x8, x8, x24, lsl #3 + // c8: f9002288 str x8, [x20, #0x40] + // cc: f8787aa0 ldr x0, [x21, x24, lsl #3] + // d0: b9400008 ldr w8, [x0] + // d4: 37f800a8 tbnz w8, #0x1f, 0xe8 + // d8: 71000508 subs w8, w8, #0x1 + // dc: b9000008 str w8, [x0] + // e0: 54000041 b.ne 0xe8 + // e4: 94000000 bl 0xe4 + // 00000000000000e4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e8: f9402295 ldr x21, [x20, #0x40] + // ec: f900229f str xzr, [x20, #0x40] + // f0: b40000d3 cbz x19, 0x108 + // f4: f80086b3 str x19, [x21], #0x8 + // f8: a8c17bfd ldp x29, x30, [sp], #0x10 + // fc: 14000000 b 0xfc + // 00000000000000fc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 100: a8c17bfd ldp x29, x30, [sp], #0x10 + // 104: 14000000 b 0x104 + // 0000000000000104: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 108: a8c17bfd ldp x29, x30, [sp], #0x10 + // 10c: 14000000 b 0x10c + // 000000000000010c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[272] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0a, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x2a, 0x2a, + 0xa9, 0xda, 0x69, 0xf8, 0xeb, 0x00, 0x80, 0x92, + 0x3f, 0x01, 0x00, 0xf1, 0x69, 0x11, 0x9f, 0x9a, + 0x4a, 0x05, 0x8a, 0x1a, 0x5f, 0x05, 0x00, 0x71, + 0x81, 0x06, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x58, 0x21, 0x28, 0xcb, 0xaa, 0x7a, 0x78, 0xf8, + 0x4b, 0x05, 0x40, 0xf9, 0x0c, 0x00, 0x00, 0x90, + 0x8c, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0c, 0xeb, + 0x81, 0x05, 0x00, 0x54, 0x4b, 0x09, 0x40, 0xf9, + 0x6c, 0x11, 0x40, 0xb9, 0x9f, 0x21, 0x00, 0x71, + 0x01, 0x05, 0x00, 0x54, 0xcc, 0x36, 0x40, 0xb9, + 0x9f, 0x01, 0x00, 0x71, 0xad, 0x04, 0x00, 0x54, + 0xa8, 0x2e, 0x28, 0xcb, 0x6b, 0x05, 0x40, 0xf9, + 0x17, 0x69, 0x69, 0xf8, 0x88, 0x05, 0x00, 0x51, + 0xc8, 0x36, 0x00, 0xb9, 0x95, 0x22, 0x00, 0xf9, + 0x40, 0x0d, 0x40, 0xf9, 0xe1, 0x03, 0x17, 0xaa, + 0x60, 0x01, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0xaa, + 0xc8, 0x36, 0x40, 0xb9, 0x08, 0x05, 0x00, 0x11, + 0xc8, 0x36, 0x00, 0xb9, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x0d, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0xa0, 0x7a, 0x78, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xd3, 0x00, 0x00, 0xb4, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyCFunction_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x44, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xbc, 0x0, state); + patch_aarch64_trampoline(code + 0xe4, 0x0, state); + patch_aarch64_26r(code + 0xfc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x104, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x10c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_INTRINSIC_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: 90000008 adrp x8, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 18: 92403d08 and x8, x8, #0xffff + // 1c: d37ced08 lsl x8, x8, #4 + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __PyIntrinsics_UnaryFunctions + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyIntrinsics_UnaryFunctions + // 28: f8686928 ldr x8, [x9, x8] + // 2c: aa1603e0 mov x0, x22 + // 30: aa1303e1 mov x1, x19 + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a0 b.eq 0x64 + // 54: b4000120 cbz x0, 0x78 + // 58: f81f82a0 stur x0, [x21, #-0x8] + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: aa0003f7 mov x23, x0 + // 68: aa1303e0 mov x0, x19 + // 6c: 94000000 bl 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 70: aa1703e0 mov x0, x23 + // 74: b5ffff37 cbnz x23, 0x58 + // 78: d10022b5 sub x21, x21, #0x8 + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 84: 00 00 00 00 + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x08, 0xed, 0x7c, 0xd3, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x69, 0x68, 0xf8, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x20, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0x37, 0xff, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyIntrinsics_UnaryFunctions+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyIntrinsics_UnaryFunctions); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x6c, 0x0, state); + patch_aarch64_26r(code + 0x80, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_INTRINSIC_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_2.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: 90000008 adrp x8, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 18: 92403d08 and x8, x8, #0xffff + // 1c: d37ced08 lsl x8, x8, #4 + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __PyIntrinsics_BinaryFunctions + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyIntrinsics_BinaryFunctions + // 28: f8686928 ldr x8, [x9, x8] + // 2c: aa1603e0 mov x0, x22 + // 30: aa1703e1 mov x1, x23 + // 34: aa1303e2 mov x2, x19 + // 38: d63f0100 blr x8 + // 3c: aa0003f5 mov x21, x0 + // 40: f9402298 ldr x24, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: b94002e8 ldr w8, [x23] + // 4c: 37f800c8 tbnz w8, #0x1f, 0x64 + // 50: 71000508 subs w8, w8, #0x1 + // 54: b90002e8 str w8, [x23] + // 58: 54000061 b.ne 0x64 + // 5c: aa1703e0 mov x0, x23 + // 60: 94000000 bl 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 64: b9400268 ldr w8, [x19] + // 68: 37f80088 tbnz w8, #0x1f, 0x78 + // 6c: 71000508 subs w8, w8, #0x1 + // 70: b9000268 str w8, [x19] + // 74: 540000c0 b.eq 0x8c + // 78: b4000115 cbz x21, 0x98 + // 7c: f81f0315 stur x21, [x24, #-0x10] + // 80: d1002315 sub x21, x24, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 8c: aa1303e0 mov x0, x19 + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: b5ffff55 cbnz x21, 0x7c + // 98: d1004315 sub x21, x24, #0x10 + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x08, 0xed, 0x7c, 0xd3, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x69, 0x68, 0xf8, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0xf5, 0x03, 0x00, 0xaa, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x15, 0x01, 0x00, 0xb4, 0x15, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x55, 0xff, 0xff, 0xb5, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyIntrinsics_BinaryFunctions+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyIntrinsics_BinaryFunctions); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x60, 0x0, state); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_ISINSTANCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_ISINSTANCE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d0a and w10, w8, #0xffff + // 14: 2a2a03f9 mvn w25, w10 + // 18: f879daa9 ldr x9, [x21, w25, sxtw #3] + // 1c: 928000eb mov x11, #-0x8 ; =-8 + // 20: f100013f cmp x9, #0x0 + // 24: 9a9f1169 csel x9, x11, xzr, ne + // 28: 1a8a054a cinc w10, w10, ne + // 2c: 7100095f cmp w10, #0x2 + // 30: 54000141 b.ne 0x58 + // 34: 9280002a mov x10, #-0x2 ; =-2 + // 38: cb282158 sub x24, x10, w8, uxth + // 3c: f8787aaa ldr x10, [x21, x24, lsl #3] + // 40: f9400acb ldr x11, [x22, #0x10] + // 44: 528ce40c mov w12, #0x6720 ; =26400 + // 48: 72a0006c movk w12, #0x3, lsl #16 + // 4c: f86c696b ldr x11, [x11, x12] + // 50: eb0a017f cmp x11, x10 + // 54: 54000060 b.eq 0x60 + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 60: cb282ea8 sub x8, x21, w8, uxth #3 + // 64: 8b090108 add x8, x8, x9 + // 68: a9400500 ldp x0, x1, [x8] + // 6c: f9002295 str x21, [x20, #0x40] + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 _PyObject_IsInstance + // 74: f9402293 ldr x19, [x20, #0x40] + // 78: f900229f str xzr, [x20, #0x40] + // 7c: 37f805e0 tbnz w0, #0x1f, 0x138 + // 80: aa0003f7 mov x23, x0 + // 84: 93407f39 sxtw x25, w25 + // 88: f8787aa0 ldr x0, [x21, x24, lsl #3] + // 8c: b9400008 ldr w8, [x0] + // 90: 37f800a8 tbnz w8, #0x1f, 0xa4 + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000008 str w8, [x0] + // 9c: 54000041 b.ne 0xa4 + // a0: 94000000 bl 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a4: f8797aa0 ldr x0, [x21, x25, lsl #3] + // a8: b40000e0 cbz x0, 0xc4 + // ac: b9400008 ldr w8, [x0] + // b0: 37f800a8 tbnz w8, #0x1f, 0xc4 + // b4: 71000508 subs w8, w8, #0x1 + // b8: b9000008 str w8, [x0] + // bc: 54000041 b.ne 0xc4 + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c4: 90000008 adrp x8, 0x0 + // 00000000000000c4: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c8: f9400108 ldr x8, [x8] + // 00000000000000c8: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // cc: 72003d1f tst w8, #0xffff + // d0: 54000200 b.eq 0x110 + // d4: 92403d08 and x8, x8, #0xffff + // d8: 9100051a add x26, x8, #0x1 + // dc: d10022b5 sub x21, x21, #0x8 + // e0: 14000004 b 0xf0 + // e4: d100075a sub x26, x26, #0x1 + // e8: f100075f cmp x26, #0x1 + // ec: 54000129 b.ls 0x110 + // f0: f85f86a0 ldr x0, [x21], #-0x8 + // f4: b9400008 ldr w8, [x0] + // f8: 37ffff68 tbnz w8, #0x1f, 0xe4 + // fc: 71000508 subs w8, w8, #0x1 + // 100: b9000008 str w8, [x0] + // 104: 54ffff01 b.ne 0xe4 + // 108: 94000000 bl 0x108 + // 0000000000000108: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 10c: 17fffff6 b 0xe4 + // 110: 90000008 adrp x8, 0x0 + // 0000000000000110: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 114: f9400108 ldr x8, [x8] + // 0000000000000114: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 118: 90000009 adrp x9, 0x0 + // 0000000000000118: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 11c: f9400129 ldr x9, [x9] + // 000000000000011c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 120: 710002ff cmp w23, #0x0 + // 124: 9a880128 csel x8, x9, x8, eq + // 128: f8387a68 str x8, [x19, x24, lsl #3] + // 12c: 8b190e75 add x21, x19, x25, lsl #3 + // 130: a8c17bfd ldp x29, x30, [sp], #0x10 + // 134: 14000000 b 0x134 + // 0000000000000134: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 138: aa1303f5 mov x21, x19 + // 13c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 140: 14000000 b 0x140 + // 0000000000000140: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 144: 00 00 00 00 + const unsigned char code_body[328] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0a, 0x3d, 0x00, 0x12, 0xf9, 0x03, 0x2a, 0x2a, + 0xa9, 0xda, 0x79, 0xf8, 0xeb, 0x00, 0x80, 0x92, + 0x3f, 0x01, 0x00, 0xf1, 0x69, 0x11, 0x9f, 0x9a, + 0x4a, 0x05, 0x8a, 0x1a, 0x5f, 0x09, 0x00, 0x71, + 0x41, 0x01, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x58, 0x21, 0x28, 0xcb, 0xaa, 0x7a, 0x78, 0xf8, + 0xcb, 0x0a, 0x40, 0xf9, 0x0c, 0xe4, 0x8c, 0x52, + 0x6c, 0x00, 0xa0, 0x72, 0x6b, 0x69, 0x6c, 0xf8, + 0x7f, 0x01, 0x0a, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xa8, 0x2e, 0x28, 0xcb, 0x08, 0x01, 0x09, 0x8b, + 0x00, 0x05, 0x40, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x94, 0x93, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe0, 0x05, 0xf8, 0x37, + 0xf7, 0x03, 0x00, 0xaa, 0x39, 0x7f, 0x40, 0x93, + 0xa0, 0x7a, 0x78, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x79, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x00, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1a, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0xff, 0x02, 0x00, 0x71, 0x28, 0x01, 0x88, 0x9a, + 0x68, 0x7a, 0x38, 0xf8, 0x75, 0x0e, 0x19, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x70, 0x14, state); + patch_aarch64_trampoline(code + 0xa0, 0x0, state); + patch_aarch64_trampoline(code + 0xc0, 0x0, state); + patch_aarch64_33rx(code + 0xc4, (uintptr_t)data + 0x10); + patch_aarch64_trampoline(code + 0x108, 0x0, state); + patch_aarch64_33rx(code + 0x110, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x118, (uintptr_t)data); + patch_aarch64_26r(code + 0x134, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x140, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_KW_NON_PY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_KW_NON_PY.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d1a and w26, w8, #0xffff + // 14: f85f82b7 ldur x23, [x21, #-0x8] + // 18: 2a3a03f8 mvn w24, w26 + // 1c: 8b38cea9 add x9, x21, w24, sxtw #3 + // 20: 92403d08 and x8, x8, #0xffff + // 24: 9280002a mov x10, #-0x2 ; =-2 + // 28: cb080159 sub x25, x10, x8 + // 2c: 9280004a mov x10, #-0x3 ; =-3 + // 30: cb08015b sub x27, x10, x8 + // 34: f87b7aa0 ldr x0, [x21, x27, lsl #3] + // 38: f8797aa8 ldr x8, [x21, x25, lsl #3] + // 3c: 928000ea mov x10, #-0x8 ; =-8 + // 40: f100011f cmp x8, #0x0 + // 44: 9a9f1148 csel x8, x10, xzr, ne + // 48: 1a9a074a cinc w10, w26, ne + // 4c: b94012eb ldr w11, [x23, #0x10] + // 50: 4b0b014a sub w10, w10, w11 + // 54: f9002295 str x21, [x20, #0x40] + // 58: 93407d4a sxtw x10, w10 + // 5c: 8b080121 add x1, x9, x8 + // 60: b2410142 orr x2, x10, #0x8000000000000000 + // 64: aa1703e3 mov x3, x23 + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 _PyObject_Vectorcall + // 6c: aa0003f3 mov x19, x0 + // 70: f9402288 ldr x8, [x20, #0x40] + // 74: d1002108 sub x8, x8, #0x8 + // 78: f9002288 str x8, [x20, #0x40] + // 7c: b94002e8 ldr w8, [x23] + // 80: 37f800c8 tbnz w8, #0x1f, 0x98 + // 84: 71000508 subs w8, w8, #0x1 + // 88: b90002e8 str w8, [x23] + // 8c: 54000061 b.ne 0x98 + // 90: aa1703e0 mov x0, x23 + // 94: 94000000 bl 0x94 + // 0000000000000094: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 98: f9402297 ldr x23, [x20, #0x40] + // 9c: f900229f str xzr, [x20, #0x40] + // a0: f87b7aa0 ldr x0, [x21, x27, lsl #3] + // a4: b9400008 ldr w8, [x0] + // a8: 37f800a8 tbnz w8, #0x1f, 0xbc + // ac: 71000508 subs w8, w8, #0x1 + // b0: b9000008 str w8, [x0] + // b4: 54000041 b.ne 0xbc + // b8: 94000000 bl 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // bc: f8797aa0 ldr x0, [x21, x25, lsl #3] + // c0: b40000e0 cbz x0, 0xdc + // c4: b9400008 ldr w8, [x0] + // c8: 37f800a8 tbnz w8, #0x1f, 0xdc + // cc: 71000508 subs w8, w8, #0x1 + // d0: b9000008 str w8, [x0] + // d4: 54000041 b.ne 0xdc + // d8: 94000000 bl 0xd8 + // 00000000000000d8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // dc: 90000008 adrp x8, 0x0 + // 00000000000000dc: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // e0: f9400108 ldr x8, [x8] + // 00000000000000e0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // e4: 72003d1f tst w8, #0xffff + // e8: 54000280 b.eq 0x138 + // ec: 92403d09 and x9, x8, #0xffff + // f0: 9100053b add x27, x9, #0x1 + // f4: 4b1a03e9 neg w9, w26 + // f8: 937d7d29 sbfiz x9, x9, #3, #32 + // fc: 8b282d28 add x8, x9, w8, uxth #3 + // 100: 8b150108 add x8, x8, x21 + // 104: d1004115 sub x21, x8, #0x10 + // 108: 14000004 b 0x118 + // 10c: d100077b sub x27, x27, #0x1 + // 110: f100077f cmp x27, #0x1 + // 114: 54000129 b.ls 0x138 + // 118: f85f86a0 ldr x0, [x21], #-0x8 + // 11c: b9400008 ldr w8, [x0] + // 120: 37ffff68 tbnz w8, #0x1f, 0x10c + // 124: 71000508 subs w8, w8, #0x1 + // 128: b9000008 str w8, [x0] + // 12c: 54ffff01 b.ne 0x10c + // 130: 94000000 bl 0x130 + // 0000000000000130: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 134: 17fffff6 b 0x10c + // 138: b40000d3 cbz x19, 0x150 + // 13c: 93407f08 sxtw x8, w24 + // 140: f8397af3 str x19, [x23, x25, lsl #3] + // 144: 8b080ef5 add x21, x23, x8, lsl #3 + // 148: a8c17bfd ldp x29, x30, [sp], #0x10 + // 14c: 14000000 b 0x14c + // 000000000000014c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 150: 8b190ef5 add x21, x23, x25, lsl #3 + // 154: a8c17bfd ldp x29, x30, [sp], #0x10 + // 158: 14000000 b 0x158 + // 0000000000000158: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 15c: 00 00 00 00 + const unsigned char code_body[352] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1a, 0x3d, 0x00, 0x12, 0xb7, 0x82, 0x5f, 0xf8, + 0xf8, 0x03, 0x3a, 0x2a, 0xa9, 0xce, 0x38, 0x8b, + 0x08, 0x3d, 0x40, 0x92, 0x2a, 0x00, 0x80, 0x92, + 0x59, 0x01, 0x08, 0xcb, 0x4a, 0x00, 0x80, 0x92, + 0x5b, 0x01, 0x08, 0xcb, 0xa0, 0x7a, 0x7b, 0xf8, + 0xa8, 0x7a, 0x79, 0xf8, 0xea, 0x00, 0x80, 0x92, + 0x1f, 0x01, 0x00, 0xf1, 0x48, 0x11, 0x9f, 0x9a, + 0x4a, 0x07, 0x9a, 0x1a, 0xeb, 0x12, 0x40, 0xb9, + 0x4a, 0x01, 0x0b, 0x4b, 0x95, 0x22, 0x00, 0xf9, + 0x4a, 0x7d, 0x40, 0x93, 0x21, 0x01, 0x08, 0x8b, + 0x42, 0x01, 0x41, 0xb2, 0xe3, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x97, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x7a, 0x7b, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x79, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x80, 0x02, 0x00, 0x54, 0x09, 0x3d, 0x40, 0x92, + 0x3b, 0x05, 0x00, 0x91, 0xe9, 0x03, 0x1a, 0x4b, + 0x29, 0x7d, 0x7d, 0x93, 0x28, 0x2d, 0x28, 0x8b, + 0x08, 0x01, 0x15, 0x8b, 0x15, 0x41, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x7b, 0x07, 0x00, 0xd1, + 0x7f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0xd3, 0x00, 0x00, 0xb4, 0x08, 0x7f, 0x40, 0x93, + 0xf3, 0x7a, 0x39, 0xf8, 0xf5, 0x0e, 0x08, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x0e, 0x19, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x68, 0x15, state); + patch_aarch64_trampoline(code + 0x94, 0x0, state); + patch_aarch64_trampoline(code + 0xb8, 0x0, state); + patch_aarch64_trampoline(code + 0xd8, 0x0, state); + patch_aarch64_33rx(code + 0xdc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x130, 0x0, state); + patch_aarch64_26r(code + 0x14c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x158, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LEN.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d0a and w10, w8, #0xffff + // 14: 2a2a03e9 mvn w9, w10 + // 18: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 1c: 928000eb mov x11, #-0x8 ; =-8 + // 20: f100013f cmp x9, #0x0 + // 24: 9a9f1169 csel x9, x11, xzr, ne + // 28: 1a8a054a cinc w10, w10, ne + // 2c: 7100055f cmp w10, #0x1 + // 30: 54000141 b.ne 0x58 + // 34: 9280002a mov x10, #-0x2 ; =-2 + // 38: cb282158 sub x24, x10, w8, uxth + // 3c: f8787aaa ldr x10, [x21, x24, lsl #3] + // 40: f9400acb ldr x11, [x22, #0x10] + // 44: 528ce50c mov w12, #0x6728 ; =26408 + // 48: 72a0006c movk w12, #0x3, lsl #16 + // 4c: f86c696b ldr x11, [x11, x12] + // 50: eb0a017f cmp x11, x10 + // 54: 54000060 b.eq 0x60 + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 60: cb282ea8 sub x8, x21, w8, uxth #3 + // 64: f8696913 ldr x19, [x8, x9] + // 68: f9002295 str x21, [x20, #0x40] + // 6c: aa1303e0 mov x0, x19 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 _PyObject_Size + // 74: f9402297 ldr x23, [x20, #0x40] + // 78: f900229f str xzr, [x20, #0x40] + // 7c: b7f803e0 tbnz x0, #0x3f, 0xf8 + // 80: 94000000 bl 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 _PyLong_FromSsize_t + // 84: b40003a0 cbz x0, 0xf8 + // 88: f9002297 str x23, [x20, #0x40] + // 8c: b9400268 ldr w8, [x19] + // 90: 37f80108 tbnz w8, #0x1f, 0xb0 + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000268 str w8, [x19] + // 9c: 540000a1 b.ne 0xb0 + // a0: aa0003f7 mov x23, x0 + // a4: aa1303e0 mov x0, x19 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // ac: aa1703e0 mov x0, x23 + // b0: f9402288 ldr x8, [x20, #0x40] + // b4: 8b180d08 add x8, x8, x24, lsl #3 + // b8: f9002288 str x8, [x20, #0x40] + // bc: f8787aa8 ldr x8, [x21, x24, lsl #3] + // c0: b9400109 ldr w9, [x8] + // c4: 37f80109 tbnz w9, #0x1f, 0xe4 + // c8: 71000529 subs w9, w9, #0x1 + // cc: b9000109 str w9, [x8] + // d0: 540000a1 b.ne 0xe4 + // d4: aa0003f3 mov x19, x0 + // d8: aa0803e0 mov x0, x8 + // dc: 94000000 bl 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e0: aa1303e0 mov x0, x19 + // e4: f9402295 ldr x21, [x20, #0x40] + // e8: f900229f str xzr, [x20, #0x40] + // ec: f80086a0 str x0, [x21], #0x8 + // f0: a8c17bfd ldp x29, x30, [sp], #0x10 + // f4: 14000000 b 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // f8: aa1703f5 mov x21, x23 + // fc: a8c17bfd ldp x29, x30, [sp], #0x10 + // 100: 14000000 b 0x100 + // 0000000000000100: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 104: 00 00 00 00 + const unsigned char code_body[264] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0a, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x2a, 0x2a, + 0xa9, 0xda, 0x69, 0xf8, 0xeb, 0x00, 0x80, 0x92, + 0x3f, 0x01, 0x00, 0xf1, 0x69, 0x11, 0x9f, 0x9a, + 0x4a, 0x05, 0x8a, 0x1a, 0x5f, 0x05, 0x00, 0x71, + 0x41, 0x01, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x58, 0x21, 0x28, 0xcb, 0xaa, 0x7a, 0x78, 0xf8, + 0xcb, 0x0a, 0x40, 0xf9, 0x0c, 0xe5, 0x8c, 0x52, + 0x6c, 0x00, 0xa0, 0x72, 0x6b, 0x69, 0x6c, 0xf8, + 0x7f, 0x01, 0x0a, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xa8, 0x2e, 0x28, 0xcb, 0x13, 0x69, 0x69, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x97, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0xf8, 0xb7, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x03, 0x00, 0xb4, + 0x97, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x17, 0xaa, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x0d, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0xa8, 0x7a, 0x78, 0xf8, + 0x09, 0x01, 0x40, 0xb9, 0x09, 0x01, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x71, 0x09, 0x01, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf3, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x17, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x70, 0x17, state); + patch_aarch64_trampoline(code + 0x80, 0x16, state); + patch_aarch64_trampoline(code + 0xa8, 0x0, state); + patch_aarch64_trampoline(code + 0xdc, 0x0, state); + patch_aarch64_26r(code + 0xf4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x100, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LIST_APPEND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f8 mov x24, x21 + // 4: f85f0f17 ldr x23, [x24, #-0x10]! + // 8: f85f8313 ldur x19, [x24, #-0x8] + // c: f9400ac8 ldr x8, [x22, #0x10] + // 10: 528ce609 mov w9, #0x6730 ; =26416 + // 14: 72a00069 movk w9, #0x3, lsl #16 + // 18: f8696908 ldr x8, [x8, x9] + // 1c: eb13011f cmp x8, x19 + // 20: 54000081 b.ne 0x30 + // 24: f94006e8 ldr x8, [x23, #0x8] + // 28: 3942ad08 ldrb w8, [x8, #0xab] + // 2c: 37080048 tbnz w8, #0x1, 0x34 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: f9400701 ldr x1, [x24, #0x8] + // 40: f9400ae8 ldr x8, [x23, #0x10] + // 44: f94012e9 ldr x9, [x23, #0x20] + // 48: eb08013f cmp x9, x8 + // 4c: 5400014d b.le 0x74 + // 50: f9400ee9 ldr x9, [x23, #0x18] + // 54: f8287921 str x1, [x9, x8, lsl #3] + // 58: 91000508 add x8, x8, #0x1 + // 5c: f9000ae8 str x8, [x23, #0x10] + // 60: 52800039 mov w25, #0x1 ; =1 + // 64: f9002298 str x24, [x20, #0x40] + // 68: b94002e8 ldr w8, [x23] + // 6c: 36f80128 tbz w8, #0x1f, 0x90 + // 70: 1400000d b 0xa4 + // 74: aa1703e0 mov x0, x23 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __PyList_AppendTakeRefListResize + // 7c: 7100001f cmp w0, #0x0 + // 80: 1a9f17f9 cset w25, eq + // 84: f9002298 str x24, [x20, #0x40] + // 88: b94002e8 ldr w8, [x23] + // 8c: 37f800c8 tbnz w8, #0x1f, 0xa4 + // 90: 71000508 subs w8, w8, #0x1 + // 94: b90002e8 str w8, [x23] + // 98: 54000061 b.ne 0xa4 + // 9c: aa1703e0 mov x0, x23 + // a0: 94000000 bl 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a4: f9402288 ldr x8, [x20, #0x40] + // a8: d1002108 sub x8, x8, #0x8 + // ac: f9002288 str x8, [x20, #0x40] + // b0: b9400268 ldr w8, [x19] + // b4: 37f80088 tbnz w8, #0x1f, 0xc4 + // b8: 71000508 subs w8, w8, #0x1 + // bc: b9000268 str w8, [x19] + // c0: 540000c0 b.eq 0xd8 + // c4: f9402295 ldr x21, [x20, #0x40] + // c8: f900229f str xzr, [x20, #0x40] + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 36000119 tbz w25, #0x0, 0xf0 + // d4: 14000000 b 0xd4 + // 00000000000000d4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // d8: aa1303e0 mov x0, x19 + // dc: 94000000 bl 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e0: f9402295 ldr x21, [x20, #0x40] + // e4: f900229f str xzr, [x20, #0x40] + // e8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ec: 3707ff59 tbnz w25, #0x0, 0xd4 + // f0: 14000000 b 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // f4: 00 00 00 00 + const unsigned char code_body[248] = { + 0xf8, 0x03, 0x15, 0xaa, 0x17, 0x0f, 0x5f, 0xf8, + 0x13, 0x83, 0x5f, 0xf8, 0xc8, 0x0a, 0x40, 0xf9, + 0x09, 0xe6, 0x8c, 0x52, 0x69, 0x00, 0xa0, 0x72, + 0x08, 0x69, 0x69, 0xf8, 0x1f, 0x01, 0x13, 0xeb, + 0x81, 0x00, 0x00, 0x54, 0xe8, 0x06, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0x48, 0x00, 0x08, 0x37, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x07, 0x40, 0xf9, + 0xe8, 0x0a, 0x40, 0xf9, 0xe9, 0x12, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x4d, 0x01, 0x00, 0x54, + 0xe9, 0x0e, 0x40, 0xf9, 0x21, 0x79, 0x28, 0xf8, + 0x08, 0x05, 0x00, 0x91, 0xe8, 0x0a, 0x00, 0xf9, + 0x39, 0x00, 0x80, 0x52, 0x98, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0x28, 0x01, 0xf8, 0x36, + 0x0d, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0xf9, 0x17, 0x9f, 0x1a, 0x98, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x21, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x19, 0x01, 0x00, 0x36, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x59, 0xff, 0x07, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x78, 0x18, state); + patch_aarch64_trampoline(code + 0xa0, 0x0, state); + patch_aarch64_26r(code + 0xd4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xdc, 0x0, state); + patch_aarch64_26r(code + 0xf0, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 9000000b adrp x11, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f940016b ldr x11, [x11] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d68 and w8, w11, #0xffff + // 14: 2a2803e9 mvn w9, w8 + // 18: 9280002a mov x10, #-0x2 ; =-2 + // 1c: cb2b2157 sub x23, x10, w11, uxth + // 20: f8777aac ldr x12, [x21, x23, lsl #3] + // 24: f869daaa ldr x10, [x21, w9, sxtw #3] + // 28: 928000ed mov x13, #-0x8 ; =-8 + // 2c: f100015f cmp x10, #0x0 + // 30: 9a9f11ae csel x14, x13, xzr, ne + // 34: 1a9f07ea cset w10, ne + // 38: f940058d ldr x13, [x12, #0x8] + // 3c: 9000000f adrp x15, 0x0 + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethodDescr_Type + // 40: f94001ef ldr x15, [x15] + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethodDescr_Type + // 44: eb0f01bf cmp x13, x15 + // 48: 54000181 b.ne 0x78 + // 4c: f940158d ldr x13, [x12, #0x28] + // 50: b94011af ldr w15, [x13, #0x10] + // 54: 710201ff cmp w15, #0x80 + // 58: 54000101 b.ne 0x78 + // 5c: cb2b2eab sub x11, x21, w11, uxth #3 + // 60: 8b0e016b add x11, x11, x14 + // 64: f9400160 ldr x0, [x11] + // 68: f940098c ldr x12, [x12, #0x10] + // 6c: f940040e ldr x14, [x0, #0x8] + // 70: eb0c01df cmp x14, x12 + // 74: 54000060 b.eq 0x80 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 80: 93407d38 sxtw x24, w9 + // 84: 0b0a0108 add w8, w8, w10 + // 88: 51000508 sub w8, w8, #0x1 + // 8c: f9002295 str x21, [x20, #0x40] + // 90: f94005a9 ldr x9, [x13, #0x8] + // 94: 93407d02 sxtw x2, w8 + // 98: 91002161 add x1, x11, #0x8 + // 9c: d63f0120 blr x9 + // a0: aa0003f3 mov x19, x0 + // a4: f9402299 ldr x25, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: f8777aa0 ldr x0, [x21, x23, lsl #3] + // b0: b9400008 ldr w8, [x0] + // b4: 37f800a8 tbnz w8, #0x1f, 0xc8 + // b8: 71000508 subs w8, w8, #0x1 + // bc: b9000008 str w8, [x0] + // c0: 54000041 b.ne 0xc8 + // c4: 94000000 bl 0xc4 + // 00000000000000c4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c8: f8787aa0 ldr x0, [x21, x24, lsl #3] + // cc: b40000e0 cbz x0, 0xe8 + // d0: b9400008 ldr w8, [x0] + // d4: 37f800a8 tbnz w8, #0x1f, 0xe8 + // d8: 71000508 subs w8, w8, #0x1 + // dc: b9000008 str w8, [x0] + // e0: 54000041 b.ne 0xe8 + // e4: 94000000 bl 0xe4 + // 00000000000000e4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e8: 90000008 adrp x8, 0x0 + // 00000000000000e8: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // ec: f9400108 ldr x8, [x8] + // 00000000000000ec: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // f0: 72003d1f tst w8, #0xffff + // f4: 54000200 b.eq 0x134 + // f8: 92403d08 and x8, x8, #0xffff + // fc: 9100051a add x26, x8, #0x1 + // 100: d10022b5 sub x21, x21, #0x8 + // 104: 14000004 b 0x114 + // 108: d100075a sub x26, x26, #0x1 + // 10c: f100075f cmp x26, #0x1 + // 110: 54000129 b.ls 0x134 + // 114: f85f86a0 ldr x0, [x21], #-0x8 + // 118: b9400008 ldr w8, [x0] + // 11c: 37ffff68 tbnz w8, #0x1f, 0x108 + // 120: 71000508 subs w8, w8, #0x1 + // 124: b9000008 str w8, [x0] + // 128: 54ffff01 b.ne 0x108 + // 12c: 94000000 bl 0x12c + // 000000000000012c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 130: 17fffff6 b 0x108 + // 134: b40000b3 cbz x19, 0x148 + // 138: f8377b33 str x19, [x25, x23, lsl #3] + // 13c: 8b180f35 add x21, x25, x24, lsl #3 + // 140: a8c17bfd ldp x29, x30, [sp], #0x10 + // 144: 14000000 b 0x144 + // 0000000000000144: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 148: 8b170f35 add x21, x25, x23, lsl #3 + // 14c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 150: 14000000 b 0x150 + // 0000000000000150: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 154: 00 00 00 00 + const unsigned char code_body[344] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x0b, 0x00, 0x00, 0x90, 0x6b, 0x01, 0x40, 0xf9, + 0x68, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0x2a, 0x00, 0x80, 0x92, 0x57, 0x21, 0x2b, 0xcb, + 0xac, 0x7a, 0x77, 0xf8, 0xaa, 0xda, 0x69, 0xf8, + 0xed, 0x00, 0x80, 0x92, 0x5f, 0x01, 0x00, 0xf1, + 0xae, 0x11, 0x9f, 0x9a, 0xea, 0x07, 0x9f, 0x1a, + 0x8d, 0x05, 0x40, 0xf9, 0x0f, 0x00, 0x00, 0x90, + 0xef, 0x01, 0x40, 0xf9, 0xbf, 0x01, 0x0f, 0xeb, + 0x81, 0x01, 0x00, 0x54, 0x8d, 0x15, 0x40, 0xf9, + 0xaf, 0x11, 0x40, 0xb9, 0xff, 0x01, 0x02, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xab, 0x2e, 0x2b, 0xcb, + 0x6b, 0x01, 0x0e, 0x8b, 0x60, 0x01, 0x40, 0xf9, + 0x8c, 0x09, 0x40, 0xf9, 0x0e, 0x04, 0x40, 0xf9, + 0xdf, 0x01, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x38, 0x7d, 0x40, 0x93, 0x08, 0x01, 0x0a, 0x0b, + 0x08, 0x05, 0x00, 0x51, 0x95, 0x22, 0x00, 0xf9, + 0xa9, 0x05, 0x40, 0xf9, 0x02, 0x7d, 0x40, 0x93, + 0x61, 0x21, 0x00, 0x91, 0x20, 0x01, 0x3f, 0xd6, + 0xf3, 0x03, 0x00, 0xaa, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x7a, 0x77, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xa0, 0x7a, 0x78, 0xf8, 0xe0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x00, 0x02, 0x00, 0x54, + 0x08, 0x3d, 0x40, 0x92, 0x1a, 0x05, 0x00, 0x91, + 0xb5, 0x22, 0x00, 0xd1, 0x04, 0x00, 0x00, 0x14, + 0x5a, 0x07, 0x00, 0xd1, 0x5f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xf6, 0xff, 0xff, 0x17, 0xb3, 0x00, 0x00, 0xb4, + 0x33, 0x7b, 0x37, 0xf8, 0x35, 0x0f, 0x18, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0xc4, 0x0, state); + patch_aarch64_trampoline(code + 0xe4, 0x0, state); + patch_aarch64_33rx(code + 0xe8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x12c, 0x0, state); + patch_aarch64_26r(code + 0x144, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x150, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 9000000b adrp x11, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f940016b ldr x11, [x11] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d68 and w8, w11, #0xffff + // 14: 2a2803e9 mvn w9, w8 + // 18: 9280002a mov x10, #-0x2 ; =-2 + // 1c: cb2b2157 sub x23, x10, w11, uxth + // 20: f8777aac ldr x12, [x21, x23, lsl #3] + // 24: f869daaa ldr x10, [x21, w9, sxtw #3] + // 28: 928000ed mov x13, #-0x8 ; =-8 + // 2c: f100015f cmp x10, #0x0 + // 30: 9a9f11ae csel x14, x13, xzr, ne + // 34: 1a9f07ea cset w10, ne + // 38: f940058d ldr x13, [x12, #0x8] + // 3c: 9000000f adrp x15, 0x0 + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethodDescr_Type + // 40: f94001ef ldr x15, [x15] + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethodDescr_Type + // 44: eb0f01bf cmp x13, x15 + // 48: 54000181 b.ne 0x78 + // 4c: f940158d ldr x13, [x12, #0x28] + // 50: b94011af ldr w15, [x13, #0x10] + // 54: 710209ff cmp w15, #0x82 + // 58: 54000101 b.ne 0x78 + // 5c: cb2b2eab sub x11, x21, w11, uxth #3 + // 60: 8b0e016b add x11, x11, x14 + // 64: f940098c ldr x12, [x12, #0x10] + // 68: f9400160 ldr x0, [x11] + // 6c: f940040e ldr x14, [x0, #0x8] + // 70: eb0c01df cmp x14, x12 + // 74: 54000060 b.eq 0x80 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 80: 93407d38 sxtw x24, w9 + // 84: 0b0a0108 add w8, w8, w10 + // 88: 51000508 sub w8, w8, #0x1 + // 8c: f9002295 str x21, [x20, #0x40] + // 90: f94005a9 ldr x9, [x13, #0x8] + // 94: 93407d02 sxtw x2, w8 + // 98: 91002161 add x1, x11, #0x8 + // 9c: d2800003 mov x3, #0x0 ; =0 + // a0: d63f0120 blr x9 + // a4: aa0003f3 mov x19, x0 + // a8: f9402299 ldr x25, [x20, #0x40] + // ac: f900229f str xzr, [x20, #0x40] + // b0: f8777aa0 ldr x0, [x21, x23, lsl #3] + // b4: b9400008 ldr w8, [x0] + // b8: 37f800a8 tbnz w8, #0x1f, 0xcc + // bc: 71000508 subs w8, w8, #0x1 + // c0: b9000008 str w8, [x0] + // c4: 54000041 b.ne 0xcc + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // cc: f8787aa0 ldr x0, [x21, x24, lsl #3] + // d0: b40000e0 cbz x0, 0xec + // d4: b9400008 ldr w8, [x0] + // d8: 37f800a8 tbnz w8, #0x1f, 0xec + // dc: 71000508 subs w8, w8, #0x1 + // e0: b9000008 str w8, [x0] + // e4: 54000041 b.ne 0xec + // e8: 94000000 bl 0xe8 + // 00000000000000e8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // ec: 90000008 adrp x8, 0x0 + // 00000000000000ec: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // f0: f9400108 ldr x8, [x8] + // 00000000000000f0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // f4: 72003d1f tst w8, #0xffff + // f8: 54000200 b.eq 0x138 + // fc: 92403d08 and x8, x8, #0xffff + // 100: 9100051a add x26, x8, #0x1 + // 104: d10022b5 sub x21, x21, #0x8 + // 108: 14000004 b 0x118 + // 10c: d100075a sub x26, x26, #0x1 + // 110: f100075f cmp x26, #0x1 + // 114: 54000129 b.ls 0x138 + // 118: f85f86a0 ldr x0, [x21], #-0x8 + // 11c: b9400008 ldr w8, [x0] + // 120: 37ffff68 tbnz w8, #0x1f, 0x10c + // 124: 71000508 subs w8, w8, #0x1 + // 128: b9000008 str w8, [x0] + // 12c: 54ffff01 b.ne 0x10c + // 130: 94000000 bl 0x130 + // 0000000000000130: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 134: 17fffff6 b 0x10c + // 138: b40000b3 cbz x19, 0x14c + // 13c: f8377b33 str x19, [x25, x23, lsl #3] + // 140: 8b180f35 add x21, x25, x24, lsl #3 + // 144: a8c17bfd ldp x29, x30, [sp], #0x10 + // 148: 14000000 b 0x148 + // 0000000000000148: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 14c: 8b170f35 add x21, x25, x23, lsl #3 + // 150: a8c17bfd ldp x29, x30, [sp], #0x10 + // 154: 14000000 b 0x154 + // 0000000000000154: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[344] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x0b, 0x00, 0x00, 0x90, 0x6b, 0x01, 0x40, 0xf9, + 0x68, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0x2a, 0x00, 0x80, 0x92, 0x57, 0x21, 0x2b, 0xcb, + 0xac, 0x7a, 0x77, 0xf8, 0xaa, 0xda, 0x69, 0xf8, + 0xed, 0x00, 0x80, 0x92, 0x5f, 0x01, 0x00, 0xf1, + 0xae, 0x11, 0x9f, 0x9a, 0xea, 0x07, 0x9f, 0x1a, + 0x8d, 0x05, 0x40, 0xf9, 0x0f, 0x00, 0x00, 0x90, + 0xef, 0x01, 0x40, 0xf9, 0xbf, 0x01, 0x0f, 0xeb, + 0x81, 0x01, 0x00, 0x54, 0x8d, 0x15, 0x40, 0xf9, + 0xaf, 0x11, 0x40, 0xb9, 0xff, 0x09, 0x02, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xab, 0x2e, 0x2b, 0xcb, + 0x6b, 0x01, 0x0e, 0x8b, 0x8c, 0x09, 0x40, 0xf9, + 0x60, 0x01, 0x40, 0xf9, 0x0e, 0x04, 0x40, 0xf9, + 0xdf, 0x01, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x38, 0x7d, 0x40, 0x93, 0x08, 0x01, 0x0a, 0x0b, + 0x08, 0x05, 0x00, 0x51, 0x95, 0x22, 0x00, 0xf9, + 0xa9, 0x05, 0x40, 0xf9, 0x02, 0x7d, 0x40, 0x93, + 0x61, 0x21, 0x00, 0x91, 0x03, 0x00, 0x80, 0xd2, + 0x20, 0x01, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0xaa, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x78, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x00, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1a, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0xb3, 0x00, 0x00, 0xb4, 0x33, 0x7b, 0x37, 0xf8, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0xc8, 0x0, state); + patch_aarch64_trampoline(code + 0xe8, 0x0, state); + patch_aarch64_33rx(code + 0xec, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x130, 0x0, state); + patch_aarch64_26r(code + 0x148, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x154, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_NOARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_NOARGS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d0a and w10, w8, #0xffff + // 14: 2a2a03e9 mvn w9, w10 + // 18: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 1c: 928000eb mov x11, #-0x8 ; =-8 + // 20: f100013f cmp x9, #0x0 + // 24: 9a9f1169 csel x9, x11, xzr, ne + // 28: 1a8a054a cinc w10, w10, ne + // 2c: 7100055f cmp w10, #0x1 + // 30: 54000701 b.ne 0x110 + // 34: 9280002a mov x10, #-0x2 ; =-2 + // 38: cb282158 sub x24, x10, w8, uxth + // 3c: f8787aaa ldr x10, [x21, x24, lsl #3] + // 40: f940054b ldr x11, [x10, #0x8] + // 44: 9000000c adrp x12, 0x0 + // 0000000000000044: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethodDescr_Type + // 48: f940018c ldr x12, [x12] + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethodDescr_Type + // 4c: eb0c017f cmp x11, x12 + // 50: 54000601 b.ne 0x110 + // 54: cb282ea8 sub x8, x21, w8, uxth #3 + // 58: f8696917 ldr x23, [x8, x9] + // 5c: f9400948 ldr x8, [x10, #0x10] + // 60: f94006e9 ldr x9, [x23, #0x8] + // 64: eb08013f cmp x9, x8 + // 68: 54000541 b.ne 0x110 + // 6c: f9401548 ldr x8, [x10, #0x28] + // 70: b9401109 ldr w9, [x8, #0x10] + // 74: 7100113f cmp w9, #0x4 + // 78: 540004c1 b.ne 0x110 + // 7c: b94036c9 ldr w9, [x22, #0x34] + // 80: 7100013f cmp w9, #0x0 + // 84: 5400046d b.le 0x110 + // 88: f9400508 ldr x8, [x8, #0x8] + // 8c: 51000529 sub w9, w9, #0x1 + // 90: b90036c9 str w9, [x22, #0x34] + // 94: f9002295 str x21, [x20, #0x40] + // 98: aa1703e0 mov x0, x23 + // 9c: d2800001 mov x1, #0x0 ; =0 + // a0: d63f0100 blr x8 + // a4: aa0003f3 mov x19, x0 + // a8: b94036c8 ldr w8, [x22, #0x34] + // ac: 11000508 add w8, w8, #0x1 + // b0: b90036c8 str w8, [x22, #0x34] + // b4: b94002e8 ldr w8, [x23] + // b8: 37f800c8 tbnz w8, #0x1f, 0xd0 + // bc: 71000508 subs w8, w8, #0x1 + // c0: b90002e8 str w8, [x23] + // c4: 54000061 b.ne 0xd0 + // c8: aa1703e0 mov x0, x23 + // cc: 94000000 bl 0xcc + // 00000000000000cc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // d0: f9402288 ldr x8, [x20, #0x40] + // d4: 8b180d08 add x8, x8, x24, lsl #3 + // d8: f9002288 str x8, [x20, #0x40] + // dc: f8787aa0 ldr x0, [x21, x24, lsl #3] + // e0: b9400008 ldr w8, [x0] + // e4: 37f800a8 tbnz w8, #0x1f, 0xf8 + // e8: 71000508 subs w8, w8, #0x1 + // ec: b9000008 str w8, [x0] + // f0: 54000041 b.ne 0xf8 + // f4: 94000000 bl 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // f8: f9402295 ldr x21, [x20, #0x40] + // fc: f900229f str xzr, [x20, #0x40] + // 100: b40000d3 cbz x19, 0x118 + // 104: f80086b3 str x19, [x21], #0x8 + // 108: a8c17bfd ldp x29, x30, [sp], #0x10 + // 10c: 14000000 b 0x10c + // 000000000000010c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 110: a8c17bfd ldp x29, x30, [sp], #0x10 + // 114: 14000000 b 0x114 + // 0000000000000114: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c + // 000000000000011c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[288] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0a, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x2a, 0x2a, + 0xa9, 0xda, 0x69, 0xf8, 0xeb, 0x00, 0x80, 0x92, + 0x3f, 0x01, 0x00, 0xf1, 0x69, 0x11, 0x9f, 0x9a, + 0x4a, 0x05, 0x8a, 0x1a, 0x5f, 0x05, 0x00, 0x71, + 0x01, 0x07, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x58, 0x21, 0x28, 0xcb, 0xaa, 0x7a, 0x78, 0xf8, + 0x4b, 0x05, 0x40, 0xf9, 0x0c, 0x00, 0x00, 0x90, + 0x8c, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0c, 0xeb, + 0x01, 0x06, 0x00, 0x54, 0xa8, 0x2e, 0x28, 0xcb, + 0x17, 0x69, 0x69, 0xf8, 0x48, 0x09, 0x40, 0xf9, + 0xe9, 0x06, 0x40, 0xf9, 0x3f, 0x01, 0x08, 0xeb, + 0x41, 0x05, 0x00, 0x54, 0x48, 0x15, 0x40, 0xf9, + 0x09, 0x11, 0x40, 0xb9, 0x3f, 0x11, 0x00, 0x71, + 0xc1, 0x04, 0x00, 0x54, 0xc9, 0x36, 0x40, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0x6d, 0x04, 0x00, 0x54, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x05, 0x00, 0x51, + 0xc9, 0x36, 0x00, 0xb9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x01, 0x00, 0x80, 0xd2, + 0x00, 0x01, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0xaa, + 0xc8, 0x36, 0x40, 0xb9, 0x08, 0x05, 0x00, 0x11, + 0xc8, 0x36, 0x00, 0xb9, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x0d, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0xa0, 0x7a, 0x78, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xd3, 0x00, 0x00, 0xb4, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyMethodDescr_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x44, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xcc, 0x0, state); + patch_aarch64_trampoline(code + 0xf4, 0x0, state); + patch_aarch64_26r(code + 0x10c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x114, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x11c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_O.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d2b and w11, w9, #0xffff + // 14: 2a2b03e8 mvn w8, w11 + // 18: f868daaa ldr x10, [x21, w8, sxtw #3] + // 1c: 928000ec mov x12, #-0x8 ; =-8 + // 20: f100015f cmp x10, #0x0 + // 24: 9a9f118a csel x10, x12, xzr, ne + // 28: 1a8b056b cinc w11, w11, ne + // 2c: 7100097f cmp w11, #0x2 + // 30: 540002e1 b.ne 0x8c + // 34: 9280002b mov x11, #-0x2 ; =-2 + // 38: cb292177 sub x23, x11, w9, uxth + // 3c: f8777aac ldr x12, [x21, x23, lsl #3] + // 40: f940058b ldr x11, [x12, #0x8] + // 44: 9000000d adrp x13, 0x0 + // 0000000000000044: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethodDescr_Type + // 48: f94001ad ldr x13, [x13] + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethodDescr_Type + // 4c: eb0d017f cmp x11, x13 + // 50: 540001e1 b.ne 0x8c + // 54: f940158b ldr x11, [x12, #0x28] + // 58: b940116d ldr w13, [x11, #0x10] + // 5c: 710021bf cmp w13, #0x8 + // 60: 54000161 b.ne 0x8c + // 64: b94036cd ldr w13, [x22, #0x34] + // 68: 710001bf cmp w13, #0x0 + // 6c: 5400010d b.le 0x8c + // 70: cb292ea9 sub x9, x21, w9, uxth #3 + // 74: 8b0a0129 add x9, x9, x10 + // 78: f9400120 ldr x0, [x9] + // 7c: f940098a ldr x10, [x12, #0x10] + // 80: f940040c ldr x12, [x0, #0x8] + // 84: eb0a019f cmp x12, x10 + // 88: 54000060 b.eq 0x94 + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 94: 93407d18 sxtw x24, w8 + // 98: f9400521 ldr x1, [x9, #0x8] + // 9c: f9400568 ldr x8, [x11, #0x8] + // a0: 510005a9 sub w9, w13, #0x1 + // a4: b90036c9 str w9, [x22, #0x34] + // a8: f9002295 str x21, [x20, #0x40] + // ac: d63f0100 blr x8 + // b0: aa0003f3 mov x19, x0 + // b4: f9402299 ldr x25, [x20, #0x40] + // b8: f900229f str xzr, [x20, #0x40] + // bc: b94036c8 ldr w8, [x22, #0x34] + // c0: 11000508 add w8, w8, #0x1 + // c4: b90036c8 str w8, [x22, #0x34] + // c8: f8777aa0 ldr x0, [x21, x23, lsl #3] + // cc: b9400008 ldr w8, [x0] + // d0: 37f800a8 tbnz w8, #0x1f, 0xe4 + // d4: 71000508 subs w8, w8, #0x1 + // d8: b9000008 str w8, [x0] + // dc: 54000041 b.ne 0xe4 + // e0: 94000000 bl 0xe0 + // 00000000000000e0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e4: f8787aa0 ldr x0, [x21, x24, lsl #3] + // e8: b40000e0 cbz x0, 0x104 + // ec: b9400008 ldr w8, [x0] + // f0: 37f800a8 tbnz w8, #0x1f, 0x104 + // f4: 71000508 subs w8, w8, #0x1 + // f8: b9000008 str w8, [x0] + // fc: 54000041 b.ne 0x104 + // 100: 94000000 bl 0x100 + // 0000000000000100: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 104: 90000008 adrp x8, 0x0 + // 0000000000000104: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 108: f9400108 ldr x8, [x8] + // 0000000000000108: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10c: 72003d1f tst w8, #0xffff + // 110: 54000200 b.eq 0x150 + // 114: 92403d08 and x8, x8, #0xffff + // 118: 9100051a add x26, x8, #0x1 + // 11c: d10022b5 sub x21, x21, #0x8 + // 120: 14000004 b 0x130 + // 124: d100075a sub x26, x26, #0x1 + // 128: f100075f cmp x26, #0x1 + // 12c: 54000129 b.ls 0x150 + // 130: f85f86a0 ldr x0, [x21], #-0x8 + // 134: b9400008 ldr w8, [x0] + // 138: 37ffff68 tbnz w8, #0x1f, 0x124 + // 13c: 71000508 subs w8, w8, #0x1 + // 140: b9000008 str w8, [x0] + // 144: 54ffff01 b.ne 0x124 + // 148: 94000000 bl 0x148 + // 0000000000000148: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 14c: 17fffff6 b 0x124 + // 150: b40000b3 cbz x19, 0x164 + // 154: f8377b33 str x19, [x25, x23, lsl #3] + // 158: 8b180f35 add x21, x25, x24, lsl #3 + // 15c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 160: 14000000 b 0x160 + // 0000000000000160: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 164: 8b170f35 add x21, x25, x23, lsl #3 + // 168: a8c17bfd ldp x29, x30, [sp], #0x10 + // 16c: 14000000 b 0x16c + // 000000000000016c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[368] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x2b, 0x3d, 0x00, 0x12, 0xe8, 0x03, 0x2b, 0x2a, + 0xaa, 0xda, 0x68, 0xf8, 0xec, 0x00, 0x80, 0x92, + 0x5f, 0x01, 0x00, 0xf1, 0x8a, 0x11, 0x9f, 0x9a, + 0x6b, 0x05, 0x8b, 0x1a, 0x7f, 0x09, 0x00, 0x71, + 0xe1, 0x02, 0x00, 0x54, 0x2b, 0x00, 0x80, 0x92, + 0x77, 0x21, 0x29, 0xcb, 0xac, 0x7a, 0x77, 0xf8, + 0x8b, 0x05, 0x40, 0xf9, 0x0d, 0x00, 0x00, 0x90, + 0xad, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0d, 0xeb, + 0xe1, 0x01, 0x00, 0x54, 0x8b, 0x15, 0x40, 0xf9, + 0x6d, 0x11, 0x40, 0xb9, 0xbf, 0x21, 0x00, 0x71, + 0x61, 0x01, 0x00, 0x54, 0xcd, 0x36, 0x40, 0xb9, + 0xbf, 0x01, 0x00, 0x71, 0x0d, 0x01, 0x00, 0x54, + 0xa9, 0x2e, 0x29, 0xcb, 0x29, 0x01, 0x0a, 0x8b, + 0x20, 0x01, 0x40, 0xf9, 0x8a, 0x09, 0x40, 0xf9, + 0x0c, 0x04, 0x40, 0xf9, 0x9f, 0x01, 0x0a, 0xeb, + 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x18, 0x7d, 0x40, 0x93, + 0x21, 0x05, 0x40, 0xf9, 0x68, 0x05, 0x40, 0xf9, + 0xa9, 0x05, 0x00, 0x51, 0xc9, 0x36, 0x00, 0xb9, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xf3, 0x03, 0x00, 0xaa, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc8, 0x36, 0x40, 0xb9, + 0x08, 0x05, 0x00, 0x11, 0xc8, 0x36, 0x00, 0xb9, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x78, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x00, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1a, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0xb3, 0x00, 0x00, 0xb4, 0x33, 0x7b, 0x37, 0xf8, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0xe0, 0x0, state); + patch_aarch64_trampoline(code + 0x100, 0x0, state); + patch_aarch64_33rx(code + 0x104, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x148, 0x0, state); + patch_aarch64_26r(code + 0x160, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x16c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_NON_PY_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_NON_PY_GENERAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d09 and w9, w8, #0xffff + // 14: cb282eaa sub x10, x21, w8, uxth #3 + // 18: 2a2903eb mvn w11, w9 + // 1c: 9280002c mov x12, #-0x2 ; =-2 + // 20: cb282197 sub x23, x12, w8, uxth + // 24: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 28: f86bdaa8 ldr x8, [x21, w11, sxtw #3] + // 2c: 93407d78 sxtw x24, w11 + // 30: 928000eb mov x11, #-0x8 ; =-8 + // 34: f100011f cmp x8, #0x0 + // 38: 9a9f1168 csel x8, x11, xzr, ne + // 3c: 1a890529 cinc w9, w9, ne + // 40: f9002295 str x21, [x20, #0x40] + // 44: 8b080141 add x1, x10, x8 + // 48: b2410122 orr x2, x9, #0x8000000000000000 + // 4c: d2800003 mov x3, #0x0 ; =0 + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 _PyObject_Vectorcall + // 54: aa0003f3 mov x19, x0 + // 58: f9402299 ldr x25, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 64: b9400008 ldr w8, [x0] + // 68: 37f800a8 tbnz w8, #0x1f, 0x7c + // 6c: 71000508 subs w8, w8, #0x1 + // 70: b9000008 str w8, [x0] + // 74: 54000041 b.ne 0x7c + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 7c: f8787aa0 ldr x0, [x21, x24, lsl #3] + // 80: b40000e0 cbz x0, 0x9c + // 84: b9400008 ldr w8, [x0] + // 88: 37f800a8 tbnz w8, #0x1f, 0x9c + // 8c: 71000508 subs w8, w8, #0x1 + // 90: b9000008 str w8, [x0] + // 94: 54000041 b.ne 0x9c + // 98: 94000000 bl 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 9c: 90000008 adrp x8, 0x0 + // 000000000000009c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // a4: 72003d1f tst w8, #0xffff + // a8: 54000200 b.eq 0xe8 + // ac: 92403d08 and x8, x8, #0xffff + // b0: 9100051a add x26, x8, #0x1 + // b4: d10022b5 sub x21, x21, #0x8 + // b8: 14000004 b 0xc8 + // bc: d100075a sub x26, x26, #0x1 + // c0: f100075f cmp x26, #0x1 + // c4: 54000129 b.ls 0xe8 + // c8: f85f86a0 ldr x0, [x21], #-0x8 + // cc: b9400008 ldr w8, [x0] + // d0: 37ffff68 tbnz w8, #0x1f, 0xbc + // d4: 71000508 subs w8, w8, #0x1 + // d8: b9000008 str w8, [x0] + // dc: 54ffff01 b.ne 0xbc + // e0: 94000000 bl 0xe0 + // 00000000000000e0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e4: 17fffff6 b 0xbc + // e8: b40000b3 cbz x19, 0xfc + // ec: f8377b33 str x19, [x25, x23, lsl #3] + // f0: 8b180f35 add x21, x25, x24, lsl #3 + // f4: a8c17bfd ldp x29, x30, [sp], #0x10 + // f8: 14000000 b 0xf8 + // 00000000000000f8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // fc: 8b170f35 add x21, x25, x23, lsl #3 + // 100: a8c17bfd ldp x29, x30, [sp], #0x10 + // 104: 14000000 b 0x104 + // 0000000000000104: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[264] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x3d, 0x00, 0x12, 0xaa, 0x2e, 0x28, 0xcb, + 0xeb, 0x03, 0x29, 0x2a, 0x2c, 0x00, 0x80, 0x92, + 0x97, 0x21, 0x28, 0xcb, 0xa0, 0x7a, 0x77, 0xf8, + 0xa8, 0xda, 0x6b, 0xf8, 0x78, 0x7d, 0x40, 0x93, + 0xeb, 0x00, 0x80, 0x92, 0x1f, 0x01, 0x00, 0xf1, + 0x68, 0x11, 0x9f, 0x9a, 0x29, 0x05, 0x89, 0x1a, + 0x95, 0x22, 0x00, 0xf9, 0x41, 0x01, 0x08, 0x8b, + 0x22, 0x01, 0x41, 0xb2, 0x03, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xa0, 0x7a, 0x78, 0xf8, + 0xe0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x00, 0x02, 0x00, 0x54, 0x08, 0x3d, 0x40, 0x92, + 0x1a, 0x05, 0x00, 0x91, 0xb5, 0x22, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xf6, 0xff, 0xff, 0x17, + 0xb3, 0x00, 0x00, 0xb4, 0x33, 0x7b, 0x37, 0xf8, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x50, 0x15, state); + patch_aarch64_trampoline(code + 0x78, 0x0, state); + patch_aarch64_trampoline(code + 0x98, 0x0, state); + patch_aarch64_33rx(code + 0x9c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xe0, 0x0, state); + patch_aarch64_26r(code + 0xf8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x104, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_STR_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_STR_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f02a8 ldur x8, [x21, #-0x10] + // c: b50000c8 cbnz x8, 0x24 + // 10: f85e82a8 ldur x8, [x21, #-0x18] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 _PyUnicode_Type + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyUnicode_Type + // 1c: eb09011f cmp x8, x9 + // 20: 54000060 b.eq 0x2c + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 2c: f85f82b3 ldur x19, [x21, #-0x8] + // 30: f9002295 str x21, [x20, #0x40] + // 34: aa1303e0 mov x0, x19 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 _PyObject_Str + // 3c: f9402288 ldr x8, [x20, #0x40] + // 40: d1006108 sub x8, x8, #0x18 + // 44: f9002288 str x8, [x20, #0x40] + // 48: b9400268 ldr w8, [x19] + // 4c: 37f80108 tbnz w8, #0x1f, 0x6c + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000268 str w8, [x19] + // 58: 540000a1 b.ne 0x6c + // 5c: aa0003f5 mov x21, x0 + // 60: aa1303e0 mov x0, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: aa1503e0 mov x0, x21 + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: b4000080 cbz x0, 0x84 + // 78: f80086a0 str x0, [x21], #0x8 + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa8, 0x02, 0x5f, 0xf8, 0xc8, 0x00, 0x00, 0xb5, + 0xa8, 0x82, 0x5e, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x38, 0x19, state); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_TUPLE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TUPLE_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f02a8 ldur x8, [x21, #-0x10] + // c: b50000c8 cbnz x8, 0x24 + // 10: f85e82a8 ldur x8, [x21, #-0x18] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 _PyTuple_Type + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyTuple_Type + // 1c: eb09011f cmp x8, x9 + // 20: 54000060 b.eq 0x2c + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 2c: f85f82b3 ldur x19, [x21, #-0x8] + // 30: f9002295 str x21, [x20, #0x40] + // 34: aa1303e0 mov x0, x19 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 _PySequence_Tuple + // 3c: f9402288 ldr x8, [x20, #0x40] + // 40: d1006108 sub x8, x8, #0x18 + // 44: f9002288 str x8, [x20, #0x40] + // 48: b9400268 ldr w8, [x19] + // 4c: 37f80108 tbnz w8, #0x1f, 0x6c + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000268 str w8, [x19] + // 58: 540000a1 b.ne 0x6c + // 5c: aa0003f5 mov x21, x0 + // 60: aa1303e0 mov x0, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: aa1503e0 mov x0, x21 + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: b4000080 cbz x0, 0x84 + // 78: f80086a0 str x0, [x21], #0x8 + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa8, 0x02, 0x5f, 0xf8, 0xc8, 0x00, 0x00, 0xb5, + 0xa8, 0x82, 0x5e, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x38, 0x1a, state); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_TYPE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TYPE_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f0d09 ldr x9, [x8, #-0x10]! + // 8: b50000c9 cbnz x9, 0x20 + // c: f85e82a9 ldur x9, [x21, #-0x18] + // 10: 9000000a adrp x10, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PyType_Type + // 14: f940014a ldr x10, [x10] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyType_Type + // 18: eb0a013f cmp x9, x10 + // 1c: 54000040 b.eq 0x24 + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: f9400500 ldr x0, [x8, #0x8] + // 28: f9400409 ldr x9, [x0, #0x8] + // 2c: b940012a ldr w10, [x9] + // 30: 37f8006a tbnz w10, #0x1f, 0x3c + // 34: 1100054a add w10, w10, #0x1 + // 38: b900012a str w10, [x9] + // 3c: f81e82a9 stur x9, [x21, #-0x18] + // 40: f9002288 str x8, [x20, #0x40] + // 44: b9400008 ldr w8, [x0] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000008 str w8, [x0] + // 54: 54000080 b.eq 0x64 + // 58: f9402295 ldr x21, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 68: 910003fd mov x29, sp + // 6c: 94000000 bl 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 70: a8c17bfd ldp x29, x30, [sp], #0x10 + // 74: f9402295 ldr x21, [x20, #0x40] + // 78: f900229f str xzr, [x20, #0x40] + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[128] = { + 0xe8, 0x03, 0x15, 0xaa, 0x09, 0x0d, 0x5f, 0xf8, + 0xc9, 0x00, 0x00, 0xb5, 0xa9, 0x82, 0x5e, 0xf8, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x05, 0x40, 0xf9, + 0x09, 0x04, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0x82, 0x1e, 0xf8, + 0x88, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyType_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyType_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x6c, 0x0, state); + patch_aarch64_26r(code + 0x7c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_AND_ALLOCATE_OBJECT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_AND_ALLOCATE_OBJECT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d08 and w8, w8, #0xffff + // 14: 2a2803f7 mvn w23, w8 + // 18: f877daa9 ldr x9, [x21, w23, sxtw #3] + // 1c: b5000629 cbnz x9, 0xe0 + // 20: 12800029 mov w9, #-0x2 ; =-2 + // 24: 4b080133 sub w19, w9, w8 + // 28: f873daa0 ldr x0, [x21, w19, sxtw #3] + // 2c: f9400408 ldr x8, [x0, #0x8] + // 30: 3942ad08 ldrb w8, [x8, #0xab] + // 34: 36380568 tbz w8, #0x7, 0xe0 + // 38: b9418008 ldr w8, [x0, #0x180] + // 3c: 90000009 adrp x9, 0x0 + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 40: f9400129 ldr x9, [x9] + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 44: 6b09011f cmp w8, w9 + // 48: 540004c1 b.ne 0xe0 + // 4c: f9407ac8 ldr x8, [x22, #0xf0] + // 50: b4000488 cbz x8, 0xe0 + // 54: f941d018 ldr x24, [x0, #0x3a0] + // 58: f9401b09 ldr x9, [x24, #0x30] + // 5c: 9000000a adrp x10, 0x0 + // 000000000000005c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_InitCleanup + // 60: f940014a ldr x10, [x10] + // 0000000000000060: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_InitCleanup + // 64: b9804d29 ldrsw x9, [x9, #0x4c] + // 68: b9804d4a ldrsw x10, [x10, #0x4c] + // 6c: 8b090149 add x9, x10, x9 + // 70: f9407eca ldr x10, [x22, #0xf8] + // 74: cb080148 sub x8, x10, x8 + // 78: eb880d3f cmp x9, x8, asr #3 + // 7c: 5400032a b.ge 0xe0 + // 80: f9002295 str x21, [x20, #0x40] + // 84: d2800001 mov x1, #0x0 ; =0 + // 88: 94000000 bl 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 _PyType_GenericAlloc + // 8c: f9402288 ldr x8, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: b40002a0 cbz x0, 0xe8 + // 98: f837daa0 str x0, [x21, w23, sxtw #3] + // 9c: f873daa0 ldr x0, [x21, w19, sxtw #3] + // a0: b9400309 ldr w9, [x24] + // a4: 37f80069 tbnz w9, #0x1f, 0xb0 + // a8: 11000529 add w9, w9, #0x1 + // ac: b9000309 str w9, [x24] + // b0: f833dab8 str x24, [x21, w19, sxtw #3] + // b4: f9002288 str x8, [x20, #0x40] + // b8: b9400008 ldr w8, [x0] + // bc: 37f800a8 tbnz w8, #0x1f, 0xd0 + // c0: 71000508 subs w8, w8, #0x1 + // c4: b9000008 str w8, [x0] + // c8: 54000041 b.ne 0xd0 + // cc: 94000000 bl 0xcc + // 00000000000000cc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // d0: f9402295 ldr x21, [x20, #0x40] + // d4: f900229f str xzr, [x20, #0x40] + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 + // 00000000000000e4: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // e8: aa0803f5 mov x21, x8 + // ec: a8c17bfd ldp x29, x30, [sp], #0x10 + // f0: 14000000 b 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // f4: 00 00 00 00 + const unsigned char code_body[248] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xf7, 0x03, 0x28, 0x2a, + 0xa9, 0xda, 0x77, 0xf8, 0x29, 0x06, 0x00, 0xb5, + 0x29, 0x00, 0x80, 0x12, 0x33, 0x01, 0x08, 0x4b, + 0xa0, 0xda, 0x73, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0x68, 0x05, 0x38, 0x36, + 0x08, 0x80, 0x41, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0xc1, 0x04, 0x00, 0x54, 0xc8, 0x7a, 0x40, 0xf9, + 0x88, 0x04, 0x00, 0xb4, 0x18, 0xd0, 0x41, 0xf9, + 0x09, 0x1b, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x29, 0x4d, 0x80, 0xb9, + 0x4a, 0x4d, 0x80, 0xb9, 0x49, 0x01, 0x09, 0x8b, + 0xca, 0x7e, 0x40, 0xf9, 0x48, 0x01, 0x08, 0xcb, + 0x3f, 0x0d, 0x88, 0xeb, 0x2a, 0x03, 0x00, 0x54, + 0x95, 0x22, 0x00, 0xf9, 0x01, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x00, 0x94, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x02, 0x00, 0xb4, + 0xa0, 0xda, 0x37, 0xf8, 0xa0, 0xda, 0x73, 0xf8, + 0x09, 0x03, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x03, 0x00, 0xb9, + 0xb8, 0xda, 0x33, 0xf8, 0x88, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x08, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_InitCleanup+0x0 + // 8: OPERAND0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x5c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x88, 0x1b, state); + patch_aarch64_trampoline(code + 0xcc, 0x0, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xe4, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0xf0, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_CLASS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 3942ad29 ldrb w9, [x9, #0xab] + // c: 363800e9 tbz w9, #0x7, 0x28 + // 10: b9418108 ldr w8, [x8, #0x180] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 1c: 6b09011f cmp w8, w9 + // 20: 54000041 b.ne 0x28 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0xad, 0x42, 0x39, 0xe9, 0x00, 0x38, 0x36, + 0x08, 0x81, 0x41, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_METHOD_LAZY_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: 8b292108 add x8, x8, w9, uxth + // 10: f85e8108 ldur x8, [x8, #-0x18] + // 14: b4000048 cbz x8, 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x21, 0x29, 0x8b, + 0x08, 0x81, 0x5e, 0xf8, 0x48, 0x00, 0x00, 0xb4, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_ATTR_MODULE_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_MODULE_PUSH_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: f9404929 ldr x9, [x9, #0x90] + // c: 9000000a adrp x10, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyModule_Type + // 10: f940014a ldr x10, [x10] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyModule_Type + // 14: f940494a ldr x10, [x10, #0x90] + // 18: eb0a013f cmp x9, x10 + // 1c: 54000141 b.ne 0x44 + // 20: f9400908 ldr x8, [x8, #0x10] + // 24: f9401108 ldr x8, [x8, #0x20] + // 28: b9400d09 ldr w9, [x8, #0xc] + // 2c: 9000000a adrp x10, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 30: f940014a ldr x10, [x10] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 34: 6b0a013f cmp w9, w10 + // 38: 54000061 b.ne 0x44 + // 3c: f80086a8 str x8, [x21], #0x8 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0x49, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x4a, 0x49, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x41, 0x01, 0x00, 0x54, + 0x08, 0x09, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x0d, 0x40, 0xb9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0x6b, + 0x61, 0x00, 0x00, 0x54, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &PyModule_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyModule_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_WITH_HINT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f85e8108 ldur x8, [x8, #-0x18] + // 8: b4000068 cbz x8, 0x14 + // c: f80086a8 str x8, [x21], #0x8 + // 10: 14000000 b 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[24] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x81, 0x5e, 0xf8, + 0x68, 0x00, 0x00, 0xb4, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_CALL_BOUND_METHOD_EXACT_ARGS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d08 and w8, w8, #0xffff + // c: 2a2803e9 mvn w9, w8 + // 10: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 14: b5000129 cbnz x9, 0x38 + // 18: 12800029 mov w9, #-0x2 ; =-2 + // 1c: 4b080128 sub w8, w9, w8 + // 20: f868daa8 ldr x8, [x21, w8, sxtw #3] + // 24: f9400508 ldr x8, [x8, #0x8] + // 28: 90000009 adrp x9, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 2c: f9400129 ldr x9, [x9] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 30: eb09011f cmp x8, x9 + // 34: 54000040 b.eq 0x3c + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[64] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0xa9, 0xda, 0x69, 0xf8, 0x29, 0x01, 0x00, 0xb5, + 0x29, 0x00, 0x80, 0x12, 0x28, 0x01, 0x08, 0x4b, + 0xa8, 0xda, 0x68, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyMethod_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_EG_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EG_MATCH.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 10: f9002295 str x21, [x20, #0x40] + // 14: aa1603e0 mov x0, x22 + // 18: aa1303e1 mov x1, x19 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyEval_CheckExceptStarTypeValid + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: 37f80560 tbnz w0, #0x1f, 0xd4 + // 2c: a9007fff stp xzr, xzr, [sp] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 910023e3 add x3, sp, #0x8 + // 38: 910003e4 mov x4, sp + // 3c: aa1403e0 mov x0, x20 + // 40: aa1703e1 mov x1, x23 + // 44: aa1303e2 mov x2, x19 + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __PyEval_ExceptionGroupMatch + // 4c: aa0003f8 mov x24, x0 + // 50: f9402295 ldr x21, [x20, #0x40] + // 54: f900229f str xzr, [x20, #0x40] + // 58: b94002e8 ldr w8, [x23] + // 5c: 37f800c8 tbnz w8, #0x1f, 0x74 + // 60: 71000508 subs w8, w8, #0x1 + // 64: b90002e8 str w8, [x23] + // 68: 54000061 b.ne 0x74 + // 6c: aa1703e0 mov x0, x23 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 74: b9400268 ldr w8, [x19] + // 78: 37f80088 tbnz w8, #0x1f, 0x88 + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000268 str w8, [x19] + // 84: 54000480 b.eq 0x114 + // 88: 37f803f8 tbnz w24, #0x1f, 0x104 + // 8c: f94007e0 ldr x0, [sp, #0x8] + // 90: b40003a0 cbz x0, 0x104 + // 94: 90000008 adrp x8, 0x0 + // 0000000000000094: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 9c: eb08001f cmp x0, x8 + // a0: 54000100 b.eq 0xc0 + // a4: d10042a8 sub x8, x21, #0x10 + // a8: f9002288 str x8, [x20, #0x40] + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 _PyErr_SetHandledException + // b0: f9402288 ldr x8, [x20, #0x40] + // b4: f900229f str xzr, [x20, #0x40] + // b8: 91004115 add x21, x8, #0x10 + // bc: f94007e8 ldr x8, [sp, #0x8] + // c0: f94003e9 ldr x9, [sp] + // c4: a93f22a9 stp x9, x8, [x21, #-0x10] + // c8: a9417bfd ldp x29, x30, [sp, #0x10] + // cc: 910083ff add sp, sp, #0x20 + // d0: 14000000 b 0xd0 + // 00000000000000d0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // d4: b94002e8 ldr w8, [x23] + // d8: 37f800c8 tbnz w8, #0x1f, 0xf0 + // dc: 71000508 subs w8, w8, #0x1 + // e0: b90002e8 str w8, [x23] + // e4: 54000061 b.ne 0xf0 + // e8: aa1703e0 mov x0, x23 + // ec: 94000000 bl 0xec + // 00000000000000ec: ARM64_RELOC_BRANCH26 __Py_Dealloc + // f0: b9400268 ldr w8, [x19] + // f4: 37f80088 tbnz w8, #0x1f, 0x104 + // f8: 71000508 subs w8, w8, #0x1 + // fc: b9000268 str w8, [x19] + // 100: 54000120 b.eq 0x124 + // 104: d10042b5 sub x21, x21, #0x10 + // 108: a9417bfd ldp x29, x30, [sp, #0x10] + // 10c: 910083ff add sp, sp, #0x20 + // 110: 14000000 b 0x110 + // 0000000000000110: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 114: aa1303e0 mov x0, x19 + // 118: 94000000 bl 0x118 + // 0000000000000118: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 11c: 36fffb98 tbz w24, #0x1f, 0x8c + // 120: 17fffff9 b 0x104 + // 124: aa1303e0 mov x0, x19 + // 128: 94000000 bl 0x128 + // 0000000000000128: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 12c: d10042b5 sub x21, x21, #0x10 + // 130: a9417bfd ldp x29, x30, [sp, #0x10] + // 134: 910083ff add sp, sp, #0x20 + // 138: 14000000 b 0x138 + // 0000000000000138: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 13c: 00 00 00 00 + const unsigned char code_body[320] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xb7, 0x4e, 0x7f, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x60, 0x05, 0xf8, 0x37, 0xff, 0x7f, 0x00, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0xe3, 0x23, 0x00, 0x91, + 0xe4, 0x03, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf8, 0x03, 0x00, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x80, 0x04, 0x00, 0x54, + 0xf8, 0x03, 0xf8, 0x37, 0xe0, 0x07, 0x40, 0xf9, + 0xa0, 0x03, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x08, 0xeb, + 0x00, 0x01, 0x00, 0x54, 0xa8, 0x42, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x41, 0x00, 0x91, 0xe8, 0x07, 0x40, 0xf9, + 0xe9, 0x03, 0x40, 0xf9, 0xa9, 0x22, 0x3f, 0xa9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x20, 0x01, 0x00, 0x54, 0xb5, 0x42, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x98, 0xfb, 0xff, 0x36, + 0xf9, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xb5, 0x42, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x1e, state); + patch_aarch64_trampoline(code + 0x48, 0x1d, state); + patch_aarch64_trampoline(code + 0x70, 0x0, state); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xac, 0x1c, state); + patch_aarch64_26r(code + 0xd0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xec, 0x0, state); + patch_aarch64_26r(code + 0x110, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x118, 0x0, state); + patch_aarch64_trampoline(code + 0x128, 0x0, state); + patch_aarch64_26r(code + 0x138, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_EXC_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EXC_MATCH.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1603e0 mov x0, x22 + // 14: aa1303e1 mov x1, x19 + // 18: 94000000 bl 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __PyEval_CheckExceptTypeValid + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: 37f80320 tbnz w0, #0x1f, 0x88 + // 28: f9002295 str x21, [x20, #0x40] + // 2c: aa1703e0 mov x0, x23 + // 30: aa1303e1 mov x1, x19 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 _PyErr_GivenExceptionMatches + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80108 tbnz w8, #0x1f, 0x64 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a1 b.ne 0x64 + // 54: aa0003f7 mov x23, x0 + // 58: aa1303e0 mov x0, x19 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 60: aa1703e0 mov x0, x23 + // 64: 90000008 adrp x8, 0x0 + // 0000000000000064: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 6c: 90000009 adrp x9, 0x0 + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 70: f9400129 ldr x9, [x9] + // 0000000000000070: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 74: 7100001f cmp w0, #0x0 + // 78: 9a880128 csel x8, x9, x8, eq + // 7c: f81f82a8 stur x8, [x21, #-0x8] + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 88: b9400268 ldr w8, [x19] + // 8c: 37f80088 tbnz w8, #0x1f, 0x9c + // 90: 71000508 subs w8, w8, #0x1 + // 94: b9000268 str w8, [x19] + // 98: 54000080 b.eq 0xa8 + // 9c: d10022b5 sub x21, x21, #0x8 + // a0: a8c17bfd ldp x29, x30, [sp], #0x10 + // a4: 14000000 b 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a8: aa1303e0 mov x0, x19 + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b0: d10022b5 sub x21, x21, #0x8 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x03, 0xf8, 0x37, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x00, 0x71, + 0x28, 0x01, 0x88, 0x9a, 0xa8, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x18, 0x20, state); + patch_aarch64_trampoline(code + 0x34, 0x1f, state); + patch_aarch64_trampoline(code + 0x5c, 0x0, state); + patch_aarch64_33rx(code + 0x64, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xa4, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xac, 0x0, state); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400a88 ldr x8, [x20, #0x10] + // 4: b9409108 ldr w8, [x8, #0x90] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 10: 6b09011f cmp w8, w9 + // 14: 54000041 b.ne 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[32] = { + 0x88, 0x0a, 0x40, 0xf9, 0x08, 0x91, 0x40, 0xb9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_EXACT_ARGS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d08 and w8, w8, #0xffff + // c: 2a2803e9 mvn w9, w8 + // 10: 1280002a mov w10, #-0x2 ; =-2 + // 14: 4b08014a sub w10, w10, w8 + // 18: f86adaaa ldr x10, [x21, w10, sxtw #3] + // 1c: f940194a ldr x10, [x10, #0x30] + // 20: b940354a ldr w10, [x10, #0x34] + // 24: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 28: f100013f cmp x9, #0x0 + // 2c: 1a880508 cinc w8, w8, ne + // 30: 6b08015f cmp w10, w8 + // 34: 54000041 b.ne 0x3c + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0x2a, 0x00, 0x80, 0x12, 0x4a, 0x01, 0x08, 0x4b, + 0xaa, 0xda, 0x6a, 0xf8, 0x4a, 0x19, 0x40, 0xf9, + 0x4a, 0x35, 0x40, 0xb9, 0xa9, 0xda, 0x69, 0xf8, + 0x3f, 0x01, 0x00, 0xf1, 0x08, 0x05, 0x88, 0x1a, + 0x5f, 0x01, 0x08, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92800029 mov x9, #-0x2 ; =-2 + // c: cb282128 sub x8, x9, w8, uxth + // 10: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 14: f9400509 ldr x9, [x8, #0x8] + // 18: 9000000a adrp x10, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFunction_Type + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFunction_Type + // 20: eb0a013f cmp x9, x10 + // 24: 540000e1 b.ne 0x40 + // 28: b9409108 ldr w8, [x8, #0x90] + // 2c: 90000009 adrp x9, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 30: f9400129 ldr x9, [x9] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 34: 6b09011f cmp w8, w9 + // 38: 54000041 b.ne 0x40 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x92, 0x28, 0x21, 0x28, 0xcb, + 0xa8, 0x7a, 0x68, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0xe1, 0x00, 0x00, 0x54, + 0x08, 0x91, 0x40, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x40, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_VERSION_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_INLINE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND1 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND1 + // 8: b9409108 ldr w8, [x8, #0x90] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: 6b09011f cmp w8, w9 + // 18: 54000041 b.ne 0x20 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x91, 0x40, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: OPERAND1 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->operand1); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_KW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92800049 mov x9, #-0x3 ; =-3 + // c: cb282128 sub x8, x9, w8, uxth + // 10: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 14: f9400509 ldr x9, [x8, #0x8] + // 18: 9000000a adrp x10, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFunction_Type + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFunction_Type + // 20: eb0a013f cmp x9, x10 + // 24: 540000e1 b.ne 0x40 + // 28: b9409108 ldr w8, [x8, #0x90] + // 2c: 90000009 adrp x9, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 30: f9400129 ldr x9, [x9] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 34: 6b09011f cmp w8, w9 + // 38: 54000041 b.ne 0x40 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x49, 0x00, 0x80, 0x92, 0x28, 0x21, 0x28, 0xcb, + 0xa8, 0x7a, 0x68, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0xe1, 0x00, 0x00, 0x54, + 0x08, 0x91, 0x40, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x40, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92800029 mov x9, #-0x2 ; =-2 + // c: cb282128 sub x8, x9, w8, uxth + // 10: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 14: f9400508 ldr x8, [x8, #0x8] + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFunction_Type + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFunction_Type + // 20: eb09011f cmp x8, x9 + // 24: 540000c0 b.eq 0x3c + // 28: 90000009 adrp x9, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 2c: f9400129 ldr x9, [x9] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 30: eb09011f cmp x8, x9 + // 34: 54000040 b.eq 0x3c + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x92, 0x28, 0x21, 0x28, 0xcb, + 0xa8, 0x7a, 0x68, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xc0, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyMethod_Type+0x0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE_KW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92800049 mov x9, #-0x3 ; =-3 + // c: cb282128 sub x8, x9, w8, uxth + // 10: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 14: f9400508 ldr x8, [x8, #0x8] + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFunction_Type + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFunction_Type + // 20: eb09011f cmp x8, x9 + // 24: 540000c0 b.eq 0x3c + // 28: 90000009 adrp x9, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 2c: f9400129 ldr x9, [x9] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 30: eb09011f cmp x8, x9 + // 34: 54000040 b.eq 0x3c + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x49, 0x00, 0x80, 0x92, 0x28, 0x21, 0x28, 0xcb, + 0xa8, 0x7a, 0x68, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xc0, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyMethod_Type+0x0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_MANAGED_OBJECT_HAS_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_MANAGED_OBJECT_HAS_VALUES.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: f9401129 ldr x9, [x9, #0x20] + // c: 8b090108 add x8, x8, x9 + // 10: 39400d08 ldrb w8, [x8, #0x3] + // 14: 34000048 cbz w8, 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0x11, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0x08, 0x0d, 0x40, 0x39, 0x48, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_METHOD_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d08 and w8, w8, #0xffff + // c: 12800029 mov w9, #-0x2 ; =-2 + // 10: 4b080129 sub w9, w9, w8 + // 14: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 18: f940052a ldr x10, [x9, #0x8] + // 1c: 9000000b adrp x11, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 20: f940016b ldr x11, [x11] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 24: eb0b015f cmp x10, x11 + // 28: 540001e1 b.ne 0x64 + // 2c: f9400929 ldr x9, [x9, #0x10] + // 30: f940052a ldr x10, [x9, #0x8] + // 34: 9000000b adrp x11, 0x0 + // 0000000000000034: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFunction_Type + // 38: f940016b ldr x11, [x11] + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFunction_Type + // 3c: eb0b015f cmp x10, x11 + // 40: 54000121 b.ne 0x64 + // 44: b9409129 ldr w9, [x9, #0x90] + // 48: 9000000a adrp x10, 0x0 + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 4c: f940014a ldr x10, [x10] + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 50: 6b0a013f cmp w9, w10 + // 54: 54000081 b.ne 0x64 + // 58: 2a2803e8 mvn w8, w8 + // 5c: f868daa8 ldr x8, [x21, w8, sxtw #3] + // 60: b4000048 cbz x8, 0x68 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 6c: 00 00 00 00 + const unsigned char code_body[112] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0x29, 0x00, 0x80, 0x12, + 0x29, 0x01, 0x08, 0x4b, 0xa9, 0xda, 0x69, 0xf8, + 0x2a, 0x05, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0xe1, 0x01, 0x00, 0x54, 0x29, 0x09, 0x40, 0xf9, + 0x2a, 0x05, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0x21, 0x01, 0x00, 0x54, 0x29, 0x91, 0x40, 0xb9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0x6b, 0x81, 0x00, 0x00, 0x54, + 0xe8, 0x03, 0x28, 0x2a, 0xa8, 0xda, 0x68, 0xf8, + 0x48, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data); + patch_aarch64_26r(code + 0x64, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x68, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_METHOD_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION_KW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92403d08 and x8, x8, #0xffff + // c: 92800049 mov x9, #-0x3 ; =-3 + // 10: cb080129 sub x9, x9, x8 + // 14: f8697aa9 ldr x9, [x21, x9, lsl #3] + // 18: f940052a ldr x10, [x9, #0x8] + // 1c: 9000000b adrp x11, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 20: f940016b ldr x11, [x11] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 24: eb0b015f cmp x10, x11 + // 28: 54000201 b.ne 0x68 + // 2c: f9400929 ldr x9, [x9, #0x10] + // 30: f940052a ldr x10, [x9, #0x8] + // 34: 9000000b adrp x11, 0x0 + // 0000000000000034: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFunction_Type + // 38: f940016b ldr x11, [x11] + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFunction_Type + // 3c: eb0b015f cmp x10, x11 + // 40: 54000141 b.ne 0x68 + // 44: b9409129 ldr w9, [x9, #0x90] + // 48: 9000000a adrp x10, 0x0 + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 4c: f940014a ldr x10, [x10] + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 50: 6b0a013f cmp w9, w10 + // 54: 540000a1 b.ne 0x68 + // 58: 92800029 mov x9, #-0x2 ; =-2 + // 5c: cb080128 sub x8, x9, x8 + // 60: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 64: b4000048 cbz x8, 0x6c + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 6c: 14000000 b 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[112] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x49, 0x00, 0x80, 0x92, + 0x29, 0x01, 0x08, 0xcb, 0xa9, 0x7a, 0x69, 0xf8, + 0x2a, 0x05, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0x01, 0x02, 0x00, 0x54, 0x29, 0x09, 0x40, 0xf9, + 0x2a, 0x05, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0x41, 0x01, 0x00, 0x54, 0x29, 0x91, 0x40, 0xb9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0x6b, 0xa1, 0x00, 0x00, 0x54, + 0x29, 0x00, 0x80, 0x92, 0x28, 0x01, 0x08, 0xcb, + 0xa8, 0x7a, 0x68, 0xf8, 0x48, 0x00, 0x00, 0xb4, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_PEP_523( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PEP_523.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400ac8 ldr x8, [x22, #0x10] + // 4: f950a508 ldr x8, [x8, #0x2148] + // 8: b4000048 cbz x8, 0x10 + // c: 14000000 b 0xc + // 000000000000000c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 10: 14000000 b 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 14: 00 00 00 00 + const unsigned char code_body[24] = { + 0xc8, 0x0a, 0x40, 0xf9, 0x08, 0xa5, 0x50, 0xf9, + 0x48, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x10, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_PERIODIC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400ec8 ldr x8, [x22, #0x18] + // 4: f2401d1f tst x8, #0xff + // 8: 54000160 b.eq 0x34 + // c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 10: 910003fd mov x29, sp + // 14: f9002295 str x21, [x20, #0x40] + // 18: aa1603e0 mov x0, x22 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __Py_HandlePending + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: a8c17bfd ldp x29, x30, [sp], #0x10 + // 2c: 34000040 cbz w0, 0x34 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0xc8, 0x0e, 0x40, 0xf9, 0x1f, 0x1d, 0x40, 0xf2, + 0x60, 0x01, 0x00, 0x54, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x40, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x21, state); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC_IF_NOT_YIELD_FROM.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 370801c8 tbnz w8, #0x1, 0x40 + // c: f9400ec8 ldr x8, [x22, #0x18] + // 10: f2401d1f tst x8, #0xff + // 14: 54000160 b.eq 0x40 + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: 910003fd mov x29, sp + // 20: f9002295 str x21, [x20, #0x40] + // 24: aa1603e0 mov x0, x22 + // 28: 94000000 bl 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __Py_HandlePending + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 34000040 cbz w0, 0x40 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x01, 0x08, 0x37, 0xc8, 0x0e, 0x40, 0xf9, + 0x1f, 0x1d, 0x40, 0xf2, 0x60, 0x01, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x40, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x28, 0x21, state); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_STACK_SPACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9407ac8 ldr x8, [x22, #0xf0] + // 4: b40001e8 cbz x8, 0x40 + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 9280002a mov x10, #-0x2 ; =-2 + // 14: cb292149 sub x9, x10, w9, uxth + // 18: f8697aa9 ldr x9, [x21, x9, lsl #3] + // 1c: f9401929 ldr x9, [x9, #0x30] + // 20: b9804d29 ldrsw x9, [x9, #0x4c] + // 24: f9407eca ldr x10, [x22, #0xf8] + // 28: cb080148 sub x8, x10, x8 + // 2c: eb880d3f cmp x9, x8, asr #3 + // 30: 5400008a b.ge 0x40 + // 34: b9402ec8 ldr w8, [x22, #0x2c] + // 38: 7100051f cmp w8, #0x1 + // 3c: 5400004c b.gt 0x44 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[72] = { + 0xc8, 0x7a, 0x40, 0xf9, 0xe8, 0x01, 0x00, 0xb4, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x2a, 0x00, 0x80, 0x92, 0x49, 0x21, 0x29, 0xcb, + 0xa9, 0x7a, 0x69, 0xf8, 0x29, 0x19, 0x40, 0xf9, + 0x29, 0x4d, 0x80, 0xb9, 0xca, 0x7e, 0x40, 0xf9, + 0x48, 0x01, 0x08, 0xcb, 0x3f, 0x0d, 0x88, 0xeb, + 0x8a, 0x00, 0x00, 0x54, 0xc8, 0x2e, 0x40, 0xb9, + 0x1f, 0x05, 0x00, 0x71, 0x4c, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_STACK_SPACE_OPERAND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE_OPERAND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9407ac8 ldr x8, [x22, #0xf0] + // 4: b4000168 cbz x8, 0x30 + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 10: f9407eca ldr x10, [x22, #0xf8] + // 14: cb080148 sub x8, x10, x8 + // 18: 9343fd08 asr x8, x8, #3 + // 1c: eb29c11f cmp x8, w9, sxtw + // 20: 5400008d b.le 0x30 + // 24: b9402ec8 ldr w8, [x22, #0x2c] + // 28: 7100051f cmp w8, #0x1 + // 2c: 5400004c b.gt 0x34 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0xc8, 0x7a, 0x40, 0xf9, 0x68, 0x01, 0x00, 0xb4, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0xca, 0x7e, 0x40, 0xf9, 0x48, 0x01, 0x08, 0xcb, + 0x08, 0xfd, 0x43, 0x93, 0x1f, 0xc1, 0x29, 0xeb, + 0x8d, 0x00, 0x00, 0x54, 0xc8, 0x2e, 0x40, 0xb9, + 0x1f, 0x05, 0x00, 0x71, 0x4c, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_VALIDITY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 8: 39408908 ldrb w8, [x8, #0x22] + // c: 37000048 tbnz w8, #0x0, 0x14 + // 10: 14000000 b 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x89, 0x40, 0x39, 0x48, 0x00, 0x00, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: EXECUTOR + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x10, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_VALIDITY_AND_SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY_AND_SET_IP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 8: 39408908 ldrb w8, [x8, #0x22] + // c: 37000048 tbnz w8, #0x0, 0x14 + // 10: 14000000 b 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 14: 90000008 adrp x8, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 1c: f9001e88 str x8, [x20, #0x38] + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x89, 0x40, 0x39, 0x48, 0x00, 0x00, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x88, 0x1e, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: EXECUTOR + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x10, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COMPARE_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000019 adrp x25, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400339 ldr x25, [x25] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: a97f62b7 ldp x23, x24, [x21, #-0x10] + // 14: f9002295 str x21, [x20, #0x40] + // 18: 53053f22 ubfx w2, w25, #5, #11 + // 1c: aa1703e0 mov x0, x23 + // 20: aa1803e1 mov x1, x24 + // 24: 94000000 bl 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 _PyObject_RichCompare + // 28: aa0003f3 mov x19, x0 + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: b94002e8 ldr w8, [x23] + // 38: 37f800c8 tbnz w8, #0x1f, 0x50 + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b90002e8 str w8, [x23] + // 44: 54000061 b.ne 0x50 + // 48: aa1703e0 mov x0, x23 + // 4c: 94000000 bl 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 50: b9400308 ldr w8, [x24] + // 54: 37f80088 tbnz w8, #0x1f, 0x64 + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000308 str w8, [x24] + // 60: 540003a0 b.eq 0xd4 + // 64: b40003f3 cbz x19, 0xe0 + // 68: 12003f28 and w8, w25, #0xffff + // 6c: 372000a8 tbnz w8, #0x4, 0x80 + // 70: d10042b5 sub x21, x21, #0x10 + // 74: f80086b3 str x19, [x21], #0x8 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 80: d10042a8 sub x8, x21, #0x10 + // 84: f9002288 str x8, [x20, #0x40] + // 88: aa1303e0 mov x0, x19 + // 8c: 94000000 bl 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 _PyObject_IsTrue + // 90: b9400268 ldr w8, [x19] + // 94: 37f80088 tbnz w8, #0x1f, 0xa4 + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b9000268 str w8, [x19] + // a0: 54000260 b.eq 0xec + // a4: f9402295 ldr x21, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: 37f801c0 tbnz w0, #0x1f, 0xe4 + // b0: 90000008 adrp x8, 0x0 + // 00000000000000b0: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // b4: f9400108 ldr x8, [x8] + // 00000000000000b4: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // b8: 90000009 adrp x9, 0x0 + // 00000000000000b8: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // bc: f9400129 ldr x9, [x9] + // 00000000000000bc: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // c0: 7100001f cmp w0, #0x0 + // c4: 9a880133 csel x19, x9, x8, eq + // c8: f80086b3 str x19, [x21], #0x8 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 + // 00000000000000d0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // d4: aa1803e0 mov x0, x24 + // d8: 94000000 bl 0xd8 + // 00000000000000d8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // dc: b5fffc73 cbnz x19, 0x68 + // e0: d10042b5 sub x21, x21, #0x10 + // e4: a8c17bfd ldp x29, x30, [sp], #0x10 + // e8: 14000000 b 0xe8 + // 00000000000000e8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // ec: aa0003f5 mov x21, x0 + // f0: aa1303e0 mov x0, x19 + // f4: 94000000 bl 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // f8: aa1503e0 mov x0, x21 + // fc: f9402295 ldr x21, [x20, #0x40] + // 100: f900229f str xzr, [x20, #0x40] + // 104: 36fffd60 tbz w0, #0x1f, 0xb0 + // 108: 17fffff7 b 0xe4 + // 10c: 00 00 00 00 + const unsigned char code_body[272] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x19, 0x00, 0x00, 0x90, 0x39, 0x03, 0x40, 0xf9, + 0xb7, 0x62, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x22, 0x3f, 0x05, 0x53, 0xe0, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x03, 0x00, 0x54, 0xf3, 0x03, 0x00, 0xb4, + 0x28, 0x3f, 0x00, 0x12, 0xa8, 0x00, 0x20, 0x37, + 0xb5, 0x42, 0x00, 0xd1, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xa8, 0x42, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x02, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x01, 0xf8, 0x37, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x00, 0x00, 0x71, 0x33, 0x01, 0x88, 0x9a, + 0xb3, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x73, 0xfc, 0xff, 0xb5, + 0xb5, 0x42, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x60, 0xfd, 0xff, 0x36, + 0xf7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_trampoline(code + 0x24, 0x23, state); + patch_aarch64_trampoline(code + 0x4c, 0x0, state); + patch_aarch64_26r(code + 0x7c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x8c, 0x22, state); + patch_aarch64_33rx(code + 0xb0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xb8, (uintptr_t)data); + patch_aarch64_26r(code + 0xd0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xd8, 0x0, state); + patch_aarch64_26r(code + 0xe8, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xf4, 0x0, state); +} + +void +emit__COMPARE_OP_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: aa1503f3 mov x19, x21 + // c: f85f8e77 ldr x23, [x19, #-0x8]! + // 10: f85f8278 ldur x24, [x19, #-0x8] + // 14: fd400b08 ldr d8, [x24, #0x10] + // 18: fd400ae9 ldr d9, [x23, #0x10] + // 1c: b9400308 ldr w8, [x24] + // 20: 37f801c8 tbnz w8, #0x1f, 0x58 + // 24: 71000508 subs w8, w8, #0x1 + // 28: b9000308 str w8, [x24] + // 2c: 54000161 b.ne 0x58 + // 30: 90000009 adrp x9, 0x0 + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 34: f9400129 ldr x9, [x9] + // 0000000000000034: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 38: f9532128 ldr x8, [x9, #0x2640] + // 3c: b40000a8 cbz x8, 0x50 + // 40: f9532522 ldr x2, [x9, #0x2648] + // 44: aa1803e0 mov x0, x24 + // 48: 52800021 mov w1, #0x1 ; =1 + // 4c: d63f0100 blr x8 + // 50: aa1803e0 mov x0, x24 + // 54: 94000000 bl 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __PyFloat_ExactDealloc + // 58: b94002e8 ldr w8, [x23] + // 5c: 37f801c8 tbnz w8, #0x1f, 0x94 + // 60: 71000508 subs w8, w8, #0x1 + // 64: b90002e8 str w8, [x23] + // 68: 54000161 b.ne 0x94 + // 6c: 90000009 adrp x9, 0x0 + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 70: f9400129 ldr x9, [x9] + // 0000000000000070: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 74: f9532128 ldr x8, [x9, #0x2640] + // 78: b40000a8 cbz x8, 0x8c + // 7c: f9532522 ldr x2, [x9, #0x2648] + // 80: aa1703e0 mov x0, x23 + // 84: 52800021 mov w1, #0x1 ; =1 + // 88: d63f0100 blr x8 + // 8c: aa1703e0 mov x0, x23 + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __PyFloat_ExactDealloc + // 94: 1e692100 fcmp d8, d9 + // 98: 1a9fb7e8 cset w8, ge + // 9c: 1a9f87e9 cset w9, ls + // a0: 2a080528 orr w8, w9, w8, lsl #1 + // a4: 90000009 adrp x9, 0x0 + // 00000000000000a4: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // a8: f9400129 ldr x9, [x9] + // 00000000000000a8: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // ac: 12003d29 and w9, w9, #0xffff + // b0: 1ac82528 lsr w8, w9, w8 + // b4: 90000009 adrp x9, 0x0 + // 00000000000000b4: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // b8: f9400129 ldr x9, [x9] + // 00000000000000b8: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // bc: 9000000a adrp x10, 0x0 + // 00000000000000bc: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // c0: f940014a ldr x10, [x10] + // 00000000000000c0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // c4: 7200011f tst w8, #0x1 + // c8: 9a890148 csel x8, x10, x9, eq + // cc: f81f02a8 stur x8, [x21, #-0x10] + // d0: aa1303f5 mov x21, x19 + // d4: a8c17bfd ldp x29, x30, [sp], #0x10 + // d8: 14000000 b 0xd8 + // 00000000000000d8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // dc: 00 00 00 00 + const unsigned char code_body[224] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x03, 0x15, 0xaa, 0x77, 0x8e, 0x5f, 0xf8, + 0x78, 0x82, 0x5f, 0xf8, 0x08, 0x0b, 0x40, 0xfd, + 0xe9, 0x0a, 0x40, 0xfd, 0x08, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x00, 0x21, 0x69, 0x1e, + 0xe8, 0xb7, 0x9f, 0x1a, 0xe9, 0x87, 0x9f, 0x1a, + 0x28, 0x05, 0x08, 0x2a, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x29, 0x3d, 0x00, 0x12, + 0x28, 0x25, 0xc8, 0x1a, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x00, 0x72, + 0x48, 0x01, 0x89, 0x9a, 0xa8, 0x02, 0x1f, 0xf8, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + // 18: &_PyRuntime+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0x54, 0x24, state); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0x90, 0x24, state); + patch_aarch64_33rx(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xb4, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xbc, (uintptr_t)data); + patch_aarch64_26r(code + 0xd8, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COMPARE_OP_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f3 mov x19, x21 + // 4: f85f8e77 ldr x23, [x19, #-0x8]! + // 8: f85f8278 ldur x24, [x19, #-0x8] + // c: f9400b19 ldr x25, [x24, #0x10] + // 10: f100433f cmp x25, #0x10 + // 14: 54000082 b.hs 0x24 + // 18: f9400afa ldr x26, [x23, #0x10] + // 1c: f100435f cmp x26, #0x10 + // 20: 54000043 b.lo 0x28 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 910003fd mov x29, sp + // 30: b9401b1c ldr w28, [x24, #0x18] + // 34: b9401afb ldr w27, [x23, #0x18] + // 38: b9400308 ldr w8, [x24] + // 3c: 37f801c8 tbnz w8, #0x1f, 0x74 + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000308 str w8, [x24] + // 48: 54000161 b.ne 0x74 + // 4c: 90000009 adrp x9, 0x0 + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 50: f9400129 ldr x9, [x9] + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 54: f9532128 ldr x8, [x9, #0x2640] + // 58: b40000a8 cbz x8, 0x6c + // 5c: f9532522 ldr x2, [x9, #0x2648] + // 60: aa1803e0 mov x0, x24 + // 64: 52800021 mov w1, #0x1 ; =1 + // 68: d63f0100 blr x8 + // 6c: aa1803e0 mov x0, x24 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // 74: b94002e8 ldr w8, [x23] + // 78: 37f801c8 tbnz w8, #0x1f, 0xb0 + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b90002e8 str w8, [x23] + // 84: 54000161 b.ne 0xb0 + // 88: 90000009 adrp x9, 0x0 + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 8c: f9400129 ldr x9, [x9] + // 000000000000008c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 90: f9532128 ldr x8, [x9, #0x2640] + // 94: b40000a8 cbz x8, 0xa8 + // 98: f9532522 ldr x2, [x9, #0x2648] + // 9c: aa1703e0 mov x0, x23 + // a0: 52800021 mov w1, #0x1 ; =1 + // a4: d63f0100 blr x8 + // a8: aa1703e0 mov x0, x23 + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // b0: 92400728 and x8, x25, #0x3 + // b4: 9ba8f388 umsubl x8, w28, w8, x28 + // b8: 92400749 and x9, x26, #0x3 + // bc: 9ba9ef69 umsubl x9, w27, w9, x27 + // c0: eb09011f cmp x8, x9 + // c4: 1a9fb7e8 cset w8, ge + // c8: 1a9fc7e9 cset w9, le + // cc: 2a080528 orr w8, w9, w8, lsl #1 + // d0: 90000009 adrp x9, 0x0 + // 00000000000000d0: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // d4: f9400129 ldr x9, [x9] + // 00000000000000d4: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // d8: 12003d29 and w9, w9, #0xffff + // dc: 1ac82528 lsr w8, w9, w8 + // e0: 90000009 adrp x9, 0x0 + // 00000000000000e0: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // e4: f9400129 ldr x9, [x9] + // 00000000000000e4: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // e8: 9000000a adrp x10, 0x0 + // 00000000000000e8: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // ec: f940014a ldr x10, [x10] + // 00000000000000ec: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // f0: 7200011f tst w8, #0x1 + // f4: 9a890148 csel x8, x10, x9, eq + // f8: f81f02a8 stur x8, [x21, #-0x10] + // fc: aa1303f5 mov x21, x19 + // 100: a8c17bfd ldp x29, x30, [sp], #0x10 + // 104: 14000000 b 0x104 + // 0000000000000104: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[264] = { + 0xf3, 0x03, 0x15, 0xaa, 0x77, 0x8e, 0x5f, 0xf8, + 0x78, 0x82, 0x5f, 0xf8, 0x19, 0x0b, 0x40, 0xf9, + 0x3f, 0x43, 0x00, 0xf1, 0x82, 0x00, 0x00, 0x54, + 0xfa, 0x0a, 0x40, 0xf9, 0x5f, 0x43, 0x00, 0xf1, + 0x43, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x1c, 0x1b, 0x40, 0xb9, 0xfb, 0x1a, 0x40, 0xb9, + 0x08, 0x03, 0x40, 0xb9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x28, 0x07, 0x40, 0x92, 0x88, 0xf3, 0xa8, 0x9b, + 0x49, 0x07, 0x40, 0x92, 0x69, 0xef, 0xa9, 0x9b, + 0x1f, 0x01, 0x09, 0xeb, 0xe8, 0xb7, 0x9f, 0x1a, + 0xe9, 0xc7, 0x9f, 0x1a, 0x28, 0x05, 0x08, 0x2a, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x29, 0x3d, 0x00, 0x12, 0x28, 0x25, 0xc8, 0x1a, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x00, 0x72, 0x48, 0x01, 0x89, 0x9a, + 0xa8, 0x02, 0x1f, 0xf8, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + // 18: &_PyRuntime+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0x70, 0x2, state); + patch_aarch64_33rx(code + 0x88, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0xac, 0x2, state); + patch_aarch64_33rx(code + 0xd0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xe0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xe8, (uintptr_t)data); + patch_aarch64_26r(code + 0x104, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COMPARE_OP_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_STR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: aa1503f3 mov x19, x21 + // c: f85f8e77 ldr x23, [x19, #-0x8]! + // 10: f85f8279 ldur x25, [x19, #-0x8] + // 14: aa1903e0 mov x0, x25 + // 18: aa1703e1 mov x1, x23 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __PyUnicode_Equal + // 20: aa0003f8 mov x24, x0 + // 24: b9400328 ldr w8, [x25] + // 28: 37f801c8 tbnz w8, #0x1f, 0x60 + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000328 str w8, [x25] + // 34: 54000161 b.ne 0x60 + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 40: f9532128 ldr x8, [x9, #0x2640] + // 44: b40000a8 cbz x8, 0x58 + // 48: f9532522 ldr x2, [x9, #0x2648] + // 4c: aa1903e0 mov x0, x25 + // 50: 52800021 mov w1, #0x1 ; =1 + // 54: d63f0100 blr x8 + // 58: aa1903e0 mov x0, x25 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __PyUnicode_ExactDealloc + // 60: b94002e8 ldr w8, [x23] + // 64: 37f801c8 tbnz w8, #0x1f, 0x9c + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b90002e8 str w8, [x23] + // 70: 54000161 b.ne 0x9c + // 74: 90000009 adrp x9, 0x0 + // 0000000000000074: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 78: f9400129 ldr x9, [x9] + // 0000000000000078: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 7c: f9532128 ldr x8, [x9, #0x2640] + // 80: b40000a8 cbz x8, 0x94 + // 84: f9532522 ldr x2, [x9, #0x2648] + // 88: aa1703e0 mov x0, x23 + // 8c: 52800021 mov w1, #0x1 ; =1 + // 90: d63f0100 blr x8 + // 94: aa1703e0 mov x0, x23 + // 98: 94000000 bl 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __PyUnicode_ExactDealloc + // 9c: 90000008 adrp x8, 0x0 + // 000000000000009c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // a4: 11001f09 add w9, w24, #0x7 + // a8: 0a090108 and w8, w8, w9 + // ac: 90000009 adrp x9, 0x0 + // 00000000000000ac: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // b0: f9400129 ldr x9, [x9] + // 00000000000000b0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // b4: 9000000a adrp x10, 0x0 + // 00000000000000b4: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // b8: f940014a ldr x10, [x10] + // 00000000000000b8: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // bc: 72003d1f tst w8, #0xffff + // c0: 9a890148 csel x8, x10, x9, eq + // c4: f81f02a8 stur x8, [x21, #-0x10] + // c8: aa1303f5 mov x21, x19 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 + // 00000000000000d0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // d4: 00 00 00 00 + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x03, 0x15, 0xaa, 0x77, 0x8e, 0x5f, 0xf8, + 0x79, 0x82, 0x5f, 0xf8, 0xe0, 0x03, 0x19, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf8, 0x03, 0x00, 0xaa, 0x28, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x21, 0x53, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x25, 0x53, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0x1f, 0x00, 0x11, + 0x08, 0x01, 0x09, 0x0a, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x48, 0x01, 0x89, 0x9a, 0xa8, 0x02, 0x1f, 0xf8, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + // 18: &_PyRuntime+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x25, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0x5c, 0x4, state); + patch_aarch64_33rx(code + 0x74, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0x98, 0x4, state); + patch_aarch64_33rx(code + 0x9c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xac, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xb4, (uintptr_t)data); + patch_aarch64_26r(code + 0xd0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CONTAINS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f62b7 ldp x23, x24, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1803e0 mov x0, x24 + // 14: aa1703e1 mov x1, x23 + // 18: 94000000 bl 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 _PySequence_Contains + // 1c: aa0003f3 mov x19, x0 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b94002e8 ldr w8, [x23] + // 2c: 37f800c8 tbnz w8, #0x1f, 0x44 + // 30: 71000508 subs w8, w8, #0x1 + // 34: b90002e8 str w8, [x23] + // 38: 54000061 b.ne 0x44 + // 3c: aa1703e0 mov x0, x23 + // 40: 94000000 bl 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 44: b9400308 ldr w8, [x24] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000308 str w8, [x24] + // 54: 540001c0 b.eq 0x8c + // 58: 37f80213 tbnz w19, #0x1f, 0x98 + // 5c: 90000008 adrp x8, 0x0 + // 000000000000005c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 60: f9400108 ldr x8, [x8] + // 0000000000000060: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 64: 90000009 adrp x9, 0x0 + // 0000000000000064: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 68: f9400129 ldr x9, [x9] + // 0000000000000068: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 6c: 9000000a adrp x10, 0x0 + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 70: f940014a ldr x10, [x10] + // 0000000000000070: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 74: 6b28227f cmp w19, w8, uxth + // 78: 9a890148 csel x8, x10, x9, eq + // 7c: f81f02a8 stur x8, [x21, #-0x10] + // 80: d10022b5 sub x21, x21, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 8c: aa1803e0 mov x0, x24 + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: 36fffe53 tbz w19, #0x1f, 0x5c + // 98: d10042b5 sub x21, x21, #0x10 + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x62, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x03, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xc0, 0x01, 0x00, 0x54, + 0x13, 0x02, 0xf8, 0x37, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x7f, 0x22, 0x28, 0x6b, + 0x48, 0x01, 0x89, 0x9a, 0xa8, 0x02, 0x1f, 0xf8, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x53, 0xfe, 0xff, 0x36, + 0xb5, 0x42, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x18, 0x26, state); + patch_aarch64_trampoline(code + 0x40, 0x0, state); + patch_aarch64_33rx(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x64, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); +} + +void +emit__CONTAINS_OP_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9400668 ldr x8, [x19, #0x8] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 18: eb09011f cmp x8, x9 + // 1c: 54000060 b.eq 0x28 + // 20: a8c17bfd ldp x29, x30, [sp], #0x10 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 28: f85f02b7 ldur x23, [x21, #-0x10] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: aa1303e0 mov x0, x19 + // 34: aa1703e1 mov x1, x23 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 _PyDict_Contains + // 3c: aa0003f5 mov x21, x0 + // 40: f9402298 ldr x24, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: b94002e8 ldr w8, [x23] + // 4c: 37f800c8 tbnz w8, #0x1f, 0x64 + // 50: 71000508 subs w8, w8, #0x1 + // 54: b90002e8 str w8, [x23] + // 58: 54000061 b.ne 0x64 + // 5c: aa1703e0 mov x0, x23 + // 60: 94000000 bl 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 64: b9400268 ldr w8, [x19] + // 68: 37f80088 tbnz w8, #0x1f, 0x78 + // 6c: 71000508 subs w8, w8, #0x1 + // 70: b9000268 str w8, [x19] + // 74: 540001c0 b.eq 0xac + // 78: 37f80215 tbnz w21, #0x1f, 0xb8 + // 7c: 90000008 adrp x8, 0x0 + // 000000000000007c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 84: 90000009 adrp x9, 0x0 + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 8c: 9000000a adrp x10, 0x0 + // 000000000000008c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 90: f940014a ldr x10, [x10] + // 0000000000000090: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 94: 6b2822bf cmp w21, w8, uxth + // 98: 9a890148 csel x8, x10, x9, eq + // 9c: f81f0308 stur x8, [x24, #-0x10] + // a0: d1002315 sub x21, x24, #0x8 + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // ac: aa1303e0 mov x0, x19 + // b0: 94000000 bl 0xb0 + // 00000000000000b0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b4: 36fffe55 tbz w21, #0x1f, 0x7c + // b8: d1004315 sub x21, x24, #0x10 + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // c4: 00 00 00 00 + const unsigned char code_body[200] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xb7, 0x02, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf5, 0x03, 0x00, 0xaa, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x01, 0x00, 0x54, + 0x15, 0x02, 0xf8, 0x37, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0xbf, 0x22, 0x28, 0x6b, + 0x48, 0x01, 0x89, 0x9a, 0x08, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x55, 0xfe, 0xff, 0x36, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + // 18: &PyDict_Type+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x38, 0x27, state); + patch_aarch64_trampoline(code + 0x60, 0x0, state); + patch_aarch64_33rx(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x8c, (uintptr_t)data); + patch_aarch64_26r(code + 0xa8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xb0, 0x0, state); + patch_aarch64_26r(code + 0xc0, state->instruction_starts[instruction->error_target]); +} + +void +emit__CONTAINS_OP_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_SET.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9400668 ldr x8, [x19, #0x8] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PySet_Type + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PySet_Type + // 18: eb09011f cmp x8, x9 + // 1c: 90000009 adrp x9, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFrozenSet_Type + // 20: f9400129 ldr x9, [x9] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFrozenSet_Type + // 24: fa491104 ccmp x8, x9, #0x4, ne + // 28: 54000441 b.ne 0xb0 + // 2c: f85f02b7 ldur x23, [x21, #-0x10] + // 30: f9002295 str x21, [x20, #0x40] + // 34: aa1303e0 mov x0, x19 + // 38: aa1703e1 mov x1, x23 + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __PySet_Contains + // 40: aa0003f5 mov x21, x0 + // 44: f9402298 ldr x24, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: b94002e8 ldr w8, [x23] + // 50: 37f800c8 tbnz w8, #0x1f, 0x68 + // 54: 71000508 subs w8, w8, #0x1 + // 58: b90002e8 str w8, [x23] + // 5c: 54000061 b.ne 0x68 + // 60: aa1703e0 mov x0, x23 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: b9400268 ldr w8, [x19] + // 6c: 37f80088 tbnz w8, #0x1f, 0x7c + // 70: 71000508 subs w8, w8, #0x1 + // 74: b9000268 str w8, [x19] + // 78: 54000200 b.eq 0xb8 + // 7c: 37f80255 tbnz w21, #0x1f, 0xc4 + // 80: 90000008 adrp x8, 0x0 + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 88: 90000009 adrp x9, 0x0 + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 8c: f9400129 ldr x9, [x9] + // 000000000000008c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 90: 9000000a adrp x10, 0x0 + // 0000000000000090: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 94: f940014a ldr x10, [x10] + // 0000000000000094: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 98: 6b2822bf cmp w21, w8, uxth + // 9c: 9a890148 csel x8, x10, x9, eq + // a0: f81f0308 stur x8, [x24, #-0x10] + // a4: d1002315 sub x21, x24, #0x8 + // a8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // b8: aa1303e0 mov x0, x19 + // bc: 94000000 bl 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c0: 36fffe15 tbz w21, #0x1f, 0x80 + // c4: d1004315 sub x21, x24, #0x10 + // c8: a8c17bfd ldp x29, x30, [sp], #0x10 + // cc: 14000000 b 0xcc + // 00000000000000cc: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[208] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x04, 0x11, 0x49, 0xfa, + 0x41, 0x04, 0x00, 0x54, 0xb7, 0x02, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xf5, 0x03, 0x00, 0xaa, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x00, 0x02, 0x00, 0x54, 0x55, 0x02, 0xf8, 0x37, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0xbf, 0x22, 0x28, 0x6b, 0x48, 0x01, 0x89, 0x9a, + 0x08, 0x03, 0x1f, 0xf8, 0x15, 0x23, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x15, 0xfe, 0xff, 0x36, 0x15, 0x43, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + // 18: &PyFrozenSet_Type+0x0 + // 20: &PySet_Type+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&PyFrozenSet_Type); + patch_64(data + 0x20, (uintptr_t)&PySet_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x20); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data + 0x18); + patch_aarch64_trampoline(code + 0x3c, 0x28, state); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_33rx(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x88, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x90, (uintptr_t)data); + patch_aarch64_26r(code + 0xac, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xb4, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0xbc, 0x0, state); + patch_aarch64_26r(code + 0xcc, state->instruction_starts[instruction->error_target]); +} + +void +emit__CONVERT_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONVERT_VALUE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 92403d08 and x8, x8, #0xffff + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __PyEval_ConversionFuncs + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyEval_ConversionFuncs + // 20: f8687928 ldr x8, [x9, x8, lsl #3] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1303e0 mov x0, x19 + // 2c: d63f0100 blr x8 + // 30: f9402288 ldr x8, [x20, #0x40] + // 34: d1002108 sub x8, x8, #0x8 + // 38: f9002288 str x8, [x20, #0x40] + // 3c: b9400268 ldr w8, [x19] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000268 str w8, [x19] + // 4c: 540000e0 b.eq 0x68 + // 50: f9402295 ldr x21, [x20, #0x40] + // 54: f900229f str xzr, [x20, #0x40] + // 58: b4000160 cbz x0, 0x84 + // 5c: f80086a0 str x0, [x21], #0x8 + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 68: aa0003f5 mov x21, x0 + // 6c: aa1303e0 mov x0, x19 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 74: aa1503e0 mov x0, x21 + // 78: f9402295 ldr x21, [x20, #0x40] + // 7c: f900229f str xzr, [x20, #0x40] + // 80: b5fffee0 cbnz x0, 0x5c + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x3d, 0x40, 0x92, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x79, 0x68, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x60, 0x01, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x15, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe0, 0xfe, 0xff, 0xb5, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_ConversionFuncs+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_ConversionFuncs); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x70, 0x0, state); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__COPY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: cb282ea8 sub x8, x21, w8, uxth #3 + // c: f9400108 ldr x8, [x8] + // 10: b9400109 ldr w9, [x8] + // 14: 37f80069 tbnz w9, #0x1f, 0x20 + // 18: 11000529 add w9, w9, #0x1 + // 1c: b9000109 str w9, [x8] + // 20: f80086a8 str x8, [x21], #0x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x2e, 0x28, 0xcb, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COPY_FREE_VARS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY_FREE_VARS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000009 adrp x9, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400129 ldr x9, [x9] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 72003d3f tst w9, #0xffff + // c: 540002a0 b.eq 0x60 + // 10: f9400288 ldr x8, [x20] + // 14: b9404908 ldr w8, [x8, #0x48] + // 18: 4b29210a sub w10, w8, w9, uxth + // 1c: f9400a88 ldr x8, [x20, #0x10] + // 20: f9402508 ldr x8, [x8, #0x48] + // 24: 91006108 add x8, x8, #0x18 + // 28: 92403d29 and x9, x9, #0xffff + // 2c: 8b2ace8a add x10, x20, w10, sxtw #3 + // 30: 9101414a add x10, x10, #0x50 + // 34: 14000005 b 0x48 + // 38: f800854b str x11, [x10], #0x8 + // 3c: 91002108 add x8, x8, #0x8 + // 40: f1000529 subs x9, x9, #0x1 + // 44: 540000e0 b.eq 0x60 + // 48: f940010b ldr x11, [x8] + // 4c: b940016c ldr w12, [x11] + // 50: 37ffff4c tbnz w12, #0x1f, 0x38 + // 54: 1100058c add w12, w12, #0x1 + // 58: b900016c str w12, [x11] + // 5c: 17fffff7 b 0x38 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x3f, 0x3d, 0x00, 0x72, 0xa0, 0x02, 0x00, 0x54, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x49, 0x40, 0xb9, + 0x0a, 0x21, 0x29, 0x4b, 0x88, 0x0a, 0x40, 0xf9, + 0x08, 0x25, 0x40, 0xf9, 0x08, 0x61, 0x00, 0x91, + 0x29, 0x3d, 0x40, 0x92, 0x8a, 0xce, 0x2a, 0x8b, + 0x4a, 0x41, 0x01, 0x91, 0x05, 0x00, 0x00, 0x14, + 0x4b, 0x85, 0x00, 0xf8, 0x08, 0x21, 0x00, 0x91, + 0x29, 0x05, 0x00, 0xf1, 0xe0, 0x00, 0x00, 0x54, + 0x0b, 0x01, 0x40, 0xf9, 0x6c, 0x01, 0x40, 0xb9, + 0x4c, 0xff, 0xff, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x6c, 0x01, 0x00, 0xb9, 0xf7, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CREATE_INIT_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CREATE_INIT_FRAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d48 and w8, w10, #0xffff + // 14: cb2a2ea9 sub x9, x21, w10, uxth #3 + // 18: 9280002b mov x11, #-0x2 ; =-2 + // 1c: cb2a216a sub x10, x11, w10, uxth + // 20: f9407ad3 ldr x19, [x22, #0xf0] + // 24: 9000000b adrp x11, 0x0 + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_InitCleanup + // 28: f940016b ldr x11, [x11] + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_InitCleanup + // 2c: 6949316d ldpsw x13, x12, [x11, #0x48] + // 30: 8b0c0e6c add x12, x19, x12, lsl #3 + // 34: f9007acc str x12, [x22, #0xf0] + // 38: 9000000c adrp x12, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 3c: f940018c ldr x12, [x12] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 40: f9002295 str x21, [x20, #0x40] + // 44: a900b274 stp x20, x12, [x19, #0x8] + // 48: 2a2803ec mvn w12, w8 + // 4c: f900026b str x11, [x19] + // 50: 8b0d0e6d add x13, x19, x13, lsl #3 + // 54: 910161ad add x13, x13, #0x58 + // 58: a902fe7f stp xzr, xzr, [x19, #0x28] + // 5c: 9103416b add x11, x11, #0xd0 + // 60: a903b66b stp x11, x13, [x19, #0x38] + // 64: b9004a7f str wzr, [x19, #0x48] + // 68: f940228b ldr x11, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: f86cdaac ldr x12, [x21, w12, sxtw #3] + // 74: b940018d ldr w13, [x12] + // 78: 37f8006d tbnz w13, #0x1f, 0x84 + // 7c: 110005ad add w13, w13, #0x1 + // 80: b900018d str w13, [x12] + // 84: f9002a6c str x12, [x19, #0x50] + // 88: f900228b str x11, [x20, #0x40] + // 8c: d1002123 sub x3, x9, #0x8 + // 90: 11000504 add w4, w8, #0x1 + // 94: d37df157 lsl x23, x10, #3 + // 98: f8776aa1 ldr x1, [x21, x23] + // 9c: aa1603e0 mov x0, x22 + // a0: d2800002 mov x2, #0x0 ; =0 + // a4: d2800005 mov x5, #0x0 ; =0 + // a8: aa1303e6 mov x6, x19 + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __PyEvalFramePushAndInit + // b0: f9402288 ldr x8, [x20, #0x40] + // b4: f900229f str xzr, [x20, #0x40] + // b8: 8b170115 add x21, x8, x23 + // bc: b4000120 cbz x0, 0xe0 + // c0: 52800088 mov w8, #0x4 ; =4 + // c4: 79009288 strh w8, [x20, #0x48] + // c8: b9402ec8 ldr w8, [x22, #0x2c] + // cc: 51000508 sub w8, w8, #0x1 + // d0: b9002ec8 str w8, [x22, #0x2c] + // d4: f80086a0 str x0, [x21], #0x8 + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: aa1603e0 mov x0, x22 + // e4: aa1303e1 mov x1, x19 + // e8: 94000000 bl 0xe8 + // 00000000000000e8: ARM64_RELOC_BRANCH26 __PyEval_FrameClearAndPop + // ec: a8c17bfd ldp x29, x30, [sp], #0x10 + // f0: 14000000 b 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // f4: 00 00 00 00 + const unsigned char code_body[248] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x48, 0x3d, 0x00, 0x12, 0xa9, 0x2e, 0x2a, 0xcb, + 0x2b, 0x00, 0x80, 0x92, 0x6a, 0x21, 0x2a, 0xcb, + 0xd3, 0x7a, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x6d, 0x31, 0x49, 0x69, + 0x6c, 0x0e, 0x0c, 0x8b, 0xcc, 0x7a, 0x00, 0xf9, + 0x0c, 0x00, 0x00, 0x90, 0x8c, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x74, 0xb2, 0x00, 0xa9, + 0xec, 0x03, 0x28, 0x2a, 0x6b, 0x02, 0x00, 0xf9, + 0x6d, 0x0e, 0x0d, 0x8b, 0xad, 0x61, 0x01, 0x91, + 0x7f, 0xfe, 0x02, 0xa9, 0x6b, 0x41, 0x03, 0x91, + 0x6b, 0xb6, 0x03, 0xa9, 0x7f, 0x4a, 0x00, 0xb9, + 0x8b, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xac, 0xda, 0x6c, 0xf8, 0x8d, 0x01, 0x40, 0xb9, + 0x6d, 0x00, 0xf8, 0x37, 0xad, 0x05, 0x00, 0x11, + 0x8d, 0x01, 0x00, 0xb9, 0x6c, 0x2a, 0x00, 0xf9, + 0x8b, 0x22, 0x00, 0xf9, 0x23, 0x21, 0x00, 0xd1, + 0x04, 0x05, 0x00, 0x11, 0x57, 0xf1, 0x7d, 0xd3, + 0xa1, 0x6a, 0x77, 0xf8, 0xe0, 0x03, 0x16, 0xaa, + 0x02, 0x00, 0x80, 0xd2, 0x05, 0x00, 0x80, 0xd2, + 0xe6, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x01, 0x17, 0x8b, 0x20, 0x01, 0x00, 0xb4, + 0x88, 0x00, 0x80, 0x52, 0x88, 0x92, 0x00, 0x79, + 0xc8, 0x2e, 0x40, 0xb9, 0x08, 0x05, 0x00, 0x51, + 0xc8, 0x2e, 0x00, 0xb9, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_InitCleanup+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xac, 0x2a, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xe8, 0x29, state); + patch_aarch64_26r(code + 0xf0, state->instruction_starts[instruction->error_target]); +} + +void +emit__DELETE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_ATTR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d01 ldr x1, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1303e0 mov x0, x19 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 _PyObject_DelAttr + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: b9400268 ldr w8, [x19] + // 3c: 37f80088 tbnz w8, #0x1f, 0x4c + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000268 str w8, [x19] + // 48: 540000a0 b.eq 0x5c + // 4c: d10022b5 sub x21, x21, #0x8 + // 50: 34000120 cbz w0, 0x74 + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 5c: aa0003f7 mov x23, x0 + // 60: aa1303e0 mov x0, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: aa1703e0 mov x0, x23 + // 6c: d10022b5 sub x21, x21, #0x8 + // 70: 35ffff20 cbnz w0, 0x54 + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x01, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0x20, 0x01, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0xb5, 0x22, 0x00, 0xd1, + 0x20, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x2c, 0x2b, state); + patch_aarch64_26r(code + 0x58, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DELETE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_DEREF.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 8b282e88 add x8, x20, w8, uxth #3 + // 14: f9402908 ldr x8, [x8, #0x50] + // 18: f9400900 ldr x0, [x8, #0x10] + // 1c: f900091f str xzr, [x8, #0x10] + // 20: b4000160 cbz x0, 0x4c + // 24: f9002295 str x21, [x20, #0x40] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 54000200 b.eq 0x78 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 4c: 90000008 adrp x8, 0x0 + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 50: f9400108 ldr x8, [x8] + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 54: f9002295 str x21, [x20, #0x40] + // 58: f9400281 ldr x1, [x20] + // 5c: 12003d02 and w2, w8, #0xffff + // 60: aa1603e0 mov x0, x22 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __PyEval_FormatExcUnbound + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: a8c17bfd ldp x29, x30, [sp], #0x10 + // 74: 14000000 b 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x00, 0x09, 0x40, 0xf9, 0x1f, 0x09, 0x00, 0xf9, + 0x60, 0x01, 0x00, 0xb4, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x00, 0x02, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x81, 0x02, 0x40, 0xf9, 0x02, 0x3d, 0x00, 0x12, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x64, 0x2c, state); + patch_aarch64_26r(code + 0x74, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x78, 0x0, state); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DELETE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_FAST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 91014288 add x8, x20, #0x50 + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 92403d21 and x1, x9, #0xffff + // 18: f8617900 ldr x0, [x8, x1, lsl #3] + // 1c: b4000180 cbz x0, 0x4c + // 20: f821791f str xzr, [x8, x1, lsl #3] + // 24: f9002295 str x21, [x20, #0x40] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 540002c0 b.eq 0x90 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 4c: f9002295 str x21, [x20, #0x40] + // 50: 90000008 adrp x8, 0x0 + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_UnboundLocalError + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_UnboundLocalError + // 58: f9400113 ldr x19, [x8] + // 5c: f9400288 ldr x8, [x20] + // 60: f9403100 ldr x0, [x8, #0x60] + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 _PyTuple_GetItem + // 68: aa0003e3 mov x3, x0 + // 6c: 90000002 adrp x2, 0x0 + // 000000000000006c: ARM64_RELOC_PAGE21 l_.str + // 70: 91000042 add x2, x2, #0x0 + // 0000000000000070: ARM64_RELOC_PAGEOFF12 l_.str + // 74: aa1603e0 mov x0, x22 + // 78: aa1303e1 mov x1, x19 + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __PyEval_FormatExcCheckArg + // 80: f9402295 ldr x21, [x20, #0x40] + // 84: f900229f str xzr, [x20, #0x40] + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: 14000000 b 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: f9402295 ldr x21, [x20, #0x40] + // 98: f900229f str xzr, [x20, #0x40] + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x88, 0x42, 0x01, 0x91, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x21, 0x3d, 0x40, 0x92, + 0x00, 0x79, 0x61, 0xf8, 0x80, 0x01, 0x00, 0xb4, + 0x1f, 0x79, 0x21, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xc0, 0x02, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x13, 0x01, 0x40, 0xf9, 0x88, 0x02, 0x40, 0xf9, + 0x00, 0x31, 0x40, 0xf9, 0x00, 0x00, 0x00, 0x94, + 0xe3, 0x03, 0x00, 0xaa, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: &PyExc_UnboundLocalError+0x0 + // 58: OPARG + const unsigned char data_body[96] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x58, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x58); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x50, (uintptr_t)data + 0x50); + patch_aarch64_trampoline(code + 0x64, 0x2e, state); + patch_aarch64_21r(code + 0x6c, (uintptr_t)data); + patch_aarch64_12(code + 0x70, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x7c, 0x2d, state); + patch_aarch64_26r(code + 0x8c, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_26r(code + 0xa0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DELETE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_GLOBAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f9400288 ldr x8, [x20] + // c: f9401108 ldr x8, [x8, #0x20] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 18: 8b292d08 add x8, x8, w9, uxth #3 + // 1c: f9400d13 ldr x19, [x8, #0x18] + // 20: f9002295 str x21, [x20, #0x40] + // 24: f9400e80 ldr x0, [x20, #0x18] + // 28: aa1303e1 mov x1, x19 + // 2c: d2800002 mov x2, #0x0 ; =0 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 _PyDict_Pop + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: 37f80080 tbnz w0, #0x1f, 0x4c + // 40: 340000a0 cbz w0, 0x54 + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: 14000000 b 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 54: f9002295 str x21, [x20, #0x40] + // 58: 90000008 adrp x8, 0x0 + // 0000000000000058: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_NameError + // 5c: f9400108 ldr x8, [x8] + // 000000000000005c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_NameError + // 60: f9400101 ldr x1, [x8] + // 64: 90000002 adrp x2, 0x0 + // 0000000000000064: ARM64_RELOC_PAGE21 l_.str + // 68: 91000042 add x2, x2, #0x0 + // 0000000000000068: ARM64_RELOC_PAGEOFF12 l_.str + // 6c: aa1603e0 mov x0, x22 + // 70: aa1303e3 mov x3, x19 + // 74: 94000000 bl 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __PyEval_FormatExcCheckArg + // 78: f9402295 ldr x21, [x20, #0x40] + // 7c: f900229f str xzr, [x20, #0x40] + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x13, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x80, 0x0e, 0x40, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0x02, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0xf8, 0x37, + 0xa0, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0xe3, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "name '%.200s' is not defined\x00" + // 1d: 00 00 00 + // 20: &PyExc_NameError+0x0 + // 28: OPARG + const unsigned char data_body[48] = { + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 0x2e, + 0x32, 0x30, 0x30, 0x73, 0x27, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x28, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x28); + patch_aarch64_trampoline(code + 0x30, 0x2f, state); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x50, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0x58, (uintptr_t)data + 0x20); + patch_aarch64_21r(code + 0x64, (uintptr_t)data); + patch_aarch64_12(code + 0x68, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x74, 0x2d, state); + patch_aarch64_26r(code + 0x84, state->instruction_starts[instruction->error_target]); +} + +void +emit__DELETE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_NAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d13 ldr x19, [x8, #0x18] + // 24: f9401680 ldr x0, [x20, #0x28] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: b4000280 cbz x0, 0x7c + // 30: aa1303e1 mov x1, x19 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 _PyObject_DelItem + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: 34000380 cbz w0, 0xb0 + // 44: f9002295 str x21, [x20, #0x40] + // 48: 90000008 adrp x8, 0x0 + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_NameError + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_NameError + // 50: f9400101 ldr x1, [x8] + // 54: 90000002 adrp x2, 0x0 + // 0000000000000054: ARM64_RELOC_PAGE21 l_.str.1 + // 58: 91000042 add x2, x2, #0x0 + // 0000000000000058: ARM64_RELOC_PAGEOFF12 l_.str.1 + // 5c: aa1603e0 mov x0, x22 + // 60: aa1303e3 mov x3, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __PyEval_FormatExcCheckArg + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: a9417bfd ldp x29, x30, [sp, #0x10] + // 74: 910083ff add sp, sp, #0x20 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 7c: 90000008 adrp x8, 0x0 + // 000000000000007c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_SystemError + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_SystemError + // 84: f9400101 ldr x1, [x8] + // 88: f90003f3 str x19, [sp] + // 8c: 90000002 adrp x2, 0x0 + // 000000000000008c: ARM64_RELOC_PAGE21 l_.str + // 90: 91000042 add x2, x2, #0x0 + // 0000000000000090: ARM64_RELOC_PAGEOFF12 l_.str + // 94: aa1603e0 mov x0, x22 + // 98: 94000000 bl 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __PyErr_Format + // 9c: f9402295 ldr x21, [x20, #0x40] + // a0: f900229f str xzr, [x20, #0x40] + // a4: a9417bfd ldp x29, x30, [sp, #0x10] + // a8: 910083ff add sp, sp, #0x20 + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // b0: a9417bfd ldp x29, x30, [sp, #0x10] + // b4: 910083ff add sp, sp, #0x20 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x13, 0x0d, 0x40, 0xf9, 0x80, 0x16, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x80, 0x02, 0x00, 0xb4, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x03, 0x00, 0x34, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0xe3, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "no locals when deleting %R\x00name '%.200s' is not defined\x00" + // 38: &PyExc_SystemError+0x0 + // 40: &PyExc_NameError+0x0 + // 48: OPARG + const unsigned char data_body[80] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x52, 0x00, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x38, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x40, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x48, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data + 0x48); + patch_aarch64_trampoline(code + 0x34, 0x31, state); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data + 0x40); + patch_aarch64_21r(code + 0x54, (uintptr_t)data + 0x1b); + patch_aarch64_12(code + 0x58, (uintptr_t)data + 0x1b); + patch_aarch64_trampoline(code + 0x64, 0x2d, state); + patch_aarch64_26r(code + 0x78, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0x7c, (uintptr_t)data + 0x38); + patch_aarch64_21r(code + 0x8c, (uintptr_t)data); + patch_aarch64_12(code + 0x90, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x98, 0x30, state); + patch_aarch64_26r(code + 0xac, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0xb8, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DELETE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_SUBSCR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1703e0 mov x0, x23 + // 14: aa1303e1 mov x1, x19 + // 18: 94000000 bl 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 _PyObject_DelItem + // 1c: aa0003f8 mov x24, x0 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b94002e8 ldr w8, [x23] + // 2c: 37f800c8 tbnz w8, #0x1f, 0x44 + // 30: 71000508 subs w8, w8, #0x1 + // 34: b90002e8 str w8, [x23] + // 38: 54000061 b.ne 0x44 + // 3c: aa1703e0 mov x0, x23 + // 40: 94000000 bl 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540000a0 b.eq 0x68 + // 58: d10042b5 sub x21, x21, #0x10 + // 5c: 340000f8 cbz w24, 0x78 + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 68: aa1303e0 mov x0, x19 + // 6c: 94000000 bl 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 70: d10042b5 sub x21, x21, #0x10 + // 74: 35ffff78 cbnz w24, 0x60 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf8, 0x03, 0x00, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x42, 0x00, 0xd1, 0xf8, 0x00, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x42, 0x00, 0xd1, 0x78, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x18, 0x31, state); + patch_aarch64_trampoline(code + 0x40, 0x0, state); + patch_aarch64_26r(code + 0x64, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x6c, 0x0, state); + patch_aarch64_26r(code + 0x7c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DEOPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DEOPT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 8: f9008ac8 str x8, [x22, #0x110] + // c: f9002295 str x21, [x20, #0x40] + // 10: f9400288 ldr x8, [x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_TARGET + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_TARGET + // 1c: 8b294508 add x8, x8, w9, uxtw #1 + // 20: 91034100 add x0, x8, #0xd0 + // 24: d65f03c0 ret + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x88, 0x02, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x45, 0x29, 0x8b, + 0x00, 0x41, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + }; + // 0: TARGET + // 8: EXECUTOR + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->target); + patch_64(data + 0x8, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); +} + +void +emit__DICT_MERGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_MERGE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 12003d08 and w8, w8, #0xffff + // 14: 2a2803e9 mvn w9, w8 + // 18: f869daa0 ldr x0, [x21, w9, sxtw #3] + // 1c: f85f82b3 ldur x19, [x21, #-0x8] + // 20: 12800069 mov w9, #-0x4 ; =-4 + // 24: 4b080128 sub w8, w9, w8 + // 28: f868dab7 ldr x23, [x21, w8, sxtw #3] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: aa1303e1 mov x1, x19 + // 34: 52800042 mov w2, #0x2 ; =2 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __PyDict_MergeEx + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: 37f80120 tbnz w0, #0x1f, 0x68 + // 48: b9400268 ldr w8, [x19] + // 4c: 37f80088 tbnz w8, #0x1f, 0x5c + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000268 str w8, [x19] + // 58: 54000260 b.eq 0xa4 + // 5c: d10022b5 sub x21, x21, #0x8 + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 68: f9002295 str x21, [x20, #0x40] + // 6c: aa1603e0 mov x0, x22 + // 70: aa1703e1 mov x1, x23 + // 74: aa1303e2 mov x2, x19 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __PyEval_FormatKwargsError + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: b9400268 ldr w8, [x19] + // 88: 37f80088 tbnz w8, #0x1f, 0x98 + // 8c: 71000508 subs w8, w8, #0x1 + // 90: b9000268 str w8, [x19] + // 94: 54000120 b.eq 0xb8 + // 98: d10022b5 sub x21, x21, #0x8 + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a4: aa1303e0 mov x0, x19 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // ac: d10022b5 sub x21, x21, #0x8 + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b8: aa1303e0 mov x0, x19 + // bc: 94000000 bl 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c0: d10022b5 sub x21, x21, #0x8 + // c4: a8c17bfd ldp x29, x30, [sp], #0x10 + // c8: 14000000 b 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // cc: 00 00 00 00 + const unsigned char code_body[208] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0xa0, 0xda, 0x69, 0xf8, 0xb3, 0x82, 0x5f, 0xf8, + 0x69, 0x00, 0x80, 0x12, 0x28, 0x01, 0x08, 0x4b, + 0xb7, 0xda, 0x68, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0x42, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x01, 0xf8, 0x37, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x02, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x20, 0x01, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x38, 0x33, state); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x78, 0x32, state); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xa8, 0x0, state); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xbc, 0x0, state); + patch_aarch64_26r(code + 0xc8, state->instruction_starts[instruction->error_target]); +} + +void +emit__DICT_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_UPDATE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 2a2803e8 mvn w8, w8 + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: 531d7108 lsl w8, w8, #3 + // 20: b26db108 orr x8, x8, #0xfffffffffff80000 + // 24: f8686aa0 ldr x0, [x21, x8] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: aa1303e1 mov x1, x19 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 _PyDict_Update + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: 37f80140 tbnz w0, #0x1f, 0x64 + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 54000480 b.eq 0xe0 + // 54: d10022b5 sub x21, x21, #0x8 + // 58: a9417bfd ldp x29, x30, [sp, #0x10] + // 5c: 910083ff add sp, sp, #0x20 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: f9002295 str x21, [x20, #0x40] + // 68: 90000008 adrp x8, 0x0 + // 0000000000000068: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_AttributeError + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_AttributeError + // 70: f9400101 ldr x1, [x8] + // 74: aa1603e0 mov x0, x22 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __PyErr_ExceptionMatches + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: 340001c0 cbz w0, 0xbc + // 88: f9002295 str x21, [x20, #0x40] + // 8c: 90000008 adrp x8, 0x0 + // 000000000000008c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // 94: f9400101 ldr x1, [x8] + // 98: f9400668 ldr x8, [x19, #0x8] + // 9c: f9400d08 ldr x8, [x8, #0x18] + // a0: f90003e8 str x8, [sp] + // a4: 90000002 adrp x2, 0x0 + // 00000000000000a4: ARM64_RELOC_PAGE21 l_.str + // a8: 91000042 add x2, x2, #0x0 + // 00000000000000a8: ARM64_RELOC_PAGEOFF12 l_.str + // ac: aa1603e0 mov x0, x22 + // b0: 94000000 bl 0xb0 + // 00000000000000b0: ARM64_RELOC_BRANCH26 __PyErr_Format + // b4: f9402295 ldr x21, [x20, #0x40] + // b8: f900229f str xzr, [x20, #0x40] + // bc: b9400268 ldr w8, [x19] + // c0: 37f80088 tbnz w8, #0x1f, 0xd0 + // c4: 71000508 subs w8, w8, #0x1 + // c8: b9000268 str w8, [x19] + // cc: 54000160 b.eq 0xf8 + // d0: d10022b5 sub x21, x21, #0x8 + // d4: a9417bfd ldp x29, x30, [sp, #0x10] + // d8: 910083ff add sp, sp, #0x20 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // e0: aa1303e0 mov x0, x19 + // e4: 94000000 bl 0xe4 + // 00000000000000e4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e8: d10022b5 sub x21, x21, #0x8 + // ec: a9417bfd ldp x29, x30, [sp, #0x10] + // f0: 910083ff add sp, sp, #0x20 + // f4: 14000000 b 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // f8: aa1303e0 mov x0, x19 + // fc: 94000000 bl 0xfc + // 00000000000000fc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 100: d10022b5 sub x21, x21, #0x8 + // 104: a9417bfd ldp x29, x30, [sp, #0x10] + // 108: 910083ff add sp, sp, #0x20 + // 10c: 14000000 b 0x10c + // 000000000000010c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[272] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x28, 0x2a, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x40, 0x01, 0xf8, 0x37, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x80, 0x04, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x01, 0x00, 0x34, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0x68, 0x06, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0xe8, 0x03, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x60, 0x01, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "'%.200s' object is not a mapping\x00" + // 21: 00 00 00 00 00 00 00 + // 28: &PyExc_TypeError+0x0 + // 30: &PyExc_AttributeError+0x0 + // 38: OPARG + const unsigned char data_body[64] = { + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x30, (uintptr_t)&PyExc_AttributeError); + patch_64(data + 0x38, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x38); + patch_aarch64_trampoline(code + 0x30, 0x35, state); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x68, (uintptr_t)data + 0x30); + patch_aarch64_trampoline(code + 0x78, 0x34, state); + patch_aarch64_33rx(code + 0x8c, (uintptr_t)data + 0x28); + patch_aarch64_21r(code + 0xa4, (uintptr_t)data); + patch_aarch64_12(code + 0xa8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xb0, 0x30, state); + patch_aarch64_26r(code + 0xdc, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xe4, 0x0, state); + patch_aarch64_26r(code + 0xf4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xfc, 0x0, state); + patch_aarch64_26r(code + 0x10c, state->instruction_starts[instruction->error_target]); +} + +void +emit__END_FOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_FOR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea0 ldr x0, [x21, #-0x8]! + // 4: f9002295 str x21, [x20, #0x40] + // 8: b9400008 ldr w8, [x0] + // c: 37f80088 tbnz w8, #0x1f, 0x1c + // 10: 71000508 subs w8, w8, #0x1 + // 14: b9000008 str w8, [x0] + // 18: 54000080 b.eq 0x28 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 910003fd mov x29, sp + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0xa0, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x30, 0x0, state); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__END_SEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_SEND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f3 mov x19, x21 + // 4: f85f8e77 ldr x23, [x19, #-0x8]! + // 8: f85f8260 ldur x0, [x19, #-0x8] + // c: b9400008 ldr w8, [x0] + // 10: 37f80088 tbnz w8, #0x1f, 0x20 + // 14: 71000508 subs w8, w8, #0x1 + // 18: b9000008 str w8, [x0] + // 1c: 54000080 b.eq 0x2c + // 20: f81f02b7 stur x23, [x21, #-0x10] + // 24: aa1303f5 mov x21, x19 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 30: 910003fd mov x29, sp + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: f81f02b7 stur x23, [x21, #-0x10] + // 40: aa1303f5 mov x21, x19 + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[72] = { + 0xf3, 0x03, 0x15, 0xaa, 0x77, 0x8e, 0x5f, 0xf8, + 0x60, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0xb7, 0x02, 0x1f, 0xf8, 0xf5, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0xb7, 0x02, 0x1f, 0xf8, + 0xf5, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x34, 0x0, state); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ERROR_POP_N( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ERROR_POP_N.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 8: f9008ac8 str x8, [x22, #0x110] + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: f9400289 ldr x9, [x20] + // 18: 8b284528 add x8, x9, w8, uxtw #1 + // 1c: 91034108 add x8, x8, #0xd0 + // 20: a903d688 stp x8, x21, [x20, #0x38] + // 24: d2800000 mov x0, #0x0 ; =0 + // 28: d65f03c0 ret + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x89, 0x02, 0x40, 0xf9, + 0x28, 0x45, 0x28, 0x8b, 0x08, 0x41, 0x03, 0x91, + 0x88, 0xd6, 0x03, 0xa9, 0x00, 0x00, 0x80, 0xd2, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: EXECUTOR + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); +} + +void +emit__EXIT_INIT_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_INIT_CHECK.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8d09 ldr x9, [x8, #-0x8]! + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 10: eb0a013f cmp x9, x10 + // 14: 54000260 b.eq 0x60 + // 18: d10083ff sub sp, sp, #0x20 + // 1c: a9017bfd stp x29, x30, [sp, #0x10] + // 20: 910043fd add x29, sp, #0x10 + // 24: f9002295 str x21, [x20, #0x40] + // 28: 90000008 adrp x8, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // 30: f9400100 ldr x0, [x8] + // 34: f9400528 ldr x8, [x9, #0x8] + // 38: f9400d08 ldr x8, [x8, #0x18] + // 3c: f90003e8 str x8, [sp] + // 40: 90000001 adrp x1, 0x0 + // 0000000000000040: ARM64_RELOC_PAGE21 l_.str + // 44: 91000021 add x1, x1, #0x0 + // 0000000000000044: ARM64_RELOC_PAGEOFF12 l_.str + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 _PyErr_Format + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: a9417bfd ldp x29, x30, [sp, #0x10] + // 58: 910083ff add sp, sp, #0x20 + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 60: aa0803f5 mov x21, x8 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[104] = { + 0xe8, 0x03, 0x15, 0xaa, 0x09, 0x8d, 0x5f, 0xf8, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x60, 0x02, 0x00, 0x54, + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x40, 0xf9, 0x28, 0x05, 0x40, 0xf9, + 0x08, 0x0d, 0x40, 0xf9, 0xe8, 0x03, 0x00, 0xf9, + 0x01, 0x00, 0x00, 0x90, 0x21, 0x00, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "__init__() should return None, not '%.200s'\x00" + // 2c: 00 00 00 00 + // 30: &PyExc_TypeError+0x0 + // 38: &_Py_NoneStruct+0x0 + const unsigned char data_body[64] = { + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x5f, + 0x28, 0x29, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x27, 0x25, 0x2e, 0x32, 0x30, + 0x30, 0x73, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x38, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x38); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x30); + patch_aarch64_21r(code + 0x40, (uintptr_t)data); + patch_aarch64_12(code + 0x44, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x48, 0x36, state); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__EXIT_TRACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_TRACE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f9400298 ldr x24, [x20] + // 10: 90000017 adrp x23, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 14: f94002f7 ldr x23, [x23] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 18: b94002f3 ldr w19, [x23] + // 1c: f94006e0 ldr x0, [x23, #0x8] + // 20: b4000780 cbz x0, 0x110 + // 24: 39408808 ldrb w8, [x0, #0x22] + // 28: 37000588 tbnz w8, #0x0, 0xd8 + // 2c: 529fff88 mov w8, #0xfffc ; =65532 + // 30: 79000ae8 strh w8, [x23, #0x4] + // 34: f9002295 str x21, [x20, #0x40] + // 38: f90006ff str xzr, [x23, #0x8] + // 3c: b9400008 ldr w8, [x0] + // 40: 37f80648 tbnz w8, #0x1f, 0x108 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000008 str w8, [x0] + // 4c: 54000041 b.ne 0x54 + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 54: f94006e0 ldr x0, [x23, #0x8] + // 58: f9402295 ldr x21, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: 90000008 adrp x8, 0x0 + // 0000000000000060: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 68: f9008ac8 str x8, [x22, #0x110] + // 6c: b50003c0 cbnz x0, 0xe4 + // 70: 8b130708 add x8, x24, x19, lsl #1 + // 74: 91034113 add x19, x8, #0xd0 + // 78: 79400af9 ldrh w25, [x23, #0x4] + // 7c: 71003f3f cmp w25, #0xf + // 80: 54000582 b.hs 0x130 + // 84: 39400268 ldrb w8, [x19] + // 88: 7103fd1f cmp w8, #0xff + // 8c: 54000600 b.eq 0x14c + // 90: 90000008 adrp x8, 0x0 + // 0000000000000090: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 94: f9400108 ldr x8, [x8] + // 0000000000000094: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 98: 39408908 ldrb w8, [x8, #0x22] + // 9c: 53027d08 lsr w8, w8, #2 + // a0: f9002295 str x21, [x20, #0x40] + // a4: 910023e2 add x2, sp, #0x8 + // a8: 11000503 add w3, w8, #0x1 + // ac: aa1403e0 mov x0, x20 + // b0: aa1303e1 mov x1, x19 + // b4: 94000000 bl 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __PyOptimizer_Optimize + // b8: f9402295 ldr x21, [x20, #0x40] + // bc: f900229f str xzr, [x20, #0x40] + // c0: 529fff88 mov w8, #0xfffc ; =65532 + // c4: 7100001f cmp w0, #0x0 + // c8: 540005ad b.le 0x17c + // cc: 79000ae8 strh w8, [x23, #0x4] + // d0: f94007e0 ldr x0, [sp, #0x8] + // d4: 14000026 b 0x16c + // d8: 90000008 adrp x8, 0x0 + // 00000000000000d8: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // dc: f9400108 ldr x8, [x8] + // 00000000000000dc: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // e0: f9008ac8 str x8, [x22, #0x110] + // e4: b9400008 ldr w8, [x0] + // e8: 37f80088 tbnz w8, #0x1f, 0xf8 + // ec: 11000508 add w8, w8, #0x1 + // f0: b9000008 str w8, [x0] + // f4: f94006e0 ldr x0, [x23, #0x8] + // f8: f9403c00 ldr x0, [x0, #0x78] + // fc: a9417bfd ldp x29, x30, [sp, #0x10] + // 100: 910083ff add sp, sp, #0x20 + // 104: d61f0000 br x0 + // 108: f9402295 ldr x21, [x20, #0x40] + // 10c: f900229f str xzr, [x20, #0x40] + // 110: 90000008 adrp x8, 0x0 + // 0000000000000110: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 114: f9400108 ldr x8, [x8] + // 0000000000000114: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 118: f9008ac8 str x8, [x22, #0x110] + // 11c: 8b130708 add x8, x24, x19, lsl #1 + // 120: 91034113 add x19, x8, #0xd0 + // 124: 79400af9 ldrh w25, [x23, #0x4] + // 128: 71003f3f cmp w25, #0xf + // 12c: 54fffac3 b.lo 0x84 + // 130: 51004328 sub w8, w25, #0x10 + // 134: 79000ae8 strh w8, [x23, #0x4] + // 138: f9002295 str x21, [x20, #0x40] + // 13c: aa1303e0 mov x0, x19 + // 140: a9417bfd ldp x29, x30, [sp, #0x10] + // 144: 910083ff add sp, sp, #0x20 + // 148: d65f03c0 ret + // 14c: f9404f08 ldr x8, [x24, #0x98] + // 150: 39400669 ldrb w9, [x19, #0x1] + // 154: 8b090d08 add x8, x8, x9, lsl #3 + // 158: f9400500 ldr x0, [x8, #0x8] + // 15c: b9400008 ldr w8, [x0] + // 160: 37f80068 tbnz w8, #0x1f, 0x16c + // 164: 11000508 add w8, w8, #0x1 + // 168: b9000008 str w8, [x0] + // 16c: f90006e0 str x0, [x23, #0x8] + // 170: b9400008 ldr w8, [x0] + // 174: 36fffbc8 tbz w8, #0x1f, 0xec + // 178: 17ffffe0 b 0xf8 + // 17c: 52800049 mov w9, #0x2 ; =2 + // 180: 1ad92129 lsl w9, w9, w25 + // 184: 1100072a add w10, w25, #0x1 + // 188: 531c6d29 lsl w9, w9, #4 + // 18c: 51004129 sub w9, w9, #0x10 + // 190: 2a0a0129 orr w9, w9, w10 + // 194: 71002f3f cmp w25, #0xb + // 198: 1a898108 csel w8, w8, w9, hi + // 19c: 79000ae8 strh w8, [x23, #0x4] + // 1a0: f9002295 str x21, [x20, #0x40] + // 1a4: 7100001f cmp w0, #0x0 + // 1a8: 9a9f0273 csel x19, x19, xzr, eq + // 1ac: aa1303e0 mov x0, x19 + // 1b0: a9417bfd ldp x29, x30, [sp, #0x10] + // 1b4: 910083ff add sp, sp, #0x20 + // 1b8: d65f03c0 ret + // 1bc: 00 00 00 00 + const unsigned char code_body[448] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x98, 0x02, 0x40, 0xf9, + 0x17, 0x00, 0x00, 0x90, 0xf7, 0x02, 0x40, 0xf9, + 0xf3, 0x02, 0x40, 0xb9, 0xe0, 0x06, 0x40, 0xf9, + 0x80, 0x07, 0x00, 0xb4, 0x08, 0x88, 0x40, 0x39, + 0x88, 0x05, 0x00, 0x37, 0x88, 0xff, 0x9f, 0x52, + 0xe8, 0x0a, 0x00, 0x79, 0x95, 0x22, 0x00, 0xf9, + 0xff, 0x06, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x48, 0x06, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x06, 0x40, 0xf9, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0xc0, 0x03, 0x00, 0xb5, + 0x08, 0x07, 0x13, 0x8b, 0x13, 0x41, 0x03, 0x91, + 0xf9, 0x0a, 0x40, 0x79, 0x3f, 0x3f, 0x00, 0x71, + 0x82, 0x05, 0x00, 0x54, 0x68, 0x02, 0x40, 0x39, + 0x1f, 0xfd, 0x03, 0x71, 0x00, 0x06, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x89, 0x40, 0x39, 0x08, 0x7d, 0x02, 0x53, + 0x95, 0x22, 0x00, 0xf9, 0xe2, 0x23, 0x00, 0x91, + 0x03, 0x05, 0x00, 0x11, 0xe0, 0x03, 0x14, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x88, 0xff, 0x9f, 0x52, 0x1f, 0x00, 0x00, 0x71, + 0xad, 0x05, 0x00, 0x54, 0xe8, 0x0a, 0x00, 0x79, + 0xe0, 0x07, 0x40, 0xf9, 0x26, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x08, 0x00, 0x00, 0xb9, 0xe0, 0x06, 0x40, 0xf9, + 0x00, 0x3c, 0x40, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x1f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0x08, 0x07, 0x13, 0x8b, + 0x13, 0x41, 0x03, 0x91, 0xf9, 0x0a, 0x40, 0x79, + 0x3f, 0x3f, 0x00, 0x71, 0xc3, 0xfa, 0xff, 0x54, + 0x28, 0x43, 0x00, 0x51, 0xe8, 0x0a, 0x00, 0x79, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x08, 0x4f, 0x40, 0xf9, + 0x69, 0x06, 0x40, 0x39, 0x08, 0x0d, 0x09, 0x8b, + 0x00, 0x05, 0x40, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x08, 0x00, 0x00, 0xb9, 0xe0, 0x06, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xc8, 0xfb, 0xff, 0x36, + 0xe0, 0xff, 0xff, 0x17, 0x49, 0x00, 0x80, 0x52, + 0x29, 0x21, 0xd9, 0x1a, 0x2a, 0x07, 0x00, 0x11, + 0x29, 0x6d, 0x1c, 0x53, 0x29, 0x41, 0x00, 0x51, + 0x29, 0x01, 0x0a, 0x2a, 0x3f, 0x2f, 0x00, 0x71, + 0x08, 0x81, 0x89, 0x1a, 0xe8, 0x0a, 0x00, 0x79, + 0x95, 0x22, 0x00, 0xf9, 0x1f, 0x00, 0x00, 0x71, + 0x73, 0x02, 0x9f, 0x9a, 0xe0, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + }; + // 0: EXECUTOR + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x50, 0x0, state); + patch_aarch64_33rx(code + 0x60, (uintptr_t)data); + patch_aarch64_33rx(code + 0x90, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xb4, 0x37, state); + patch_aarch64_33rx(code + 0xd8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x110, (uintptr_t)data); +} + +void +emit__EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d08 and w8, w8, #0xffff + // c: 2a2803e9 mvn w9, w8 + // 10: 1280002a mov w10, #-0x2 ; =-2 + // 14: 4b080148 sub w8, w10, w8 + // 18: f868daaa ldr x10, [x21, w8, sxtw #3] + // 1c: f9400d4b ldr x11, [x10, #0x18] + // 20: b940016c ldr w12, [x11] + // 24: 37f8006c tbnz w12, #0x1f, 0x30 + // 28: 1100058c add w12, w12, #0x1 + // 2c: b900016c str w12, [x11] + // 30: f829daab str x11, [x21, w9, sxtw #3] + // 34: f868daa0 ldr x0, [x21, w8, sxtw #3] + // 38: f9400949 ldr x9, [x10, #0x10] + // 3c: b940012a ldr w10, [x9] + // 40: 37f8006a tbnz w10, #0x1f, 0x4c + // 44: 1100054a add w10, w10, #0x1 + // 48: b900012a str w10, [x9] + // 4c: f828daa9 str x9, [x21, w8, sxtw #3] + // 50: f9002295 str x21, [x20, #0x40] + // 54: b9400008 ldr w8, [x0] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000008 str w8, [x0] + // 64: 54000080 b.eq 0x74 + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 910003fd mov x29, sp + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 14000000 b 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[144] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0x2a, 0x00, 0x80, 0x12, 0x48, 0x01, 0x08, 0x4b, + 0xaa, 0xda, 0x68, 0xf8, 0x4b, 0x0d, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x6c, 0x01, 0x00, 0xb9, + 0xab, 0xda, 0x29, 0xf8, 0xa0, 0xda, 0x68, 0xf8, + 0x49, 0x09, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xda, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x7c, 0x0, state); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD_KW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92403d08 and x8, x8, #0xffff + // c: 92800029 mov x9, #-0x2 ; =-2 + // 10: cb080129 sub x9, x9, x8 + // 14: 9280004a mov x10, #-0x3 ; =-3 + // 18: cb080148 sub x8, x10, x8 + // 1c: f8687aa0 ldr x0, [x21, x8, lsl #3] + // 20: f9400c0a ldr x10, [x0, #0x18] + // 24: b940014b ldr w11, [x10] + // 28: 37f8006b tbnz w11, #0x1f, 0x34 + // 2c: 1100056b add w11, w11, #0x1 + // 30: b900014b str w11, [x10] + // 34: f8297aaa str x10, [x21, x9, lsl #3] + // 38: f9400809 ldr x9, [x0, #0x10] + // 3c: b940012a ldr w10, [x9] + // 40: 37f8006a tbnz w10, #0x1f, 0x4c + // 44: 1100054a add w10, w10, #0x1 + // 48: b900012a str w10, [x9] + // 4c: f8287aa9 str x9, [x21, x8, lsl #3] + // 50: f9002295 str x21, [x20, #0x40] + // 54: b9400008 ldr w8, [x0] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000008 str w8, [x0] + // 64: 54000080 b.eq 0x74 + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 910003fd mov x29, sp + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 14000000 b 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[144] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x29, 0x00, 0x80, 0x92, + 0x29, 0x01, 0x08, 0xcb, 0x4a, 0x00, 0x80, 0x92, + 0x48, 0x01, 0x08, 0xcb, 0xa0, 0x7a, 0x68, 0xf8, + 0x0a, 0x0c, 0x40, 0xf9, 0x4b, 0x01, 0x40, 0xb9, + 0x6b, 0x00, 0xf8, 0x37, 0x6b, 0x05, 0x00, 0x11, + 0x4b, 0x01, 0x00, 0xb9, 0xaa, 0x7a, 0x29, 0xf8, + 0x09, 0x08, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0x7a, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x7c, 0x0, state); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__FATAL_ERROR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FATAL_ERROR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000000 adrp x0, 0x0 + // 0000000000000008: ARM64_RELOC_PAGE21 l___func__._JIT_ENTRY + // c: 91000000 add x0, x0, #0x0 + // 000000000000000c: ARM64_RELOC_PAGEOFF12 l___func__._JIT_ENTRY + // 10: 90000001 adrp x1, 0x0 + // 0000000000000010: ARM64_RELOC_PAGE21 l_.str + // 14: 91000021 add x1, x1, #0x0 + // 0000000000000014: ARM64_RELOC_PAGEOFF12 l_.str + // 18: 94000000 bl 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __Py_FatalErrorFunc + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x91, + 0x01, 0x00, 0x00, 0x90, 0x21, 0x00, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '_JIT_ENTRY\x00Fatal error uop executed.\x00' + // 25: 00 00 00 + const unsigned char data_body[40] = { + 0x5f, 0x4a, 0x49, 0x54, 0x5f, 0x45, 0x4e, 0x54, + 0x52, 0x59, 0x00, 0x46, 0x61, 0x74, 0x61, 0x6c, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x75, + 0x6f, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21r(code + 0x8, (uintptr_t)data); + patch_aarch64_12(code + 0xc, (uintptr_t)data); + patch_aarch64_21r(code + 0x10, (uintptr_t)data + 0xb); + patch_aarch64_12(code + 0x14, (uintptr_t)data + 0xb); + patch_aarch64_trampoline(code + 0x18, 0x38, state); +} + +void +emit__FORMAT_SIMPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_SIMPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: aa1503e8 mov x8, x21 + // c: f85f8eb3 ldr x19, [x21, #-0x8]! + // 10: f9400669 ldr x9, [x19, #0x8] + // 14: 9000000a adrp x10, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 _PyUnicode_Type + // 18: f940014a ldr x10, [x10] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyUnicode_Type + // 1c: eb0a013f cmp x9, x10 + // 20: 54000220 b.eq 0x64 + // 24: f9002288 str x8, [x20, #0x40] + // 28: aa1303e0 mov x0, x19 + // 2c: d2800001 mov x1, #0x0 ; =0 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 _PyObject_Format + // 34: f9402288 ldr x8, [x20, #0x40] + // 38: d1002108 sub x8, x8, #0x8 + // 3c: f9002288 str x8, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 54000100 b.eq 0x70 + // 54: f9402295 ldr x21, [x20, #0x40] + // 58: f900229f str xzr, [x20, #0x40] + // 5c: b4000180 cbz x0, 0x8c + // 60: aa0003f3 mov x19, x0 + // 64: f80086b3 str x19, [x21], #0x8 + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 14000000 b 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 70: aa0003f5 mov x21, x0 + // 74: aa1303e0 mov x0, x19 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 7c: aa1503e0 mov x0, x21 + // 80: f9402295 ldr x21, [x20, #0x40] + // 84: f900229f str xzr, [x20, #0x40] + // 88: b5fffec0 cbnz x0, 0x60 + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 94: 00 00 00 00 + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe8, 0x03, 0x15, 0xaa, 0xb3, 0x8e, 0x5f, 0xf8, + 0x69, 0x06, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0xeb, + 0x20, 0x02, 0x00, 0x54, 0x88, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x00, 0x94, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x21, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x00, 0x01, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x01, 0x00, 0xb4, + 0xf3, 0x03, 0x00, 0xaa, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x15, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xc0, 0xfe, 0xff, 0xb5, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x30, 0x39, state); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x78, 0x0, state); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->error_target]); +} + +void +emit__FORMAT_WITH_SPEC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_WITH_SPEC.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1703e0 mov x0, x23 + // 14: aa1303e1 mov x1, x19 + // 18: 94000000 bl 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 _PyObject_Format + // 1c: aa0003f5 mov x21, x0 + // 20: f9402298 ldr x24, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b94002e8 ldr w8, [x23] + // 2c: 37f800c8 tbnz w8, #0x1f, 0x44 + // 30: 71000508 subs w8, w8, #0x1 + // 34: b90002e8 str w8, [x23] + // 38: 54000061 b.ne 0x44 + // 3c: aa1703e0 mov x0, x23 + // 40: 94000000 bl 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540000c0 b.eq 0x6c + // 58: b4000115 cbz x21, 0x78 + // 5c: f81f0315 stur x21, [x24, #-0x10] + // 60: d1002315 sub x21, x24, #0x8 + // 64: a8c17bfd ldp x29, x30, [sp], #0x10 + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 6c: aa1303e0 mov x0, x19 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 74: b5ffff55 cbnz x21, 0x5c + // 78: d1004315 sub x21, x24, #0x10 + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 84: 00 00 00 00 + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf5, 0x03, 0x00, 0xaa, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x15, 0x01, 0x00, 0xb4, 0x15, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x55, 0xff, 0xff, 0xb5, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x18, 0x39, state); + patch_aarch64_trampoline(code + 0x40, 0x0, state); + patch_aarch64_26r(code + 0x68, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x70, 0x0, state); + patch_aarch64_26r(code + 0x80, state->instruction_starts[instruction->error_target]); +} + +void +emit__FOR_ITER_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_GEN_FRAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyGen_Type + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyGen_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000061 b.ne 0x20 + // 18: 39c10d09 ldrsb w9, [x8, #0x43] + // 1c: 37f80049 tbnz w9, #0x1f, 0x24 + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: 91012109 add x9, x8, #0x48 + // 28: f940450a ldr x10, [x8, #0x88] + // 2c: 9000000b adrp x11, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 30: f940016b ldr x11, [x11] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 34: f900014b str x11, [x10] + // 38: f940450a ldr x10, [x8, #0x88] + // 3c: 9100214a add x10, x10, #0x8 + // 40: f900450a str x10, [x8, #0x88] + // 44: 39010d1f strb wzr, [x8, #0x43] + // 48: f9403eca ldr x10, [x22, #0x78] + // 4c: 9100a10b add x11, x8, #0x28 + // 50: f900190a str x10, [x8, #0x30] + // 54: f9003ecb str x11, [x22, #0x78] + // 58: f9002914 str x20, [x8, #0x50] + // 5c: 90000008 adrp x8, 0x0 + // 000000000000005c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 60: f9400108 ldr x8, [x8] + // 0000000000000060: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 64: 11000908 add w8, w8, #0x2 + // 68: 79009288 strh w8, [x20, #0x48] + // 6c: f80086a9 str x9, [x21], #0x8 + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: 00 00 00 00 + const unsigned char code_body[120] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x0d, 0xc1, 0x39, 0x49, 0x00, 0xf8, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x21, 0x01, 0x91, + 0x0a, 0x45, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x4b, 0x01, 0x00, 0xf9, + 0x0a, 0x45, 0x40, 0xf9, 0x4a, 0x21, 0x00, 0x91, + 0x0a, 0x45, 0x00, 0xf9, 0x1f, 0x0d, 0x01, 0x39, + 0xca, 0x3e, 0x40, 0xf9, 0x0b, 0xa1, 0x00, 0x91, + 0x0a, 0x19, 0x00, 0xf9, 0xcb, 0x3e, 0x00, 0xf9, + 0x14, 0x29, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x09, 0x00, 0x11, + 0x88, 0x92, 0x00, 0x79, 0xa9, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_Py_NoneStruct+0x0 + // 10: &PyGen_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x10, (uintptr_t)&PyGen_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x5c, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__FOR_ITER_TIER_TWO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_TIER_TWO.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: f9400408 ldr x8, [x0, #0x8] + // 14: f9407108 ldr x8, [x8, #0xe0] + // 18: d63f0100 blr x8 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: b4000080 cbz x0, 0x34 + // 28: f80086a0 str x0, [x21], #0x8 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: f9403ac8 ldr x8, [x22, #0x70] + // 38: b40002a8 cbz x8, 0x8c + // 3c: f9400508 ldr x8, [x8, #0x8] + // 40: b4000268 cbz x8, 0x8c + // 44: f9002295 str x21, [x20, #0x40] + // 48: 90000008 adrp x8, 0x0 + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_StopIteration + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_StopIteration + // 50: f9400101 ldr x1, [x8] + // 54: aa1603e0 mov x0, x22 + // 58: 94000000 bl 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __PyErr_ExceptionMatches + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: 34000180 cbz w0, 0x94 + // 68: f9002295 str x21, [x20, #0x40] + // 6c: f9401e82 ldr x2, [x20, #0x38] + // 70: aa1603e0 mov x0, x22 + // 74: aa1403e1 mov x1, x20 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __PyEval_MonitorRaise + // 7c: aa1603e0 mov x0, x22 + // 80: 94000000 bl 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __PyErr_Clear + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 9c: 00 00 00 00 + const unsigned char code_body[160] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x04, 0x40, 0xf9, 0x08, 0x71, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xc8, 0x3a, 0x40, 0xf9, + 0xa8, 0x02, 0x00, 0xb4, 0x08, 0x05, 0x40, 0xf9, + 0x68, 0x02, 0x00, 0xb4, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x01, 0x00, 0x34, + 0x95, 0x22, 0x00, 0xf9, 0x82, 0x1e, 0x40, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x14, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyExc_StopIteration+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyExc_StopIteration); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x58, 0x34, state); + patch_aarch64_trampoline(code + 0x78, 0x3b, state); + patch_aarch64_trampoline(code + 0x80, 0x3a, state); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x98, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_AITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AITER.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f85f82b3 ldur x19, [x21, #-0x8] + // 10: f9400668 ldr x8, [x19, #0x8] + // 14: f9402909 ldr x9, [x8, #0x50] + // 18: b4000309 cbz x9, 0x78 + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: b40002c9 cbz x9, 0x78 + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1303e0 mov x0, x19 + // 2c: d63f0120 blr x9 + // 30: aa0003f7 mov x23, x0 + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: b9400268 ldr w8, [x19] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000268 str w8, [x19] + // 4c: 540006e0 b.eq 0x128 + // 50: b40003b7 cbz x23, 0xc4 + // 54: f94006e8 ldr x8, [x23, #0x8] + // 58: f9402909 ldr x9, [x8, #0x50] + // 5c: b40003c9 cbz x9, 0xd4 + // 60: f9400929 ldr x9, [x9, #0x10] + // 64: b4000389 cbz x9, 0xd4 + // 68: f81f82b7 stur x23, [x21, #-0x8] + // 6c: a9417bfd ldp x29, x30, [sp, #0x10] + // 70: 910083ff add sp, sp, #0x20 + // 74: 14000000 b 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 78: f9002295 str x21, [x20, #0x40] + // 7c: 90000009 adrp x9, 0x0 + // 000000000000007c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // 80: f9400129 ldr x9, [x9] + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // 84: f9400121 ldr x1, [x9] + // 88: f9400d08 ldr x8, [x8, #0x18] + // 8c: f90003e8 str x8, [sp] + // 90: 90000002 adrp x2, 0x0 + // 0000000000000090: ARM64_RELOC_PAGE21 l_.str + // 94: 91000042 add x2, x2, #0x0 + // 0000000000000094: ARM64_RELOC_PAGEOFF12 l_.str + // 98: aa1603e0 mov x0, x22 + // 9c: 94000000 bl 0x9c + // 000000000000009c: ARM64_RELOC_BRANCH26 __PyErr_Format + // a0: f9402295 ldr x21, [x20, #0x40] + // a4: f900229f str xzr, [x20, #0x40] + // a8: b9400268 ldr w8, [x19] + // ac: 37f800c8 tbnz w8, #0x1f, 0xc4 + // b0: 71000508 subs w8, w8, #0x1 + // b4: b9000268 str w8, [x19] + // b8: 54000061 b.ne 0xc4 + // bc: aa1303e0 mov x0, x19 + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c4: d10022b5 sub x21, x21, #0x8 + // c8: a9417bfd ldp x29, x30, [sp, #0x10] + // cc: 910083ff add sp, sp, #0x20 + // d0: 14000000 b 0xd0 + // 00000000000000d0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // d4: d10022a9 sub x9, x21, #0x8 + // d8: f9002289 str x9, [x20, #0x40] + // dc: 90000009 adrp x9, 0x0 + // 00000000000000dc: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // e0: f9400129 ldr x9, [x9] + // 00000000000000e0: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // e4: f9400121 ldr x1, [x9] + // e8: f9400d08 ldr x8, [x8, #0x18] + // ec: f90003e8 str x8, [sp] + // f0: 90000002 adrp x2, 0x0 + // 00000000000000f0: ARM64_RELOC_PAGE21 l_.str.1 + // f4: 91000042 add x2, x2, #0x0 + // 00000000000000f4: ARM64_RELOC_PAGEOFF12 l_.str.1 + // f8: aa1603e0 mov x0, x22 + // fc: 94000000 bl 0xfc + // 00000000000000fc: ARM64_RELOC_BRANCH26 __PyErr_Format + // 100: b94002e8 ldr w8, [x23] + // 104: 37f80088 tbnz w8, #0x1f, 0x114 + // 108: 71000508 subs w8, w8, #0x1 + // 10c: b90002e8 str w8, [x23] + // 110: 54000140 b.eq 0x138 + // 114: f9402295 ldr x21, [x20, #0x40] + // 118: f900229f str xzr, [x20, #0x40] + // 11c: a9417bfd ldp x29, x30, [sp, #0x10] + // 120: 910083ff add sp, sp, #0x20 + // 124: 14000000 b 0x124 + // 0000000000000124: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 128: aa1303e0 mov x0, x19 + // 12c: 94000000 bl 0x12c + // 000000000000012c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 130: b5fff937 cbnz x23, 0x54 + // 134: 17ffffe4 b 0xc4 + // 138: aa1703e0 mov x0, x23 + // 13c: 94000000 bl 0x13c + // 000000000000013c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 140: f9402295 ldr x21, [x20, #0x40] + // 144: f900229f str xzr, [x20, #0x40] + // 148: a9417bfd ldp x29, x30, [sp, #0x10] + // 14c: 910083ff add sp, sp, #0x20 + // 150: 14000000 b 0x150 + // 0000000000000150: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 154: 00 00 00 00 + const unsigned char code_body[344] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xb3, 0x82, 0x5f, 0xf8, + 0x68, 0x06, 0x40, 0xf9, 0x09, 0x29, 0x40, 0xf9, + 0x09, 0x03, 0x00, 0xb4, 0x29, 0x05, 0x40, 0xf9, + 0xc9, 0x02, 0x00, 0xb4, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x01, 0x3f, 0xd6, + 0xf7, 0x03, 0x00, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x06, 0x00, 0x54, + 0xb7, 0x03, 0x00, 0xb4, 0xe8, 0x06, 0x40, 0xf9, + 0x09, 0x29, 0x40, 0xf9, 0xc9, 0x03, 0x00, 0xb4, + 0x29, 0x09, 0x40, 0xf9, 0x89, 0x03, 0x00, 0xb4, + 0xb7, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0x95, 0x22, 0x00, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x21, 0x01, 0x40, 0xf9, + 0x08, 0x0d, 0x40, 0xf9, 0xe8, 0x03, 0x00, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xa9, 0x22, 0x00, 0xd1, + 0x89, 0x22, 0x00, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x21, 0x01, 0x40, 0xf9, + 0x08, 0x0d, 0x40, 0xf9, 0xe8, 0x03, 0x00, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x40, 0x01, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x37, 0xf9, 0xff, 0xb5, 0xe4, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'async for' requires an object with __aiter__ method, got %.100s\x00'async for' received an object from __aiter__ that does not implement __anext__: %.100s\x00" + // 99: 00 00 00 00 00 00 00 + // a0: &PyExc_TypeError+0x0 + const unsigned char data_body[168] = { + 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x5f, 0x5f, 0x61, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x5f, 0x5f, 0x61, + 0x69, 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, + 0x3a, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0xa0, (uintptr_t)&PyExc_TypeError); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x74, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x7c, (uintptr_t)data + 0xa0); + patch_aarch64_21r(code + 0x90, (uintptr_t)data); + patch_aarch64_12(code + 0x94, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x9c, 0x30, state); + patch_aarch64_trampoline(code + 0xc0, 0x0, state); + patch_aarch64_26r(code + 0xd0, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0xdc, (uintptr_t)data + 0xa0); + patch_aarch64_21r(code + 0xf0, (uintptr_t)data + 0x41); + patch_aarch64_12(code + 0xf4, (uintptr_t)data + 0x41); + patch_aarch64_trampoline(code + 0xfc, 0x30, state); + patch_aarch64_26r(code + 0x124, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x12c, 0x0, state); + patch_aarch64_trampoline(code + 0x13c, 0x0, state); + patch_aarch64_26r(code + 0x150, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_ANEXT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ANEXT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: 94000000 bl 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __PyEval_GetANext + // 14: f9402295 ldr x21, [x20, #0x40] + // 18: f900229f str xzr, [x20, #0x40] + // 1c: b4000080 cbz x0, 0x2c + // 20: f80086a0 str x0, [x21], #0x8 + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 34: 00 00 00 00 + const unsigned char code_body[56] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x10, 0x3c, state); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_AWAITABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AWAITABLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: f85f82b3 ldur x19, [x21, #-0x8] + // 14: f9002295 str x21, [x20, #0x40] + // 18: 12003d01 and w1, w8, #0xffff + // 1c: aa1303e0 mov x0, x19 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __PyEval_GetAwaitable + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: b9400268 ldr w8, [x19] + // 30: 37f80088 tbnz w8, #0x1f, 0x40 + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000268 str w8, [x19] + // 3c: 540000a0 b.eq 0x50 + // 40: b4000120 cbz x0, 0x64 + // 44: f81f82a0 stur x0, [x21, #-0x8] + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 50: aa0003f7 mov x23, x0 + // 54: aa1303e0 mov x0, x19 + // 58: 94000000 bl 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 5c: aa1703e0 mov x0, x23 + // 60: b5ffff37 cbnz x23, 0x44 + // 64: d10022b5 sub x21, x21, #0x8 + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 14000000 b 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[112] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x01, 0x3d, 0x00, 0x12, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x20, 0x01, 0x00, 0xb4, 0xa0, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x17, 0xaa, + 0x37, 0xff, 0xff, 0xb5, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x20, 0x3d, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x58, 0x0, state); + patch_aarch64_26r(code + 0x6c, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ITER.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1303e0 mov x0, x19 + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 _PyObject_GetIter + // 18: f9402295 ldr x21, [x20, #0x40] + // 1c: f900229f str xzr, [x20, #0x40] + // 20: b9400268 ldr w8, [x19] + // 24: 37f80088 tbnz w8, #0x1f, 0x34 + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000268 str w8, [x19] + // 30: 540000a0 b.eq 0x44 + // 34: b4000120 cbz x0, 0x58 + // 38: f81f82a0 stur x0, [x21, #-0x8] + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: aa0003f7 mov x23, x0 + // 48: aa1303e0 mov x0, x19 + // 4c: 94000000 bl 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 50: aa1703e0 mov x0, x23 + // 54: b5ffff37 cbnz x23, 0x38 + // 58: d10022b5 sub x21, x21, #0x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x20, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0x37, 0xff, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0x3e, state); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x4c, 0x0, state); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_LEN.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: 94000000 bl 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 _PyObject_Size + // 14: f9402295 ldr x21, [x20, #0x40] + // 18: f900229f str xzr, [x20, #0x40] + // 1c: b7f800c0 tbnz x0, #0x3f, 0x34 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 _PyLong_FromSsize_t + // 24: b4000080 cbz x0, 0x34 + // 28: f80086a0 str x0, [x21], #0x8 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x00, 0xf8, 0xb7, + 0x00, 0x00, 0x00, 0x94, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x10, 0x17, state); + patch_aarch64_trampoline(code + 0x20, 0x16, state); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_YIELD_FROM_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_YIELD_FROM_ITER.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9400668 ldr x8, [x19, #0x8] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PyCoro_Type + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyCoro_Type + // 18: eb09011f cmp x8, x9 + // 1c: 54000260 b.eq 0x68 + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 _PyGen_Type + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyGen_Type + // 28: eb09011f cmp x8, x9 + // 2c: 54000260 b.eq 0x78 + // 30: f9002295 str x21, [x20, #0x40] + // 34: aa1303e0 mov x0, x19 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 _PyObject_GetIter + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: b4000340 cbz x0, 0xac + // 48: b9400268 ldr w8, [x19] + // 4c: 37f80348 tbnz w8, #0x1f, 0xb4 + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000268 str w8, [x19] + // 58: 54000340 b.eq 0xc0 + // 5c: f81f82a0 stur x0, [x21, #-0x8] + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 68: f9400288 ldr x8, [x20] + // 6c: 79406108 ldrh w8, [x8, #0x30] + // 70: 7219051f tst w8, #0x180 + // 74: 54000080 b.eq 0x84 + // 78: f81f82b3 stur x19, [x21, #-0x8] + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: f9002295 str x21, [x20, #0x40] + // 88: 90000008 adrp x8, 0x0 + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // 8c: f9400108 ldr x8, [x8] + // 000000000000008c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // 90: f9400101 ldr x1, [x8] + // 94: 90000002 adrp x2, 0x0 + // 0000000000000094: ARM64_RELOC_PAGE21 l_.str + // 98: 91000042 add x2, x2, #0x0 + // 0000000000000098: ARM64_RELOC_PAGEOFF12 l_.str + // 9c: aa1603e0 mov x0, x22 + // a0: 94000000 bl 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __PyErr_SetString + // a4: f9402295 ldr x21, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: a8c17bfd ldp x29, x30, [sp], #0x10 + // b0: 14000000 b 0xb0 + // 00000000000000b0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // b4: f81f82a0 stur x0, [x21, #-0x8] + // b8: a8c17bfd ldp x29, x30, [sp], #0x10 + // bc: 14000000 b 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // c0: aa0003f7 mov x23, x0 + // c4: aa1303e0 mov x0, x19 + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // cc: f81f82b7 stur x23, [x21, #-0x8] + // d0: a8c17bfd ldp x29, x30, [sp], #0x10 + // d4: 14000000 b 0xd4 + // 00000000000000d4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x60, 0x02, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x60, 0x02, 0x00, 0x54, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x40, 0x03, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x48, 0x03, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x40, 0x03, 0x00, 0x54, 0xa0, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x61, 0x40, 0x79, + 0x1f, 0x05, 0x19, 0x72, 0x80, 0x00, 0x00, 0x54, + 0xb3, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xa0, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xb7, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "cannot 'yield from' a coroutine object in a non-coroutine generator\x00" + // 44: 00 00 00 00 + // 48: &PyExc_TypeError+0x0 + // 50: &PyGen_Type+0x0 + // 58: &PyCoro_Type+0x0 + const unsigned char data_body[96] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x27, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x48, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x50, (uintptr_t)&PyGen_Type); + patch_64(data + 0x58, (uintptr_t)&PyCoro_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x58); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data + 0x50); + patch_aarch64_trampoline(code + 0x38, 0x3e, state); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x88, (uintptr_t)data + 0x48); + patch_aarch64_21r(code + 0x94, (uintptr_t)data); + patch_aarch64_12(code + 0x98, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa0, 0x3f, state); + patch_aarch64_26r(code + 0xb0, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0xbc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xc8, 0x0, state); + patch_aarch64_26r(code + 0xd4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BINARY_OP_EXTEND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f06a0 ldp x0, x1, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: 90000008 adrp x8, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 18: f9400508 ldr x8, [x8, #0x8] + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: 34000060 cbz w0, 0x34 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x06, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x05, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x60, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_BOTH_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFloat_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFloat_Type + // 10: eb08013f cmp x9, x8 + // 14: 540000a1 b.ne 0x28 + // 18: f85f82a9 ldur x9, [x21, #-0x8] + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: eb08013f cmp x9, x8 + // 24: 54000040 b.eq 0x2c + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xa9, 0x82, 0x5f, 0xf8, 0x29, 0x05, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BOTH_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 10: eb08013f cmp x9, x8 + // 14: 540000a1 b.ne 0x28 + // 18: f85f82a9 ldur x9, [x21, #-0x8] + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: eb08013f cmp x9, x8 + // 24: 54000040 b.eq 0x2c + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xa9, 0x82, 0x5f, 0xf8, 0x29, 0x05, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BOTH_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_UNICODE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyUnicode_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyUnicode_Type + // 10: eb08013f cmp x9, x8 + // 14: 540000a1 b.ne 0x28 + // 18: f85f82a9 ldur x9, [x21, #-0x8] + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: eb08013f cmp x9, x8 + // 24: 54000040 b.eq 0x2c + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xa9, 0x82, 0x5f, 0xf8, 0x29, 0x05, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyUnicode_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BUILTINS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BUILTINS_VERSION_PUSH_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9401288 ldr x8, [x20, #0x20] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000121 b.ne 0x38 + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: b9400d09 ldr w9, [x8, #0xc] + // 20: 9000000a adrp x10, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 24: f940014a ldr x10, [x10] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 28: 6b2a213f cmp w9, w10, uxth + // 2c: 54000061 b.ne 0x38 + // 30: f80086a8 str x8, [x21], #0x8 + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0x88, 0x12, 0x40, 0xf9, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x21, 0x01, 0x00, 0x54, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x0d, 0x40, 0xb9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x21, 0x2a, 0x6b, 0x61, 0x00, 0x00, 0x54, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyDict_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_DORV_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_NO_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f85e8109 ldur x9, [x8, #-0x18] + // 8: b4000049 cbz x9, 0x10 + // c: 14000000 b 0xc + // 000000000000000c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 10: f9400509 ldr x9, [x8, #0x8] + // 14: f9401129 ldr x9, [x9, #0x20] + // 18: 8b090108 add x8, x8, x9 + // 1c: 39400d08 ldrb w8, [x8, #0x3] + // 20: 34ffff68 cbz w8, 0xc + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x81, 0x5e, 0xf8, + 0x49, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + 0x09, 0x05, 0x40, 0xf9, 0x29, 0x11, 0x40, 0xf9, + 0x08, 0x01, 0x09, 0x8b, 0x08, 0x0d, 0x40, 0x39, + 0x68, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: f9401129 ldr x9, [x9, #0x20] + // c: 8b090108 add x8, x8, x9 + // 10: 39400d08 ldrb w8, [x8, #0x3] + // 14: 34000048 cbz w8, 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0x11, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0x08, 0x0d, 0x40, 0x39, 0x48, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_GLOBALS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400e88 ldr x8, [x20, #0x18] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000101 b.ne 0x34 + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: b9400d08 ldr w8, [x8, #0xc] + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 28: 6b29211f cmp w8, w9, uxth + // 2c: 54000041 b.ne 0x34 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[56] = { + 0x88, 0x0e, 0x40, 0xf9, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x01, 0x01, 0x00, 0x54, + 0x08, 0x11, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xb9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x21, 0x29, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &PyDict_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x34, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_GLOBALS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION_PUSH_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400e88 ldr x8, [x20, #0x18] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000121 b.ne 0x38 + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: b9400d09 ldr w9, [x8, #0xc] + // 20: 9000000a adrp x10, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 24: f940014a ldr x10, [x10] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 28: 6b2a213f cmp w9, w10, uxth + // 2c: 54000061 b.ne 0x38 + // 30: f80086a8 str x8, [x21], #0x8 + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0x88, 0x0e, 0x40, 0xf9, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x21, 0x01, 0x00, 0x54, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x0d, 0x40, 0xb9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x21, 0x2a, 0x6b, 0x61, 0x00, 0x00, 0x54, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyDict_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_FALSE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_FALSE_POP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // c: eb09011f cmp x8, x9 + // 10: 54000040 b.eq 0x18 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_IS_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NONE_POP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea0 ldr x0, [x21, #-0x8]! + // 4: 90000008 adrp x8, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // c: eb08001f cmp x0, x8 + // 10: 54000140 b.eq 0x38 + // 14: f9002295 str x21, [x20, #0x40] + // 18: b9400008 ldr w8, [x0] + // 1c: 37f80088 tbnz w8, #0x1f, 0x2c + // 20: 71000508 subs w8, w8, #0x1 + // 24: b9000008 str w8, [x0] + // 28: 540000a0 b.eq 0x3c + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 40: 910003fd mov x29, sp + // 44: 94000000 bl 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[88] = { + 0xa0, 0x8e, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x44, 0x0, state); + patch_aarch64_26r(code + 0x54, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_NOT_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NOT_NONE_POP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8eb3 ldr x19, [x21, #-0x8]! + // 4: f9002295 str x21, [x20, #0x40] + // 8: b9400268 ldr w8, [x19] + // c: 37f80088 tbnz w8, #0x1f, 0x1c + // 10: 71000508 subs w8, w8, #0x1 + // 14: b9000268 str w8, [x19] + // 18: 54000100 b.eq 0x38 + // 1c: 90000008 adrp x8, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: eb08027f cmp x19, x8 + // 30: 540001a0 b.eq 0x64 + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 38: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 3c: 910003fd mov x29, sp + // 40: aa1303e0 mov x0, x19 + // 44: 94000000 bl 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 90000008 adrp x8, 0x0 + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 50: f9400108 ldr x8, [x8] + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 54: f9402295 ldr x21, [x20, #0x40] + // 58: f900229f str xzr, [x20, #0x40] + // 5c: eb08027f cmp x19, x8 + // 60: 54fffea1 b.ne 0x34 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[104] = { + 0xb3, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x00, 0x01, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x7f, 0x02, 0x08, 0xeb, + 0xa0, 0x01, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x7f, 0x02, 0x08, 0xeb, + 0xa1, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x44, 0x0, state); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data); + patch_aarch64_26r(code + 0x64, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_TRUE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_TRUE_POP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // c: eb09011f cmp x8, x9 + // 10: 54000040 b.eq 0x18 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_TrueStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_KEYS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_KEYS_VERSION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: f941b908 ldr x8, [x8, #0x370] + // c: b9400d08 ldr w8, [x8, #0xc] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 18: 6b09011f cmp w8, w9 + // 1c: 54000041 b.ne 0x24 + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x08, 0xb9, 0x41, 0xf9, 0x08, 0x0d, 0x40, 0xb9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_NOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFloat_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFloat_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_NOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_NOT_EXHAUSTED_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_LIST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400d09 ldr x9, [x8, #0x18] + // 8: b40000c9 cbz x9, 0x20 + // c: f940090a ldr x10, [x8, #0x10] + // 10: f9400929 ldr x9, [x9, #0x10] + // 14: eb09015f cmp x10, x9 + // 18: 54000062 b.hs 0x24 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: 92800009 mov x9, #-0x1 ; =-1 + // 28: f9000909 str x9, [x8, #0x10] + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x0d, 0x40, 0xf9, + 0xc9, 0x00, 0x00, 0xb4, 0x0a, 0x09, 0x40, 0xf9, + 0x29, 0x09, 0x40, 0xf9, 0x5f, 0x01, 0x09, 0xeb, + 0x62, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x80, 0x92, + 0x09, 0x09, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_NOT_EXHAUSTED_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_RANGE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9401108 ldr x8, [x8, #0x20] + // 8: f100011f cmp x8, #0x0 + // c: 5400004d b.le 0x14 + // 10: 14000000 b 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[24] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x11, 0x40, 0xf9, + 0x1f, 0x01, 0x00, 0xf1, 0x4d, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_NOT_EXHAUSTED_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400d09 ldr x9, [x8, #0x18] + // 8: b40000c9 cbz x9, 0x20 + // c: f9400908 ldr x8, [x8, #0x10] + // 10: f9400929 ldr x9, [x9, #0x10] + // 14: eb09011f cmp x8, x9 + // 18: 5400004a b.ge 0x20 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x0d, 0x40, 0xf9, + 0xc9, 0x00, 0x00, 0xb4, 0x08, 0x09, 0x40, 0xf9, + 0x29, 0x09, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x4a, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_TOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_FLOAT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyFloat_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyFloat_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_TOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_TYPE_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: b9418108 ldr w8, [x8, #0x180] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: 6b09011f cmp w8, w9 + // 18: 54000041 b.ne 0x20 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x08, 0x81, 0x41, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_TYPE_VERSION_AND_LOCK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION_AND_LOCK.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: b9418108 ldr w8, [x8, #0x180] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: 6b09011f cmp w8, w9 + // 18: 54000041 b.ne 0x20 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x08, 0x81, 0x41, 0xb9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__IMPORT_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_FROM.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82a1 ldur x1, [x21, #-0x8] + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d02 ldr x2, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1603e0 mov x0, x22 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __PyEval_ImportFrom + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: b4000080 cbz x0, 0x48 + // 3c: f80086a0 str x0, [x21], #0x8 + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[80] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa1, 0x82, 0x5f, 0xf8, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x02, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x2c, 0x40, state); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x4c, state->instruction_starts[instruction->error_target]); +} + +void +emit__IMPORT_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_NAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d02 ldr x2, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1603e0 mov x0, x22 + // 2c: aa1403e1 mov x1, x20 + // 30: aa1303e3 mov x3, x19 + // 34: aa1703e4 mov x4, x23 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __PyEval_ImportName + // 3c: aa0003f5 mov x21, x0 + // 40: f9402298 ldr x24, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: b94002e8 ldr w8, [x23] + // 4c: 37f800c8 tbnz w8, #0x1f, 0x64 + // 50: 71000508 subs w8, w8, #0x1 + // 54: b90002e8 str w8, [x23] + // 58: 54000061 b.ne 0x64 + // 5c: aa1703e0 mov x0, x23 + // 60: 94000000 bl 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 64: b9400268 ldr w8, [x19] + // 68: 37f80088 tbnz w8, #0x1f, 0x78 + // 6c: 71000508 subs w8, w8, #0x1 + // 70: b9000268 str w8, [x19] + // 74: 540000c0 b.eq 0x8c + // 78: b4000115 cbz x21, 0x98 + // 7c: f81f0315 stur x21, [x24, #-0x10] + // 80: d1002315 sub x21, x24, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 8c: aa1303e0 mov x0, x19 + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: b5ffff55 cbnz x21, 0x7c + // 98: d1004315 sub x21, x24, #0x10 + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x02, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x14, 0xaa, + 0xe3, 0x03, 0x13, 0xaa, 0xe4, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf5, 0x03, 0x00, 0xaa, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x15, 0x01, 0x00, 0xb4, 0x15, 0x03, 0x1f, 0xf8, + 0x15, 0x23, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x55, 0xff, 0xff, 0xb5, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x38, 0x41, state); + patch_aarch64_trampoline(code + 0x60, 0x0, state); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); +} + +void +emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_BOUND_METHOD_EXACT_ARGS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d08 and w8, w8, #0xffff + // c: 2a2803e9 mvn w9, w8 + // 10: 1280002a mov w10, #-0x2 ; =-2 + // 14: 4b080148 sub w8, w10, w8 + // 18: f868daaa ldr x10, [x21, w8, sxtw #3] + // 1c: f9400d4b ldr x11, [x10, #0x18] + // 20: b940016c ldr w12, [x11] + // 24: 37f8006c tbnz w12, #0x1f, 0x30 + // 28: 1100058c add w12, w12, #0x1 + // 2c: b900016c str w12, [x11] + // 30: f829daab str x11, [x21, w9, sxtw #3] + // 34: f868daa0 ldr x0, [x21, w8, sxtw #3] + // 38: f9400949 ldr x9, [x10, #0x10] + // 3c: b940012a ldr w10, [x9] + // 40: 37f8006a tbnz w10, #0x1f, 0x4c + // 44: 1100054a add w10, w10, #0x1 + // 48: b900012a str w10, [x9] + // 4c: f828daa9 str x9, [x21, w8, sxtw #3] + // 50: f9002295 str x21, [x20, #0x40] + // 54: b9400008 ldr w8, [x0] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000008 str w8, [x0] + // 64: 54000080 b.eq 0x74 + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 910003fd mov x29, sp + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 14000000 b 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[144] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0x2a, 0x00, 0x80, 0x12, 0x48, 0x01, 0x08, 0x4b, + 0xaa, 0xda, 0x68, 0xf8, 0x4b, 0x0d, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x6c, 0x01, 0x00, 0xb9, + 0xab, 0xda, 0x29, 0xf8, 0xa0, 0xda, 0x68, 0xf8, + 0x49, 0x09, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xda, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x7c, 0x0, state); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d0a and w10, w8, #0xffff + // c: 2a2a03e8 mvn w8, w10 + // 10: 8b28cea8 add x8, x21, w8, sxtw #3 + // 14: 12800029 mov w9, #-0x2 ; =-2 + // 18: 4b0a0129 sub w9, w9, w10 + // 1c: f940010c ldr x12, [x8] + // 20: f100019f cmp x12, #0x0 + // 24: 1a8a054b cinc w11, w10, ne + // 28: f869daae ldr x14, [x21, w9, sxtw #3] + // 2c: f94019cd ldr x13, [x14, #0x30] + // 30: f9407aca ldr x10, [x22, #0xf0] + // 34: b9804daf ldrsw x15, [x13, #0x4c] + // 38: 8b0f0d4f add x15, x10, x15, lsl #3 + // 3c: f9007acf str x15, [x22, #0xf0] + // 40: a900b954 stp x20, x14, [x10, #0x8] + // 44: b94001af ldr w15, [x13] + // 48: 37f8006f tbnz w15, #0x1f, 0x54 + // 4c: 110005ef add w15, w15, #0x1 + // 50: b90001af str w15, [x13] + // 54: f900014d str x13, [x10] + // 58: 3dc005c0 ldr q0, [x14, #0x10] + // 5c: 3c818140 stur q0, [x10, #0x18] + // 60: 9101414e add x14, x10, #0x50 + // 64: b98049af ldrsw x15, [x13, #0x48] + // 68: 8b0f0dd0 add x16, x14, x15, lsl #3 + // 6c: a902fd5f stp xzr, xzr, [x10, #0x28] + // 70: 910341b1 add x17, x13, #0xd0 + // 74: a903c151 stp x17, x16, [x10, #0x38] + // 78: b900495f str wzr, [x10, #0x48] + // 7c: 6b0b01ff cmp w15, w11 + // 80: 540000cd b.le 0x98 + // 84: f82b79df str xzr, [x14, x11, lsl #3] + // 88: 9100056b add x11, x11, #0x1 + // 8c: b98049af ldrsw x15, [x13, #0x48] + // 90: eb0f017f cmp x11, x15 + // 94: 54ffff8b b.lt 0x84 + // 98: f100019f cmp x12, #0x0 + // 9c: 1a9f07eb cset w11, ne + // a0: f940010d ldr x13, [x8] + // a4: f90001cd str x13, [x14] + // a8: 9000000e adrp x14, 0x0 + // 00000000000000a8: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // ac: f94001ce ldr x14, [x14] + // 00000000000000ac: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // b0: 72003ddf tst w14, #0xffff + // b4: 54000300 b.eq 0x114 + // b8: 92403dcd and x13, x14, #0xffff + // bc: 12003dce and w14, w14, #0xffff + // c0: 71002ddf cmp w14, #0xb + // c4: 54000149 b.ls 0xec + // c8: f100019f cmp x12, #0x0 + // cc: 1a9f07ec cset w12, ne + // d0: 8b2c4d4c add x12, x10, w12, uxtw #3 + // d4: d37df1ae lsl x14, x13, #3 + // d8: 8b0e018c add x12, x12, x14 + // dc: cb15018c sub x12, x12, x21 + // e0: 9101418c add x12, x12, #0x50 + // e4: f101019f cmp x12, #0x40 + // e8: 540001c2 b.hs 0x120 + // ec: d280000c mov x12, #0x0 ; =0 + // f0: cb0d018d sub x13, x12, x13 + // f4: d37df18c lsl x12, x12, #3 + // f8: 8b0b0d8b add x11, x12, x11, lsl #3 + // fc: 8b0a016b add x11, x11, x10 + // 100: 9101416b add x11, x11, #0x50 + // 104: f86d7aac ldr x12, [x21, x13, lsl #3] + // 108: f800856c str x12, [x11], #0x8 + // 10c: b10005ad adds x13, x13, #0x1 + // 110: 54ffffa3 b.lo 0x104 + // 114: f829daaa str x10, [x21, w9, sxtw #3] + // 118: aa0803f5 mov x21, x8 + // 11c: 14000000 b 0x11c + // 000000000000011c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 120: 927d31ac and x12, x13, #0xfff8 + // 124: cb0e02ae sub x14, x21, x14 + // 128: 910081ce add x14, x14, #0x20 + // 12c: 8b0b0d4f add x15, x10, x11, lsl #3 + // 130: 910201ef add x15, x15, #0x80 + // 134: aa0c03f0 mov x16, x12 + // 138: ad7f05c0 ldp q0, q1, [x14, #-0x20] + // 13c: acc20dc2 ldp q2, q3, [x14], #0x40 + // 140: ad3e85e0 stp q0, q1, [x15, #-0x30] + // 144: ad3f8de2 stp q2, q3, [x15, #-0x10] + // 148: 910101ef add x15, x15, #0x40 + // 14c: f1002210 subs x16, x16, #0x8 + // 150: 54ffff41 b.ne 0x138 + // 154: eb0d019f cmp x12, x13 + // 158: 54fffcc1 b.ne 0xf0 + // 15c: 17ffffee b 0x114 + const unsigned char code_body[352] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0a, 0x3d, 0x00, 0x12, 0xe8, 0x03, 0x2a, 0x2a, + 0xa8, 0xce, 0x28, 0x8b, 0x29, 0x00, 0x80, 0x12, + 0x29, 0x01, 0x0a, 0x4b, 0x0c, 0x01, 0x40, 0xf9, + 0x9f, 0x01, 0x00, 0xf1, 0x4b, 0x05, 0x8a, 0x1a, + 0xae, 0xda, 0x69, 0xf8, 0xcd, 0x19, 0x40, 0xf9, + 0xca, 0x7a, 0x40, 0xf9, 0xaf, 0x4d, 0x80, 0xb9, + 0x4f, 0x0d, 0x0f, 0x8b, 0xcf, 0x7a, 0x00, 0xf9, + 0x54, 0xb9, 0x00, 0xa9, 0xaf, 0x01, 0x40, 0xb9, + 0x6f, 0x00, 0xf8, 0x37, 0xef, 0x05, 0x00, 0x11, + 0xaf, 0x01, 0x00, 0xb9, 0x4d, 0x01, 0x00, 0xf9, + 0xc0, 0x05, 0xc0, 0x3d, 0x40, 0x81, 0x81, 0x3c, + 0x4e, 0x41, 0x01, 0x91, 0xaf, 0x49, 0x80, 0xb9, + 0xd0, 0x0d, 0x0f, 0x8b, 0x5f, 0xfd, 0x02, 0xa9, + 0xb1, 0x41, 0x03, 0x91, 0x51, 0xc1, 0x03, 0xa9, + 0x5f, 0x49, 0x00, 0xb9, 0xff, 0x01, 0x0b, 0x6b, + 0xcd, 0x00, 0x00, 0x54, 0xdf, 0x79, 0x2b, 0xf8, + 0x6b, 0x05, 0x00, 0x91, 0xaf, 0x49, 0x80, 0xb9, + 0x7f, 0x01, 0x0f, 0xeb, 0x8b, 0xff, 0xff, 0x54, + 0x9f, 0x01, 0x00, 0xf1, 0xeb, 0x07, 0x9f, 0x1a, + 0x0d, 0x01, 0x40, 0xf9, 0xcd, 0x01, 0x00, 0xf9, + 0x0e, 0x00, 0x00, 0x90, 0xce, 0x01, 0x40, 0xf9, + 0xdf, 0x3d, 0x00, 0x72, 0x00, 0x03, 0x00, 0x54, + 0xcd, 0x3d, 0x40, 0x92, 0xce, 0x3d, 0x00, 0x12, + 0xdf, 0x2d, 0x00, 0x71, 0x49, 0x01, 0x00, 0x54, + 0x9f, 0x01, 0x00, 0xf1, 0xec, 0x07, 0x9f, 0x1a, + 0x4c, 0x4d, 0x2c, 0x8b, 0xae, 0xf1, 0x7d, 0xd3, + 0x8c, 0x01, 0x0e, 0x8b, 0x8c, 0x01, 0x15, 0xcb, + 0x8c, 0x41, 0x01, 0x91, 0x9f, 0x01, 0x01, 0xf1, + 0xc2, 0x01, 0x00, 0x54, 0x0c, 0x00, 0x80, 0xd2, + 0x8d, 0x01, 0x0d, 0xcb, 0x8c, 0xf1, 0x7d, 0xd3, + 0x8b, 0x0d, 0x0b, 0x8b, 0x6b, 0x01, 0x0a, 0x8b, + 0x6b, 0x41, 0x01, 0x91, 0xac, 0x7a, 0x6d, 0xf8, + 0x6c, 0x85, 0x00, 0xf8, 0xad, 0x05, 0x00, 0xb1, + 0xa3, 0xff, 0xff, 0x54, 0xaa, 0xda, 0x29, 0xf8, + 0xf5, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + 0xac, 0x31, 0x7d, 0x92, 0xae, 0x02, 0x0e, 0xcb, + 0xce, 0x81, 0x00, 0x91, 0x4f, 0x0d, 0x0b, 0x8b, + 0xef, 0x01, 0x02, 0x91, 0xf0, 0x03, 0x0c, 0xaa, + 0xc0, 0x05, 0x7f, 0xad, 0xc2, 0x0d, 0xc2, 0xac, + 0xe0, 0x85, 0x3e, 0xad, 0xe2, 0x8d, 0x3f, 0xad, + 0xef, 0x01, 0x01, 0x91, 0x10, 0x22, 0x00, 0xf1, + 0x41, 0xff, 0xff, 0x54, 0x9f, 0x01, 0x0d, 0xeb, + 0xc1, 0xfc, 0xff, 0x54, 0xee, 0xff, 0xff, 0x17, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_33rx(code + 0xa8, (uintptr_t)data); + patch_aarch64_26r(code + 0x11c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_0.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8d0b ldr x11, [x8, #-0x8]! + // 8: f100017f cmp x11, #0x0 + // c: 1a9f07ec cset w12, ne + // 10: f85f810d ldur x13, [x8, #-0x8] + // 14: f94019aa ldr x10, [x13, #0x30] + // 18: f9407ac9 ldr x9, [x22, #0xf0] + // 1c: b9804d4e ldrsw x14, [x10, #0x4c] + // 20: 8b0e0d2e add x14, x9, x14, lsl #3 + // 24: f9007ace str x14, [x22, #0xf0] + // 28: a900b534 stp x20, x13, [x9, #0x8] + // 2c: b940014e ldr w14, [x10] + // 30: 37f8006e tbnz w14, #0x1f, 0x3c + // 34: 110005ce add w14, w14, #0x1 + // 38: b900014e str w14, [x10] + // 3c: f900012a str x10, [x9] + // 40: 3dc005a0 ldr q0, [x13, #0x10] + // 44: 3c818120 stur q0, [x9, #0x18] + // 48: 9101412d add x13, x9, #0x50 + // 4c: b980494e ldrsw x14, [x10, #0x48] + // 50: 8b0e0daf add x15, x13, x14, lsl #3 + // 54: a902fd3f stp xzr, xzr, [x9, #0x28] + // 58: 91034150 add x16, x10, #0xd0 + // 5c: a903bd30 stp x16, x15, [x9, #0x38] + // 60: b900493f str wzr, [x9, #0x48] + // 64: 6b0c01df cmp w14, w12 + // 68: 5400010d b.le 0x88 + // 6c: f100017f cmp x11, #0x0 + // 70: 1a9f07eb cset w11, ne + // 74: f82b79bf str xzr, [x13, x11, lsl #3] + // 78: 9100056b add x11, x11, #0x1 + // 7c: b980494c ldrsw x12, [x10, #0x48] + // 80: eb0c017f cmp x11, x12 + // 84: 54ffff8b b.lt 0x74 + // 88: f85f82aa ldur x10, [x21, #-0x8] + // 8c: f900292a str x10, [x9, #0x50] + // 90: f81f02a9 stur x9, [x21, #-0x10] + // 94: aa0803f5 mov x21, x8 + // 98: 14000000 b 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 9c: 00 00 00 00 + const unsigned char code_body[160] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0b, 0x8d, 0x5f, 0xf8, + 0x7f, 0x01, 0x00, 0xf1, 0xec, 0x07, 0x9f, 0x1a, + 0x0d, 0x81, 0x5f, 0xf8, 0xaa, 0x19, 0x40, 0xf9, + 0xc9, 0x7a, 0x40, 0xf9, 0x4e, 0x4d, 0x80, 0xb9, + 0x2e, 0x0d, 0x0e, 0x8b, 0xce, 0x7a, 0x00, 0xf9, + 0x34, 0xb5, 0x00, 0xa9, 0x4e, 0x01, 0x40, 0xb9, + 0x6e, 0x00, 0xf8, 0x37, 0xce, 0x05, 0x00, 0x11, + 0x4e, 0x01, 0x00, 0xb9, 0x2a, 0x01, 0x00, 0xf9, + 0xa0, 0x05, 0xc0, 0x3d, 0x20, 0x81, 0x81, 0x3c, + 0x2d, 0x41, 0x01, 0x91, 0x4e, 0x49, 0x80, 0xb9, + 0xaf, 0x0d, 0x0e, 0x8b, 0x3f, 0xfd, 0x02, 0xa9, + 0x50, 0x41, 0x03, 0x91, 0x30, 0xbd, 0x03, 0xa9, + 0x3f, 0x49, 0x00, 0xb9, 0xdf, 0x01, 0x0c, 0x6b, + 0x0d, 0x01, 0x00, 0x54, 0x7f, 0x01, 0x00, 0xf1, + 0xeb, 0x07, 0x9f, 0x1a, 0xbf, 0x79, 0x2b, 0xf8, + 0x6b, 0x05, 0x00, 0x91, 0x4c, 0x49, 0x80, 0xb9, + 0x7f, 0x01, 0x0c, 0xeb, 0x8b, 0xff, 0xff, 0x54, + 0xaa, 0x82, 0x5f, 0xf8, 0x2a, 0x29, 0x00, 0xf9, + 0xa9, 0x02, 0x1f, 0xf8, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x98, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f0d09 ldr x9, [x8, #-0x10]! + // 8: f100013f cmp x9, #0x0 + // c: 5280002a mov w10, #0x1 ; =1 + // 10: 1a8a054b cinc w11, w10, ne + // 14: f85f810d ldur x13, [x8, #-0x8] + // 18: f94019ac ldr x12, [x13, #0x30] + // 1c: f9407aca ldr x10, [x22, #0xf0] + // 20: b9804d8e ldrsw x14, [x12, #0x4c] + // 24: 8b0e0d4e add x14, x10, x14, lsl #3 + // 28: f9007ace str x14, [x22, #0xf0] + // 2c: a900b554 stp x20, x13, [x10, #0x8] + // 30: b940018e ldr w14, [x12] + // 34: 37f8006e tbnz w14, #0x1f, 0x40 + // 38: 110005ce add w14, w14, #0x1 + // 3c: b900018e str w14, [x12] + // 40: f900014c str x12, [x10] + // 44: 3dc005a0 ldr q0, [x13, #0x10] + // 48: 3c818140 stur q0, [x10, #0x18] + // 4c: 9101414d add x13, x10, #0x50 + // 50: b980498e ldrsw x14, [x12, #0x48] + // 54: 8b0e0daf add x15, x13, x14, lsl #3 + // 58: a902fd5f stp xzr, xzr, [x10, #0x28] + // 5c: 91034190 add x16, x12, #0xd0 + // 60: a903bd50 stp x16, x15, [x10, #0x38] + // 64: b900495f str wzr, [x10, #0x48] + // 68: 6b0b01df cmp w14, w11 + // 6c: 540000cd b.le 0x84 + // 70: f82b79bf str xzr, [x13, x11, lsl #3] + // 74: 9100056b add x11, x11, #0x1 + // 78: b980498e ldrsw x14, [x12, #0x48] + // 7c: eb0e017f cmp x11, x14 + // 80: 54ffff8b b.lt 0x70 + // 84: f100013f cmp x9, #0x0 + // 88: 1a9f07e9 cset w9, ne + // 8c: f85f02ab ldur x11, [x21, #-0x10] + // 90: f900294b str x11, [x10, #0x50] + // 94: f85f82ab ldur x11, [x21, #-0x8] + // 98: f82959ab str x11, [x13, w9, uxtw #3] + // 9c: f81e82aa stur x10, [x21, #-0x18] + // a0: aa0803f5 mov x21, x8 + // a4: 14000000 b 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[168] = { + 0xe8, 0x03, 0x15, 0xaa, 0x09, 0x0d, 0x5f, 0xf8, + 0x3f, 0x01, 0x00, 0xf1, 0x2a, 0x00, 0x80, 0x52, + 0x4b, 0x05, 0x8a, 0x1a, 0x0d, 0x81, 0x5f, 0xf8, + 0xac, 0x19, 0x40, 0xf9, 0xca, 0x7a, 0x40, 0xf9, + 0x8e, 0x4d, 0x80, 0xb9, 0x4e, 0x0d, 0x0e, 0x8b, + 0xce, 0x7a, 0x00, 0xf9, 0x54, 0xb5, 0x00, 0xa9, + 0x8e, 0x01, 0x40, 0xb9, 0x6e, 0x00, 0xf8, 0x37, + 0xce, 0x05, 0x00, 0x11, 0x8e, 0x01, 0x00, 0xb9, + 0x4c, 0x01, 0x00, 0xf9, 0xa0, 0x05, 0xc0, 0x3d, + 0x40, 0x81, 0x81, 0x3c, 0x4d, 0x41, 0x01, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0xaf, 0x0d, 0x0e, 0x8b, + 0x5f, 0xfd, 0x02, 0xa9, 0x90, 0x41, 0x03, 0x91, + 0x50, 0xbd, 0x03, 0xa9, 0x5f, 0x49, 0x00, 0xb9, + 0xdf, 0x01, 0x0b, 0x6b, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2b, 0xf8, 0x6b, 0x05, 0x00, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0x7f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x3f, 0x01, 0x00, 0xf1, + 0xe9, 0x07, 0x9f, 0x1a, 0xab, 0x02, 0x5f, 0xf8, + 0x4b, 0x29, 0x00, 0xf9, 0xab, 0x82, 0x5f, 0xf8, + 0xab, 0x59, 0x29, 0xf8, 0xaa, 0x82, 0x1e, 0xf8, + 0xf5, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xa4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_2.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85e8d0a ldr x10, [x8, #-0x18]! + // 8: f100015f cmp x10, #0x0 + // c: 52800049 mov w9, #0x2 ; =2 + // 10: 1a89052b cinc w11, w9, ne + // 14: f85f810d ldur x13, [x8, #-0x8] + // 18: f94019ac ldr x12, [x13, #0x30] + // 1c: f9407ac9 ldr x9, [x22, #0xf0] + // 20: b9804d8e ldrsw x14, [x12, #0x4c] + // 24: 8b0e0d2e add x14, x9, x14, lsl #3 + // 28: f9007ace str x14, [x22, #0xf0] + // 2c: a900b534 stp x20, x13, [x9, #0x8] + // 30: b940018e ldr w14, [x12] + // 34: 37f8006e tbnz w14, #0x1f, 0x40 + // 38: 110005ce add w14, w14, #0x1 + // 3c: b900018e str w14, [x12] + // 40: f900012c str x12, [x9] + // 44: 3dc005a0 ldr q0, [x13, #0x10] + // 48: 3c818120 stur q0, [x9, #0x18] + // 4c: 9101412d add x13, x9, #0x50 + // 50: b980498e ldrsw x14, [x12, #0x48] + // 54: 8b0e0daf add x15, x13, x14, lsl #3 + // 58: a902fd3f stp xzr, xzr, [x9, #0x28] + // 5c: 91034190 add x16, x12, #0xd0 + // 60: a903bd30 stp x16, x15, [x9, #0x38] + // 64: b900493f str wzr, [x9, #0x48] + // 68: 6b0b01df cmp w14, w11 + // 6c: 540000cd b.le 0x84 + // 70: f82b79bf str xzr, [x13, x11, lsl #3] + // 74: 9100056b add x11, x11, #0x1 + // 78: b980498e ldrsw x14, [x12, #0x48] + // 7c: eb0e017f cmp x11, x14 + // 80: 54ffff8b b.lt 0x70 + // 84: f100015f cmp x10, #0x0 + // 88: 1a9f07ea cset w10, ne + // 8c: 8b2a4daa add x10, x13, w10, uxtw #3 + // 90: f85e82ab ldur x11, [x21, #-0x18] + // 94: f900292b str x11, [x9, #0x50] + // 98: f85f02ab ldur x11, [x21, #-0x10] + // 9c: f900014b str x11, [x10] + // a0: f85f82ab ldur x11, [x21, #-0x8] + // a4: f900054b str x11, [x10, #0x8] + // a8: f81e02a9 stur x9, [x21, #-0x20] + // ac: aa0803f5 mov x21, x8 + // b0: 14000000 b 0xb0 + // 00000000000000b0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b4: 00 00 00 00 + const unsigned char code_body[184] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0a, 0x8d, 0x5e, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0x49, 0x00, 0x80, 0x52, + 0x2b, 0x05, 0x89, 0x1a, 0x0d, 0x81, 0x5f, 0xf8, + 0xac, 0x19, 0x40, 0xf9, 0xc9, 0x7a, 0x40, 0xf9, + 0x8e, 0x4d, 0x80, 0xb9, 0x2e, 0x0d, 0x0e, 0x8b, + 0xce, 0x7a, 0x00, 0xf9, 0x34, 0xb5, 0x00, 0xa9, + 0x8e, 0x01, 0x40, 0xb9, 0x6e, 0x00, 0xf8, 0x37, + 0xce, 0x05, 0x00, 0x11, 0x8e, 0x01, 0x00, 0xb9, + 0x2c, 0x01, 0x00, 0xf9, 0xa0, 0x05, 0xc0, 0x3d, + 0x20, 0x81, 0x81, 0x3c, 0x2d, 0x41, 0x01, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0xaf, 0x0d, 0x0e, 0x8b, + 0x3f, 0xfd, 0x02, 0xa9, 0x90, 0x41, 0x03, 0x91, + 0x30, 0xbd, 0x03, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0xdf, 0x01, 0x0b, 0x6b, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2b, 0xf8, 0x6b, 0x05, 0x00, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0x7f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x5f, 0x01, 0x00, 0xf1, + 0xea, 0x07, 0x9f, 0x1a, 0xaa, 0x4d, 0x2a, 0x8b, + 0xab, 0x82, 0x5e, 0xf8, 0x2b, 0x29, 0x00, 0xf9, + 0xab, 0x02, 0x5f, 0xf8, 0x4b, 0x01, 0x00, 0xf9, + 0xab, 0x82, 0x5f, 0xf8, 0x4b, 0x05, 0x00, 0xf9, + 0xa9, 0x02, 0x1e, 0xf8, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xb0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_3.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85e0d0a ldr x10, [x8, #-0x20]! + // 8: f100015f cmp x10, #0x0 + // c: 52800069 mov w9, #0x3 ; =3 + // 10: 1a89052b cinc w11, w9, ne + // 14: f85f810d ldur x13, [x8, #-0x8] + // 18: f94019ac ldr x12, [x13, #0x30] + // 1c: f9407ac9 ldr x9, [x22, #0xf0] + // 20: b9804d8e ldrsw x14, [x12, #0x4c] + // 24: 8b0e0d2e add x14, x9, x14, lsl #3 + // 28: f9007ace str x14, [x22, #0xf0] + // 2c: a900b534 stp x20, x13, [x9, #0x8] + // 30: b940018e ldr w14, [x12] + // 34: 37f8006e tbnz w14, #0x1f, 0x40 + // 38: 110005ce add w14, w14, #0x1 + // 3c: b900018e str w14, [x12] + // 40: f900012c str x12, [x9] + // 44: 3dc005a0 ldr q0, [x13, #0x10] + // 48: 3c818120 stur q0, [x9, #0x18] + // 4c: 9101412d add x13, x9, #0x50 + // 50: b980498e ldrsw x14, [x12, #0x48] + // 54: 8b0e0daf add x15, x13, x14, lsl #3 + // 58: a902fd3f stp xzr, xzr, [x9, #0x28] + // 5c: 91034190 add x16, x12, #0xd0 + // 60: a903bd30 stp x16, x15, [x9, #0x38] + // 64: b900493f str wzr, [x9, #0x48] + // 68: 6b0b01df cmp w14, w11 + // 6c: 540000cd b.le 0x84 + // 70: f82b79bf str xzr, [x13, x11, lsl #3] + // 74: 9100056b add x11, x11, #0x1 + // 78: b980498e ldrsw x14, [x12, #0x48] + // 7c: eb0e017f cmp x11, x14 + // 80: 54ffff8b b.lt 0x70 + // 84: f100015f cmp x10, #0x0 + // 88: 1a9f07ea cset w10, ne + // 8c: 8b2a4daa add x10, x13, w10, uxtw #3 + // 90: f85e02ab ldur x11, [x21, #-0x20] + // 94: f900292b str x11, [x9, #0x50] + // 98: f85e82ab ldur x11, [x21, #-0x18] + // 9c: f900014b str x11, [x10] + // a0: f85f02ab ldur x11, [x21, #-0x10] + // a4: f900054b str x11, [x10, #0x8] + // a8: f85f82ab ldur x11, [x21, #-0x8] + // ac: f900094b str x11, [x10, #0x10] + // b0: f81d82a9 stur x9, [x21, #-0x28] + // b4: aa0803f5 mov x21, x8 + // b8: 14000000 b 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0a, 0x0d, 0x5e, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0x69, 0x00, 0x80, 0x52, + 0x2b, 0x05, 0x89, 0x1a, 0x0d, 0x81, 0x5f, 0xf8, + 0xac, 0x19, 0x40, 0xf9, 0xc9, 0x7a, 0x40, 0xf9, + 0x8e, 0x4d, 0x80, 0xb9, 0x2e, 0x0d, 0x0e, 0x8b, + 0xce, 0x7a, 0x00, 0xf9, 0x34, 0xb5, 0x00, 0xa9, + 0x8e, 0x01, 0x40, 0xb9, 0x6e, 0x00, 0xf8, 0x37, + 0xce, 0x05, 0x00, 0x11, 0x8e, 0x01, 0x00, 0xb9, + 0x2c, 0x01, 0x00, 0xf9, 0xa0, 0x05, 0xc0, 0x3d, + 0x20, 0x81, 0x81, 0x3c, 0x2d, 0x41, 0x01, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0xaf, 0x0d, 0x0e, 0x8b, + 0x3f, 0xfd, 0x02, 0xa9, 0x90, 0x41, 0x03, 0x91, + 0x30, 0xbd, 0x03, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0xdf, 0x01, 0x0b, 0x6b, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2b, 0xf8, 0x6b, 0x05, 0x00, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0x7f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x5f, 0x01, 0x00, 0xf1, + 0xea, 0x07, 0x9f, 0x1a, 0xaa, 0x4d, 0x2a, 0x8b, + 0xab, 0x02, 0x5e, 0xf8, 0x2b, 0x29, 0x00, 0xf9, + 0xab, 0x82, 0x5e, 0xf8, 0x4b, 0x01, 0x00, 0xf9, + 0xab, 0x02, 0x5f, 0xf8, 0x4b, 0x05, 0x00, 0xf9, + 0xab, 0x82, 0x5f, 0xf8, 0x4b, 0x09, 0x00, 0xf9, + 0xa9, 0x82, 0x1d, 0xf8, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xb8, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_4.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85d8d0a ldr x10, [x8, #-0x28]! + // 8: f100015f cmp x10, #0x0 + // c: 52800089 mov w9, #0x4 ; =4 + // 10: 1a89052b cinc w11, w9, ne + // 14: f85f810d ldur x13, [x8, #-0x8] + // 18: f94019ac ldr x12, [x13, #0x30] + // 1c: f9407ac9 ldr x9, [x22, #0xf0] + // 20: b9804d8e ldrsw x14, [x12, #0x4c] + // 24: 8b0e0d2e add x14, x9, x14, lsl #3 + // 28: f9007ace str x14, [x22, #0xf0] + // 2c: a900b534 stp x20, x13, [x9, #0x8] + // 30: b940018e ldr w14, [x12] + // 34: 37f8006e tbnz w14, #0x1f, 0x40 + // 38: 110005ce add w14, w14, #0x1 + // 3c: b900018e str w14, [x12] + // 40: f900012c str x12, [x9] + // 44: 3dc005a0 ldr q0, [x13, #0x10] + // 48: 3c818120 stur q0, [x9, #0x18] + // 4c: 9101412d add x13, x9, #0x50 + // 50: b980498e ldrsw x14, [x12, #0x48] + // 54: 8b0e0daf add x15, x13, x14, lsl #3 + // 58: a902fd3f stp xzr, xzr, [x9, #0x28] + // 5c: 91034190 add x16, x12, #0xd0 + // 60: a903bd30 stp x16, x15, [x9, #0x38] + // 64: b900493f str wzr, [x9, #0x48] + // 68: 6b0b01df cmp w14, w11 + // 6c: 540000cd b.le 0x84 + // 70: f82b79bf str xzr, [x13, x11, lsl #3] + // 74: 9100056b add x11, x11, #0x1 + // 78: b980498e ldrsw x14, [x12, #0x48] + // 7c: eb0e017f cmp x11, x14 + // 80: 54ffff8b b.lt 0x70 + // 84: f100015f cmp x10, #0x0 + // 88: 1a9f07ea cset w10, ne + // 8c: 8b2a4daa add x10, x13, w10, uxtw #3 + // 90: f85d82ab ldur x11, [x21, #-0x28] + // 94: f900292b str x11, [x9, #0x50] + // 98: f85e02ab ldur x11, [x21, #-0x20] + // 9c: f900014b str x11, [x10] + // a0: f85e82ab ldur x11, [x21, #-0x18] + // a4: f900054b str x11, [x10, #0x8] + // a8: f85f02ab ldur x11, [x21, #-0x10] + // ac: f900094b str x11, [x10, #0x10] + // b0: f85f82ab ldur x11, [x21, #-0x8] + // b4: f9000d4b str x11, [x10, #0x18] + // b8: f81d02a9 stur x9, [x21, #-0x30] + // bc: aa0803f5 mov x21, x8 + // c0: 14000000 b 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // c4: 00 00 00 00 + const unsigned char code_body[200] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0a, 0x8d, 0x5d, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0x89, 0x00, 0x80, 0x52, + 0x2b, 0x05, 0x89, 0x1a, 0x0d, 0x81, 0x5f, 0xf8, + 0xac, 0x19, 0x40, 0xf9, 0xc9, 0x7a, 0x40, 0xf9, + 0x8e, 0x4d, 0x80, 0xb9, 0x2e, 0x0d, 0x0e, 0x8b, + 0xce, 0x7a, 0x00, 0xf9, 0x34, 0xb5, 0x00, 0xa9, + 0x8e, 0x01, 0x40, 0xb9, 0x6e, 0x00, 0xf8, 0x37, + 0xce, 0x05, 0x00, 0x11, 0x8e, 0x01, 0x00, 0xb9, + 0x2c, 0x01, 0x00, 0xf9, 0xa0, 0x05, 0xc0, 0x3d, + 0x20, 0x81, 0x81, 0x3c, 0x2d, 0x41, 0x01, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0xaf, 0x0d, 0x0e, 0x8b, + 0x3f, 0xfd, 0x02, 0xa9, 0x90, 0x41, 0x03, 0x91, + 0x30, 0xbd, 0x03, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0xdf, 0x01, 0x0b, 0x6b, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2b, 0xf8, 0x6b, 0x05, 0x00, 0x91, + 0x8e, 0x49, 0x80, 0xb9, 0x7f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x5f, 0x01, 0x00, 0xf1, + 0xea, 0x07, 0x9f, 0x1a, 0xaa, 0x4d, 0x2a, 0x8b, + 0xab, 0x82, 0x5d, 0xf8, 0x2b, 0x29, 0x00, 0xf9, + 0xab, 0x02, 0x5e, 0xf8, 0x4b, 0x01, 0x00, 0xf9, + 0xab, 0x82, 0x5e, 0xf8, 0x4b, 0x05, 0x00, 0xf9, + 0xab, 0x02, 0x5f, 0xf8, 0x4b, 0x09, 0x00, 0xf9, + 0xab, 0x82, 0x5f, 0xf8, 0x4b, 0x0d, 0x00, 0xf9, + 0xa9, 0x02, 0x1d, 0xf8, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__IS_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_NONE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000008 adrp x8, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // c: eb08001f cmp x0, x8 + // 10: 54000140 b.eq 0x38 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000120 b.eq 0x48 + // 28: 90000008 adrp x8, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 30: f81f82a8 stur x8, [x21, #-0x8] + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 38: 90000008 adrp x8, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 40: f81f82a8 stur x8, [x21, #-0x8] + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 48: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4c: 910003fd mov x29, sp + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 54: 90000008 adrp x8, 0x0 + // 0000000000000054: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: f81f82a8 stur x8, [x21, #-0x8] + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[104] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x20, 0x01, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_NoneStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x50, 0x0, state); + patch_aarch64_33rx(code + 0x54, (uintptr_t)data); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__IS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_OP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: aa1503f3 mov x19, x21 + // c: f85f8e77 ldr x23, [x19, #-0x8]! + // 10: f85f8278 ldur x24, [x19, #-0x8] + // 14: b9400308 ldr w8, [x24] + // 18: 37f800c8 tbnz w8, #0x1f, 0x30 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000308 str w8, [x24] + // 24: 54000061 b.ne 0x30 + // 28: aa1803e0 mov x0, x24 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 30: b94002e8 ldr w8, [x23] + // 34: 37f800c8 tbnz w8, #0x1f, 0x4c + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b90002e8 str w8, [x23] + // 40: 54000061 b.ne 0x4c + // 44: aa1703e0 mov x0, x23 + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 4c: eb17031f cmp x24, x23 + // 50: 1a9f17e8 cset w8, eq + // 54: 90000009 adrp x9, 0x0 + // 0000000000000054: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 58: f9400129 ldr x9, [x9] + // 0000000000000058: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 5c: 9000000a adrp x10, 0x0 + // 000000000000005c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 60: f940014a ldr x10, [x10] + // 0000000000000060: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 64: 9000000b adrp x11, 0x0 + // 0000000000000064: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 68: f940016b ldr x11, [x11] + // 0000000000000068: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 6c: 6b29211f cmp w8, w9, uxth + // 70: 9a8a0168 csel x8, x11, x10, eq + // 74: f81f02a8 stur x8, [x21, #-0x10] + // 78: aa1303f5 mov x21, x19 + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 84: 00 00 00 00 + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x03, 0x15, 0xaa, 0x77, 0x8e, 0x5f, 0xf8, + 0x78, 0x82, 0x5f, 0xf8, 0x08, 0x03, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x1f, 0x03, 0x17, 0xeb, + 0xe8, 0x17, 0x9f, 0x1a, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x1f, 0x21, 0x29, 0x6b, + 0x68, 0x01, 0x8a, 0x9a, 0xa8, 0x02, 0x1f, 0xf8, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x2c, 0x0, state); + patch_aarch64_trampoline(code + 0x48, 0x0, state); + patch_aarch64_33rx(code + 0x54, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x5c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x64, (uintptr_t)data); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_CHECK_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_LIST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyListIter_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyListIter_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyListIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyListIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_CHECK_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_RANGE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyRangeIter_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyRangeIter_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyRangeIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyRangeIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_CHECK_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyTupleIter_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyTupleIter_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyTupleIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTupleIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_NEXT_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_LIST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: a941250a ldp x10, x9, [x8, #0x10] + // 8: f9400d29 ldr x9, [x9, #0x18] + // c: 9100054b add x11, x10, #0x1 + // 10: f900090b str x11, [x8, #0x10] + // 14: f86a7928 ldr x8, [x9, x10, lsl #3] + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x0a, 0x25, 0x41, 0xa9, + 0x29, 0x0d, 0x40, 0xf9, 0x4b, 0x05, 0x00, 0x91, + 0x0b, 0x09, 0x00, 0xf9, 0x28, 0x79, 0x6a, 0xf8, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_NEXT_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_RANGE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82a8 ldur x8, [x21, #-0x8] + // c: a9412500 ldp x0, x9, [x8, #0x10] + // 10: 8b000129 add x9, x9, x0 + // 14: f9000909 str x9, [x8, #0x10] + // 18: f9401109 ldr x9, [x8, #0x20] + // 1c: d1000529 sub x9, x9, #0x1 + // 20: f9001109 str x9, [x8, #0x20] + // 24: 94000000 bl 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 _PyLong_FromLong + // 28: b4000080 cbz x0, 0x38 + // 2c: f80086a0 str x0, [x21], #0x8 + // 30: a8c17bfd ldp x29, x30, [sp], #0x10 + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa8, 0x82, 0x5f, 0xf8, 0x00, 0x25, 0x41, 0xa9, + 0x29, 0x01, 0x00, 0x8b, 0x09, 0x09, 0x00, 0xf9, + 0x09, 0x11, 0x40, 0xf9, 0x29, 0x05, 0x00, 0xd1, + 0x09, 0x11, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x94, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x24, 0x42, state); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); +} + +void +emit__ITER_NEXT_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: a941250a ldp x10, x9, [x8, #0x10] + // 8: 8b0a0d29 add x9, x9, x10, lsl #3 + // c: 9100054a add x10, x10, #0x1 + // 10: f900090a str x10, [x8, #0x10] + // 14: f9400d28 ldr x8, [x9, #0x18] + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x0a, 0x25, 0x41, 0xa9, + 0x29, 0x0d, 0x0a, 0x8b, 0x4a, 0x05, 0x00, 0x91, + 0x0a, 0x09, 0x00, 0xf9, 0x28, 0x0d, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__JUMP_TO_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _JUMP_TO_TOP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 14000000 b 0x0 + // 0000000000000000: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 4: 00 00 00 00 + const unsigned char code_body[8] = { + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x0, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_APPEND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 2a2803e8 mvn w8, w8 + // c: 531d7108 lsl w8, w8, #3 + // 10: b26db108 orr x8, x8, #0xfffffffffff80000 + // 14: f8686aa0 ldr x0, [x21, x8] + // 18: f85f8ea1 ldr x1, [x21, #-0x8]! + // 1c: f9400808 ldr x8, [x0, #0x10] + // 20: f9401009 ldr x9, [x0, #0x20] + // 24: eb08013f cmp x9, x8 + // 28: 540000cd b.le 0x40 + // 2c: f9400c09 ldr x9, [x0, #0x18] + // 30: f8287921 str x1, [x9, x8, lsl #3] + // 34: 91000508 add x8, x8, #0x1 + // 38: f9000808 str x8, [x0, #0x10] + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 40: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 44: 910003fd mov x29, sp + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __PyList_AppendTakeRefListResize + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: 37f80040 tbnz w0, #0x1f, 0x58 + // 54: 14000000 b 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 5c: 00 00 00 00 + const unsigned char code_body[96] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x28, 0x2a, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0xa1, 0x8e, 0x5f, 0xf8, 0x08, 0x08, 0x40, 0xf9, + 0x09, 0x10, 0x40, 0xf9, 0x3f, 0x01, 0x08, 0xeb, + 0xcd, 0x00, 0x00, 0x54, 0x09, 0x0c, 0x40, 0xf9, + 0x21, 0x79, 0x28, 0xf8, 0x08, 0x05, 0x00, 0x91, + 0x08, 0x08, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x40, 0x00, 0xf8, 0x37, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x48, 0x18, state); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x58, state->instruction_starts[instruction->error_target]); +} + +void +emit__LIST_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_EXTEND.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 2a2803e8 mvn w8, w8 + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: 531d7108 lsl w8, w8, #3 + // 20: b26db108 orr x8, x8, #0xfffffffffff80000 + // 24: f8686aa0 ldr x0, [x21, x8] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: aa1303e1 mov x1, x19 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __PyList_Extend + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: b4000140 cbz x0, 0x64 + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 54000540 b.eq 0xf8 + // 54: d10022b5 sub x21, x21, #0x8 + // 58: a9417bfd ldp x29, x30, [sp, #0x10] + // 5c: 910083ff add sp, sp, #0x20 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: f9002295 str x21, [x20, #0x40] + // 68: 90000017 adrp x23, 0x0 + // 0000000000000068: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // 6c: f94002f7 ldr x23, [x23] + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // 70: f94002e1 ldr x1, [x23] + // 74: aa1603e0 mov x0, x22 + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __PyErr_ExceptionMatches + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: 34000280 cbz w0, 0xd4 + // 88: f9400668 ldr x8, [x19, #0x8] + // 8c: f9406d08 ldr x8, [x8, #0xd8] + // 90: b5000228 cbnz x8, 0xd4 + // 94: aa1303e0 mov x0, x19 + // 98: 94000000 bl 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 _PySequence_Check + // 9c: 350001c0 cbnz w0, 0xd4 + // a0: f9002295 str x21, [x20, #0x40] + // a4: aa1603e0 mov x0, x22 + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __PyErr_Clear + // ac: f94002e1 ldr x1, [x23] + // b0: f9400668 ldr x8, [x19, #0x8] + // b4: f9400d08 ldr x8, [x8, #0x18] + // b8: f90003e8 str x8, [sp] + // bc: 90000002 adrp x2, 0x0 + // 00000000000000bc: ARM64_RELOC_PAGE21 l_.str + // c0: 91000042 add x2, x2, #0x0 + // 00000000000000c0: ARM64_RELOC_PAGEOFF12 l_.str + // c4: aa1603e0 mov x0, x22 + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __PyErr_Format + // cc: f9402295 ldr x21, [x20, #0x40] + // d0: f900229f str xzr, [x20, #0x40] + // d4: b9400268 ldr w8, [x19] + // d8: 37f80088 tbnz w8, #0x1f, 0xe8 + // dc: 71000508 subs w8, w8, #0x1 + // e0: b9000268 str w8, [x19] + // e4: 54000160 b.eq 0x110 + // e8: d10022b5 sub x21, x21, #0x8 + // ec: a9417bfd ldp x29, x30, [sp, #0x10] + // f0: 910083ff add sp, sp, #0x20 + // f4: 14000000 b 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // f8: aa1303e0 mov x0, x19 + // fc: 94000000 bl 0xfc + // 00000000000000fc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 100: d10022b5 sub x21, x21, #0x8 + // 104: a9417bfd ldp x29, x30, [sp, #0x10] + // 108: 910083ff add sp, sp, #0x20 + // 10c: 14000000 b 0x10c + // 000000000000010c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 110: aa1303e0 mov x0, x19 + // 114: 94000000 bl 0x114 + // 0000000000000114: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 118: d10022b5 sub x21, x21, #0x8 + // 11c: a9417bfd ldp x29, x30, [sp, #0x10] + // 120: 910083ff add sp, sp, #0x20 + // 124: 14000000 b 0x124 + // 0000000000000124: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[296] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x28, 0x2a, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x40, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x40, 0x05, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x17, 0x00, 0x00, 0x90, 0xf7, 0x02, 0x40, 0xf9, + 0xe1, 0x02, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x02, 0x00, 0x34, + 0x68, 0x06, 0x40, 0xf9, 0x08, 0x6d, 0x40, 0xf9, + 0x28, 0x02, 0x00, 0xb5, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xc0, 0x01, 0x00, 0x35, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe1, 0x02, 0x40, 0xf9, + 0x68, 0x06, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0xe8, 0x03, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x60, 0x01, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: 'Value after * must be an iterable, not %.200s\x00' + // 2e: 00 00 + // 30: &PyExc_TypeError+0x0 + // 38: OPARG + const unsigned char data_body[64] = { + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, + 0x2e, 0x32, 0x30, 0x30, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x38, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x38); + patch_aarch64_trampoline(code + 0x30, 0x44, state); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x68, (uintptr_t)data + 0x30); + patch_aarch64_trampoline(code + 0x78, 0x34, state); + patch_aarch64_trampoline(code + 0x98, 0x43, state); + patch_aarch64_trampoline(code + 0xa8, 0x3a, state); + patch_aarch64_21r(code + 0xbc, (uintptr_t)data); + patch_aarch64_12(code + 0xc0, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xc8, 0x30, state); + patch_aarch64_26r(code + 0xf4, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xfc, 0x0, state); + patch_aarch64_26r(code + 0x10c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x114, 0x0, state); + patch_aarch64_26r(code + 0x124, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: 90000017 adrp x23, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f94002f7 ldr x23, [x23] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: f85f82b3 ldur x19, [x21, #-0x8] + // 18: f9400288 ldr x8, [x20] + // 1c: f9401108 ldr x8, [x8, #0x20] + // 20: 53013ee9 ubfx w9, w23, #1, #15 + // 24: 8b294d08 add x8, x8, w9, uxtw #3 + // 28: f9400d01 ldr x1, [x8, #0x18] + // 2c: 37000257 tbnz w23, #0x0, 0x74 + // 30: f9002295 str x21, [x20, #0x40] + // 34: aa1303e0 mov x0, x19 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 _PyObject_GetAttr + // 3c: f9402298 ldr x24, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 54000460 b.eq 0xe0 + // 58: b40004e0 cbz x0, 0xf4 + // 5c: 120002e8 and w8, w23, #0x1 + // 60: f81f8300 stur x0, [x24, #-0x8] + // 64: 8b284f15 add x21, x24, w8, uxtw #3 + // 68: a9417bfd ldp x29, x30, [sp, #0x10] + // 6c: 910083ff add sp, sp, #0x20 + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: f90007ff str xzr, [sp, #0x8] + // 78: f9002295 str x21, [x20, #0x40] + // 7c: 910023e2 add x2, sp, #0x8 + // 80: aa1303e0 mov x0, x19 + // 84: 94000000 bl 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __PyObject_GetMethod + // 88: f9402298 ldr x24, [x20, #0x40] + // 8c: f900229f str xzr, [x20, #0x40] + // 90: 34000060 cbz w0, 0x9c + // 94: f94007e0 ldr x0, [sp, #0x8] + // 98: 1400000b b 0xc4 + // 9c: b9400268 ldr w8, [x19] + // a0: 37f800c8 tbnz w8, #0x1f, 0xb8 + // a4: 71000508 subs w8, w8, #0x1 + // a8: b9000268 str w8, [x19] + // ac: 54000061 b.ne 0xb8 + // b0: aa1303e0 mov x0, x19 + // b4: 94000000 bl 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b8: f94007e0 ldr x0, [sp, #0x8] + // bc: b40001c0 cbz x0, 0xf4 + // c0: d2800013 mov x19, #0x0 ; =0 + // c4: f90002b3 str x19, [x21] + // c8: 120002e8 and w8, w23, #0x1 + // cc: f81f8300 stur x0, [x24, #-0x8] + // d0: 8b284f15 add x21, x24, w8, uxtw #3 + // d4: a9417bfd ldp x29, x30, [sp, #0x10] + // d8: 910083ff add sp, sp, #0x20 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: aa0003f5 mov x21, x0 + // e4: aa1303e0 mov x0, x19 + // e8: 94000000 bl 0xe8 + // 00000000000000e8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // ec: aa1503e0 mov x0, x21 + // f0: b5fffb75 cbnz x21, 0x5c + // f4: d1002315 sub x21, x24, #0x8 + // f8: a9417bfd ldp x29, x30, [sp, #0x10] + // fc: 910083ff add sp, sp, #0x20 + // 100: 14000000 b 0x100 + // 0000000000000100: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 104: 00 00 00 00 + const unsigned char code_body[264] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x17, 0x00, 0x00, 0x90, + 0xf7, 0x02, 0x40, 0xf9, 0xb3, 0x82, 0x5f, 0xf8, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0xe9, 0x3e, 0x01, 0x53, 0x08, 0x4d, 0x29, 0x8b, + 0x01, 0x0d, 0x40, 0xf9, 0x57, 0x02, 0x00, 0x37, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x60, 0x04, 0x00, 0x54, + 0xe0, 0x04, 0x00, 0xb4, 0xe8, 0x02, 0x00, 0x12, + 0x00, 0x83, 0x1f, 0xf8, 0x15, 0x4f, 0x28, 0x8b, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xff, 0x07, 0x00, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe2, 0x23, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x60, 0x00, 0x00, 0x34, 0xe0, 0x07, 0x40, 0xf9, + 0x0b, 0x00, 0x00, 0x14, 0x68, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x01, 0x00, 0xb4, + 0x13, 0x00, 0x80, 0xd2, 0xb3, 0x02, 0x00, 0xf9, + 0xe8, 0x02, 0x00, 0x12, 0x00, 0x83, 0x1f, 0xf8, + 0x15, 0x4f, 0x28, 0x8b, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x15, 0xaa, + 0x75, 0xfb, 0xff, 0xb5, 0x15, 0x23, 0x00, 0xd1, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x38, 0x46, state); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x84, 0x45, state); + patch_aarch64_trampoline(code + 0xb4, 0x0, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xe8, 0x0, state); + patch_aarch64_26r(code + 0x100, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_CLASS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000013 adrp x19, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400273 ldr x19, [x19] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: b9400268 ldr w8, [x19] + // 10: 37f80068 tbnz w8, #0x1f, 0x1c + // 14: 11000508 add w8, w8, #0x1 + // 18: b9000268 str w8, [x19] + // 1c: b9400008 ldr w8, [x0] + // 20: 37f80088 tbnz w8, #0x1f, 0x30 + // 24: 71000508 subs w8, w8, #0x1 + // 28: b9000008 str w8, [x0] + // 2c: 54000060 b.eq 0x38 + // 30: f81f82b3 stur x19, [x21, #-0x8] + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 38: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 3c: 910003fd mov x29, sp + // 40: 94000000 bl 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: f81f82b3 stur x19, [x21, #-0x8] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x13, 0x00, 0x00, 0x90, + 0x73, 0x02, 0x40, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x68, 0x02, 0x00, 0xb9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x60, 0x00, 0x00, 0x54, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x40, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_INSTANCE_VALUE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000008 adrp x8, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: 92403d08 and x8, x8, #0xffff + // 10: f8686808 ldr x8, [x0, x8] + // 14: b40001e8 cbz x8, 0x50 + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f81f82a8 stur x8, [x21, #-0x8] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: b9400008 ldr w8, [x0] + // 34: 37f80088 tbnz w8, #0x1f, 0x44 + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b9000008 str w8, [x0] + // 40: 540000a0 b.eq 0x54 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 50: 14000000 b 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 54: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 58: 910003fd mov x29, sp + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: f9402295 ldr x21, [x20, #0x40] + // 68: f900229f str xzr, [x20, #0x40] + // 6c: 14000000 b 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[112] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x3d, 0x40, 0x92, + 0x08, 0x68, 0x68, 0xf8, 0xe8, 0x01, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x82, 0x1f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x50, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x5c, 0x0, state); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_LAZY_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: b940012a ldr w10, [x9] + // 10: 37f8006a tbnz w10, #0x1f, 0x1c + // 14: 1100054a add w10, w10, #0x1 + // 18: b900012a str w10, [x9] + // 1c: a93fa2a9 stp x9, x8, [x21, #-0x8] + // 20: 910022b5 add x21, x21, #0x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xa2, 0x3f, 0xa9, + 0xb5, 0x22, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_METHOD_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_NO_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: b940012a ldr w10, [x9] + // 10: 37f8006a tbnz w10, #0x1f, 0x1c + // 14: 1100054a add w10, w10, #0x1 + // 18: b900012a str w10, [x9] + // 1c: a93fa2a9 stp x9, x8, [x21, #-0x8] + // 20: 910022b5 add x21, x21, #0x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xa2, 0x3f, 0xa9, + 0xb5, 0x22, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_METHOD_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_WITH_VALUES.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: b940012a ldr w10, [x9] + // 10: 37f8006a tbnz w10, #0x1f, 0x1c + // 14: 1100054a add w10, w10, #0x1 + // 18: b900012a str w10, [x9] + // 1c: a93fa2a9 stp x9, x8, [x21, #-0x8] + // 20: 910022b5 add x21, x21, #0x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xa2, 0x3f, 0xa9, + 0xb5, 0x22, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: f9400808 ldr x8, [x0, #0x10] + // 8: f9401108 ldr x8, [x8, #0x20] + // c: 39402509 ldrb w9, [x8, #0x9] + // 10: 5280002a mov w10, #0x1 ; =1 + // 14: 9ac92149 lsl x9, x10, x9 + // 18: 8b090108 add x8, x8, x9 + // 1c: 90000009 adrp x9, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 20: f9400129 ldr x9, [x9] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 24: 8b293108 add x8, x8, w9, uxth #4 + // 28: f9401513 ldr x19, [x8, #0x28] + // 2c: b4000193 cbz x19, 0x5c + // 30: b9400268 ldr w8, [x19] + // 34: 37f80068 tbnz w8, #0x1f, 0x40 + // 38: 11000508 add w8, w8, #0x1 + // 3c: b9000268 str w8, [x19] + // 40: b9400008 ldr w8, [x0] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000008 str w8, [x0] + // 50: 54000080 b.eq 0x60 + // 54: f81f82b3 stur x19, [x21, #-0x8] + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 60: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 64: 910003fd mov x29, sp + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: f81f82b3 stur x19, [x21, #-0x8] + // 74: 14000000 b 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[120] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x08, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x25, 0x40, 0x39, + 0x2a, 0x00, 0x80, 0x52, 0x49, 0x21, 0xc9, 0x9a, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x31, 0x29, 0x8b, + 0x13, 0x15, 0x40, 0xf9, 0x93, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x68, 0x02, 0x00, 0xb9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0xb3, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x68, 0x0, state); + patch_aarch64_26r(code + 0x74, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE_FROM_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8ea9 ldr x9, [x21, #-0x8]! + // 8: 3940252a ldrb w10, [x9, #0x9] + // c: 5280002b mov w11, #0x1 ; =1 + // 10: 9aca216a lsl x10, x11, x10 + // 14: 8b0a0129 add x9, x9, x10 + // 18: 9000000a adrp x10, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 20: 8b2a3129 add x9, x9, w10, uxth #4 + // 24: f9401529 ldr x9, [x9, #0x28] + // 28: b4000209 cbz x9, 0x68 + // 2c: f85f82a0 ldur x0, [x21, #-0x8] + // 30: b940012a ldr w10, [x9] + // 34: 37f8006a tbnz w10, #0x1f, 0x40 + // 38: 1100054a add w10, w10, #0x1 + // 3c: b900012a str w10, [x9] + // 40: f81f0109 stur x9, [x8, #-0x10] + // 44: f9002295 str x21, [x20, #0x40] + // 48: b9400008 ldr w8, [x0] + // 4c: 37f80088 tbnz w8, #0x1f, 0x5c + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000008 str w8, [x0] + // 58: 540000a0 b.eq 0x6c + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 6c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 70: 910003fd mov x29, sp + // 74: 94000000 bl 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: 14000000 b 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[136] = { + 0xe8, 0x03, 0x15, 0xaa, 0xa9, 0x8e, 0x5f, 0xf8, + 0x2a, 0x25, 0x40, 0x39, 0x2b, 0x00, 0x80, 0x52, + 0x6a, 0x21, 0xca, 0x9a, 0x29, 0x01, 0x0a, 0x8b, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x29, 0x31, 0x2a, 0x8b, 0x29, 0x15, 0x40, 0xf9, + 0x09, 0x02, 0x00, 0xb4, 0xa0, 0x82, 0x5f, 0xf8, + 0x2a, 0x01, 0x40, 0xb9, 0x6a, 0x00, 0xf8, 0x37, + 0x4a, 0x05, 0x00, 0x11, 0x2a, 0x01, 0x00, 0xb9, + 0x09, 0x01, 0x1f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x74, 0x0, state); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_NO_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: b9400008 ldr w8, [x0] + // 8: 37f80108 tbnz w8, #0x1f, 0x28 + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 540000a1 b.ne 0x28 + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: 910003fd mov x29, sp + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 90000008 adrp x8, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 30: b9400109 ldr w9, [x8] + // 34: 37f80069 tbnz w9, #0x1f, 0x40 + // 38: 11000529 add w9, w9, #0x1 + // 3c: b9000109 str w9, [x8] + // 40: f81f82a8 stur x8, [x21, #-0x8] + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[72] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x20, 0x0, state); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: b9400008 ldr w8, [x0] + // 8: 37f80108 tbnz w8, #0x1f, 0x28 + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 540000a1 b.ne 0x28 + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: 910003fd mov x29, sp + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 90000008 adrp x8, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 30: b9400109 ldr w9, [x8] + // 34: 37f80069 tbnz w9, #0x1f, 0x40 + // 38: 11000529 add w9, w9, #0x1 + // 3c: b9000109 str w9, [x8] + // 40: f81f82a8 stur x8, [x21, #-0x8] + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[72] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x20, 0x0, state); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_PROPERTY_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_PROPERTY_FRAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 9000000b adrp x11, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 4: f940016b ldr x11, [x11] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 8: f9401968 ldr x8, [x11, #0x30] + // c: b9403109 ldr w9, [x8, #0x30] + // 10: 528001aa mov w10, #0xd ; =13 + // 14: 0a0a0129 and w9, w9, w10 + // 18: 7100053f cmp w9, #0x1 + // 1c: 540005e1 b.ne 0xd8 + // 20: b9403d09 ldr w9, [x8, #0x3c] + // 24: 350005a9 cbnz w9, 0xd8 + // 28: b9403509 ldr w9, [x8, #0x34] + // 2c: 7100053f cmp w9, #0x1 + // 30: 54000541 b.ne 0xd8 + // 34: f9407ac9 ldr x9, [x22, #0xf0] + // 38: b4000509 cbz x9, 0xd8 + // 3c: b9804d0c ldrsw x12, [x8, #0x4c] + // 40: f9407eca ldr x10, [x22, #0xf8] + // 44: cb09014a sub x10, x10, x9 + // 48: eb8a0d9f cmp x12, x10, asr #3 + // 4c: 5400046a b.ge 0xd8 + // 50: f85f82aa ldur x10, [x21, #-0x8] + // 54: b940016d ldr w13, [x11] + // 58: 37f8006d tbnz w13, #0x1f, 0x64 + // 5c: 110005ad add w13, w13, #0x1 + // 60: b900016d str w13, [x11] + // 64: 8b0c0d2c add x12, x9, x12, lsl #3 + // 68: f9007acc str x12, [x22, #0xf0] + // 6c: a900ad34 stp x20, x11, [x9, #0x8] + // 70: b940010c ldr w12, [x8] + // 74: 37f8006c tbnz w12, #0x1f, 0x80 + // 78: 1100058c add w12, w12, #0x1 + // 7c: b900010c str w12, [x8] + // 80: f9000128 str x8, [x9] + // 84: 3dc00560 ldr q0, [x11, #0x10] + // 88: 3c818120 stur q0, [x9, #0x18] + // 8c: b980490b ldrsw x11, [x8, #0x48] + // 90: 8b0b0d2c add x12, x9, x11, lsl #3 + // 94: 9101418c add x12, x12, #0x50 + // 98: a902fd3f stp xzr, xzr, [x9, #0x28] + // 9c: 9103410d add x13, x8, #0xd0 + // a0: a903b12d stp x13, x12, [x9, #0x38] + // a4: b900493f str wzr, [x9, #0x48] + // a8: 7100097f cmp w11, #0x2 + // ac: 5400010b b.lt 0xcc + // b0: 9101612b add x11, x9, #0x58 + // b4: 5280002c mov w12, #0x1 ; =1 + // b8: f800857f str xzr, [x11], #0x8 + // bc: 9100058c add x12, x12, #0x1 + // c0: b980490d ldrsw x13, [x8, #0x48] + // c4: eb0d019f cmp x12, x13 + // c8: 54ffff8b b.lt 0xb8 + // cc: f900292a str x10, [x9, #0x50] + // d0: f81f82a9 stur x9, [x21, #-0x8] + // d4: 14000000 b 0xd4 + // 00000000000000d4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // d8: 14000000 b 0xd8 + // 00000000000000d8: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // dc: 00 00 00 00 + const unsigned char code_body[224] = { + 0x0b, 0x00, 0x00, 0x90, 0x6b, 0x01, 0x40, 0xf9, + 0x68, 0x19, 0x40, 0xf9, 0x09, 0x31, 0x40, 0xb9, + 0xaa, 0x01, 0x80, 0x52, 0x29, 0x01, 0x0a, 0x0a, + 0x3f, 0x05, 0x00, 0x71, 0xe1, 0x05, 0x00, 0x54, + 0x09, 0x3d, 0x40, 0xb9, 0xa9, 0x05, 0x00, 0x35, + 0x09, 0x35, 0x40, 0xb9, 0x3f, 0x05, 0x00, 0x71, + 0x41, 0x05, 0x00, 0x54, 0xc9, 0x7a, 0x40, 0xf9, + 0x09, 0x05, 0x00, 0xb4, 0x0c, 0x4d, 0x80, 0xb9, + 0xca, 0x7e, 0x40, 0xf9, 0x4a, 0x01, 0x09, 0xcb, + 0x9f, 0x0d, 0x8a, 0xeb, 0x6a, 0x04, 0x00, 0x54, + 0xaa, 0x82, 0x5f, 0xf8, 0x6d, 0x01, 0x40, 0xb9, + 0x6d, 0x00, 0xf8, 0x37, 0xad, 0x05, 0x00, 0x11, + 0x6d, 0x01, 0x00, 0xb9, 0x2c, 0x0d, 0x0c, 0x8b, + 0xcc, 0x7a, 0x00, 0xf9, 0x34, 0xad, 0x00, 0xa9, + 0x0c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x0c, 0x01, 0x00, 0xb9, + 0x28, 0x01, 0x00, 0xf9, 0x60, 0x05, 0xc0, 0x3d, + 0x20, 0x81, 0x81, 0x3c, 0x0b, 0x49, 0x80, 0xb9, + 0x2c, 0x0d, 0x0b, 0x8b, 0x8c, 0x41, 0x01, 0x91, + 0x3f, 0xfd, 0x02, 0xa9, 0x0d, 0x41, 0x03, 0x91, + 0x2d, 0xb1, 0x03, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0x7f, 0x09, 0x00, 0x71, 0x0b, 0x01, 0x00, 0x54, + 0x2b, 0x61, 0x01, 0x91, 0x2c, 0x00, 0x80, 0x52, + 0x7f, 0x85, 0x00, 0xf8, 0x8c, 0x05, 0x00, 0x91, + 0x0d, 0x49, 0x80, 0xb9, 0x9f, 0x01, 0x0d, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x2a, 0x29, 0x00, 0xf9, + 0xa9, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xd4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xd8, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_SLOT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000008 adrp x8, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: 92403d08 and x8, x8, #0xffff + // 10: f8686813 ldr x19, [x0, x8] + // 14: b4000193 cbz x19, 0x44 + // 18: b9400268 ldr w8, [x19] + // 1c: 37f80068 tbnz w8, #0x1f, 0x28 + // 20: 11000508 add w8, w8, #0x1 + // 24: b9000268 str w8, [x19] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 54000080 b.eq 0x48 + // 3c: f81f82b3 stur x19, [x21, #-0x8] + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 48: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4c: 910003fd mov x29, sp + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: f81f82b3 stur x19, [x21, #-0x8] + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[96] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x3d, 0x40, 0x92, + 0x13, 0x68, 0x68, 0xf8, 0x93, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x68, 0x02, 0x00, 0xb9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0xb3, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x50, 0x0, state); + patch_aarch64_26r(code + 0x5c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_WITH_HINT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f3 mov x19, x21 + // 4: f85f8ea9 ldr x9, [x21, #-0x8]! + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 10: 92403d08 and x8, x8, #0xffff + // 14: f9401129 ldr x9, [x9, #0x20] + // 18: f9400d2a ldr x10, [x9, #0x18] + // 1c: eb08015f cmp x10, x8 + // 20: 54000269 b.ls 0x6c + // 24: 3940292a ldrb w10, [x9, #0xa] + // 28: 7100055f cmp w10, #0x1 + // 2c: 54000201 b.ne 0x6c + // 30: f940028a ldr x10, [x20] + // 34: 9000000b adrp x11, 0x0 + // 0000000000000034: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 38: f940016b ldr x11, [x11] + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 3c: f940114a ldr x10, [x10, #0x20] + // 40: 53013d6b ubfx w11, w11, #1, #15 + // 44: 8b2b4d4a add x10, x10, w11, uxtw #3 + // 48: f9400d4a ldr x10, [x10, #0x18] + // 4c: 3940252b ldrb w11, [x9, #0x9] + // 50: 5280002c mov w12, #0x1 ; =1 + // 54: 9acb218b lsl x11, x12, x11 + // 58: 8b0b0129 add x9, x9, x11 + // 5c: 8b081128 add x8, x9, x8, lsl #4 + // 60: f8420d09 ldr x9, [x8, #0x20]! + // 64: eb0a013f cmp x9, x10 + // 68: 54000040 b.eq 0x70 + // 6c: 14000000 b 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 70: f9400517 ldr x23, [x8, #0x8] + // 74: b4ffffd7 cbz x23, 0x6c + // 78: f85f82a0 ldur x0, [x21, #-0x8] + // 7c: b94002e8 ldr w8, [x23] + // 80: 37f80068 tbnz w8, #0x1f, 0x8c + // 84: 11000508 add w8, w8, #0x1 + // 88: b90002e8 str w8, [x23] + // 8c: b9400008 ldr w8, [x0] + // 90: 37f80108 tbnz w8, #0x1f, 0xb0 + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000008 str w8, [x0] + // 9c: 540000a1 b.ne 0xb0 + // a0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // a4: 910003fd mov x29, sp + // a8: 94000000 bl 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // ac: a8c17bfd ldp x29, x30, [sp], #0x10 + // b0: f81f0277 stur x23, [x19, #-0x10] + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[184] = { + 0xf3, 0x03, 0x15, 0xaa, 0xa9, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x29, 0x11, 0x40, 0xf9, + 0x2a, 0x0d, 0x40, 0xf9, 0x5f, 0x01, 0x08, 0xeb, + 0x69, 0x02, 0x00, 0x54, 0x2a, 0x29, 0x40, 0x39, + 0x5f, 0x05, 0x00, 0x71, 0x01, 0x02, 0x00, 0x54, + 0x8a, 0x02, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x4a, 0x11, 0x40, 0xf9, + 0x6b, 0x3d, 0x01, 0x53, 0x4a, 0x4d, 0x2b, 0x8b, + 0x4a, 0x0d, 0x40, 0xf9, 0x2b, 0x25, 0x40, 0x39, + 0x2c, 0x00, 0x80, 0x52, 0x8b, 0x21, 0xcb, 0x9a, + 0x29, 0x01, 0x0b, 0x8b, 0x28, 0x11, 0x08, 0x8b, + 0x09, 0x0d, 0x42, 0xf8, 0x3f, 0x01, 0x0a, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x17, 0x05, 0x40, 0xf9, 0xd7, 0xff, 0xff, 0xb4, + 0xa0, 0x82, 0x5f, 0xf8, 0xe8, 0x02, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0xe8, 0x02, 0x00, 0xb9, 0x08, 0x00, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x77, 0x02, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data); + patch_aarch64_26r(code + 0x6c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0xa8, 0x0, state); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_BUILD_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_BUILD_CLASS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f9002295 str x21, [x20, #0x40] + // 10: f9401280 ldr x0, [x20, #0x20] + // 14: 90000008 adrp x8, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 1c: 5291f609 mov w9, #0x8fb0 ; =36784 + // 20: 8b090101 add x1, x8, x9 + // 24: 910023e2 add x2, sp, #0x8 + // 28: 94000000 bl 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 _PyMapping_GetOptionalItem + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: 37f80220 tbnz w0, #0x1f, 0x78 + // 38: f94007e8 ldr x8, [sp, #0x8] + // 3c: b40000a8 cbz x8, 0x50 + // 40: f80086a8 str x8, [x21], #0x8 + // 44: a9417bfd ldp x29, x30, [sp, #0x10] + // 48: 910083ff add sp, sp, #0x20 + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 50: f9002295 str x21, [x20, #0x40] + // 54: 90000008 adrp x8, 0x0 + // 0000000000000054: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_NameError + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_NameError + // 5c: f9400101 ldr x1, [x8] + // 60: 90000002 adrp x2, 0x0 + // 0000000000000060: ARM64_RELOC_PAGE21 l_.str + // 64: 91000042 add x2, x2, #0x0 + // 0000000000000064: ARM64_RELOC_PAGEOFF12 l_.str + // 68: aa1603e0 mov x0, x22 + // 6c: 94000000 bl 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __PyErr_SetString + // 70: f9402295 ldr x21, [x20, #0x40] + // 74: f900229f str xzr, [x20, #0x40] + // 78: a9417bfd ldp x29, x30, [sp, #0x10] + // 7c: 910083ff add sp, sp, #0x20 + // 80: 14000000 b 0x80 + // 0000000000000080: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 84: 00 00 00 00 + const unsigned char code_body[136] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x80, 0x12, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0xf6, 0x91, 0x52, + 0x01, 0x01, 0x09, 0x8b, 0xe2, 0x23, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x02, 0xf8, 0x37, + 0xe8, 0x07, 0x40, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0xa8, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '__build_class__ not found\x00' + // 1a: 00 00 00 00 00 00 + // 20: &PyExc_NameError+0x0 + // 28: &_PyRuntime+0x0 + const unsigned char data_body[48] = { + 0x5f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x5f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x28, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data + 0x28); + patch_aarch64_trampoline(code + 0x28, 0x47, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x54, (uintptr_t)data + 0x20); + patch_aarch64_21r(code + 0x60, (uintptr_t)data); + patch_aarch64_12(code + 0x64, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x6c, 0x3f, state); + patch_aarch64_26r(code + 0x80, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_COMMON_CONSTANT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_COMMON_CONSTANT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_AssertionError + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_AssertionError + // 10: 9000000a adrp x10, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_NotImplementedError + // 14: f940014a ldr x10, [x10] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_NotImplementedError + // 18: 72003d1f tst w8, #0xffff + // 1c: 9a8a0128 csel x8, x9, x10, eq + // 20: f9400108 ldr x8, [x8] + // 24: f80086a8 str x8, [x21], #0x8 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x28, 0x01, 0x8a, 0x9a, + 0x08, 0x01, 0x40, 0xf9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyExc_NotImplementedError+0x0 + // 8: &PyExc_AssertionError+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyExc_NotImplementedError); + patch_64(data + 0x8, (uintptr_t)&PyExc_AssertionError); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_IMMORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_IMMORTAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400288 ldr x8, [x20] + // 4: f9400d08 ldr x8, [x8, #0x18] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 8b292d08 add x8, x8, w9, uxth #3 + // 14: f9400d08 ldr x8, [x8, #0x18] + // 18: f80086a8 str x8, [x21], #0x8 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x08, 0x0d, 0x40, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 8: b9400109 ldr w9, [x8] + // c: 37f80069 tbnz w9, #0x1f, 0x18 + // 10: 11000529 add w9, w9, #0x1 + // 14: b9000109 str w9, [x8] + // 18: f80086a8 str x8, [x21], #0x8 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE_BORROW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 8: f80086a8 str x8, [x21], #0x8 + // c: 14000000 b 0xc + // 000000000000000c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[16] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_MORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_MORTAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400288 ldr x8, [x20] + // 4: f9400d08 ldr x8, [x8, #0x18] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 8b292d08 add x8, x8, w9, uxth #3 + // 14: f9400d08 ldr x8, [x8, #0x18] + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x08, 0x0d, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_DEREF.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 8b282e88 add x8, x20, w8, uxth #3 + // c: f9402908 ldr x8, [x8, #0x50] + // 10: f9400908 ldr x8, [x8, #0x10] + // 14: b40000e8 cbz x8, 0x30 + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 910003fd mov x29, sp + // 38: 90000008 adrp x8, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 40: f9002295 str x21, [x20, #0x40] + // 44: f9400281 ldr x1, [x20] + // 48: 12003d02 and w2, w8, #0xffff + // 4c: aa1603e0 mov x0, x22 + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __PyEval_FormatExcUnbound + // 54: f9402295 ldr x21, [x20, #0x40] + // 58: f900229f str xzr, [x20, #0x40] + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x08, 0x09, 0x40, 0xf9, 0xe8, 0x00, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x81, 0x02, 0x40, 0xf9, + 0x02, 0x3d, 0x00, 0x12, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x50, 0x2c, state); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 8b282e88 add x8, x20, w8, uxth #3 + // c: f9402908 ldr x8, [x8, #0x50] + // 10: b9400109 ldr w9, [x8] + // 14: 37f80069 tbnz w9, #0x1f, 0x20 + // 18: 11000529 add w9, w9, #0x1 + // 1c: b9000109 str w9, [x8] + // 20: f80086a8 str x8, [x21], #0x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_0.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9402a88 ldr x8, [x20, #0x50] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x2a, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9402e88 ldr x8, [x20, #0x58] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x2e, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_2.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9403288 ldr x8, [x20, #0x60] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x32, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_3.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9403688 ldr x8, [x20, #0x68] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x36, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_4.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9403a88 ldr x8, [x20, #0x70] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x3a, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_5.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9403e88 ldr x8, [x20, #0x78] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x3e, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_6.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9404288 ldr x8, [x20, #0x80] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x42, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_7.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9404688 ldr x8, [x20, #0x88] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x88, 0x46, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_AND_CLEAR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_AND_CLEAR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 8b282e88 add x8, x20, w8, uxth #3 + // c: f9402909 ldr x9, [x8, #0x50] + // 10: f900291f str xzr, [x8, #0x50] + // 14: f80086a9 str x9, [x21], #0x8 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x09, 0x29, 0x40, 0xf9, + 0x1f, 0x29, 0x00, 0xf9, 0xa9, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_CHECK.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 8b282e89 add x9, x20, w8, uxth #3 + // c: f9402929 ldr x9, [x9, #0x50] + // 10: b40000e9 cbz x9, 0x2c + // 14: b9400128 ldr w8, [x9] + // 18: 37f80068 tbnz w8, #0x1f, 0x24 + // 1c: 11000508 add w8, w8, #0x1 + // 20: b9000128 str w8, [x9] + // 24: f80086a9 str x9, [x21], #0x8 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 30: 910003fd mov x29, sp + // 34: f9002295 str x21, [x20, #0x40] + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_UnboundLocalError + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_UnboundLocalError + // 40: f9400133 ldr x19, [x9] + // 44: f9400289 ldr x9, [x20] + // 48: f9403120 ldr x0, [x9, #0x60] + // 4c: 92403d01 and x1, x8, #0xffff + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 _PyTuple_GetItem + // 54: aa0003e3 mov x3, x0 + // 58: 90000002 adrp x2, 0x0 + // 0000000000000058: ARM64_RELOC_PAGE21 l_.str + // 5c: 91000042 add x2, x2, #0x0 + // 000000000000005c: ARM64_RELOC_PAGEOFF12 l_.str + // 60: aa1603e0 mov x0, x22 + // 64: aa1303e1 mov x1, x19 + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __PyEval_FormatExcCheckArg + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x89, 0x2e, 0x28, 0x8b, 0x29, 0x29, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x28, 0x01, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x28, 0x01, 0x00, 0xb9, 0xa9, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x33, 0x01, 0x40, 0xf9, 0x89, 0x02, 0x40, 0xf9, + 0x20, 0x31, 0x40, 0xf9, 0x01, 0x3d, 0x40, 0x92, + 0x00, 0x00, 0x00, 0x94, 0xe3, 0x03, 0x00, 0xaa, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: &PyExc_UnboundLocalError+0x0 + // 58: OPARG + const unsigned char data_body[96] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x58, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x58); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x50); + patch_aarch64_trampoline(code + 0x50, 0x2e, state); + patch_aarch64_21r(code + 0x58, (uintptr_t)data); + patch_aarch64_12(code + 0x5c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x68, 0x2d, state); + patch_aarch64_26r(code + 0x78, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_FROM_DICT_OR_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FROM_DICT_OR_DEREF.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f85f82b3 ldur x19, [x21, #-0x8] + // 10: f9400288 ldr x8, [x20] + // 14: f9403108 ldr x8, [x8, #0x60] + // 18: 90000017 adrp x23, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 1c: f94002f7 ldr x23, [x23] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 20: 8b372d08 add x8, x8, w23, uxth #3 + // 24: f9400d01 ldr x1, [x8, #0x18] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 910023e2 add x2, sp, #0x8 + // 30: aa1303e0 mov x0, x19 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 _PyMapping_GetOptionalItem + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: 37f80620 tbnz w0, #0x1f, 0x104 + // 44: f94007e8 ldr x8, [sp, #0x8] + // 48: b4000168 cbz x8, 0x74 + // 4c: d10022a9 sub x9, x21, #0x8 + // 50: f9002289 str x9, [x20, #0x40] + // 54: b9400269 ldr w9, [x19] + // 58: 36f802a9 tbz w9, #0x1f, 0xac + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: f80086a8 str x8, [x21], #0x8 + // 68: a9417bfd ldp x29, x30, [sp, #0x10] + // 6c: 910083ff add sp, sp, #0x20 + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: 92403ee8 and x8, x23, #0xffff + // 78: 8b080e88 add x8, x20, x8, lsl #3 + // 7c: f9402908 ldr x8, [x8, #0x50] + // 80: f9400908 ldr x8, [x8, #0x10] + // 84: b40002c8 cbz x8, 0xdc + // 88: b9400109 ldr w9, [x8] + // 8c: 37f80069 tbnz w9, #0x1f, 0x98 + // 90: 11000529 add w9, w9, #0x1 + // 94: b9000109 str w9, [x8] + // 98: f90007e8 str x8, [sp, #0x8] + // 9c: d10022a9 sub x9, x21, #0x8 + // a0: f9002289 str x9, [x20, #0x40] + // a4: b9400269 ldr w9, [x19] + // a8: 37fffda9 tbnz w9, #0x1f, 0x5c + // ac: 71000529 subs w9, w9, #0x1 + // b0: b9000269 str w9, [x19] + // b4: 54fffd41 b.ne 0x5c + // b8: aa1303e0 mov x0, x19 + // bc: 94000000 bl 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c0: f94007e8 ldr x8, [sp, #0x8] + // c4: f9402295 ldr x21, [x20, #0x40] + // c8: f900229f str xzr, [x20, #0x40] + // cc: f80086a8 str x8, [x21], #0x8 + // d0: a9417bfd ldp x29, x30, [sp, #0x10] + // d4: 910083ff add sp, sp, #0x20 + // d8: 14000000 b 0xd8 + // 00000000000000d8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // dc: f90007ff str xzr, [sp, #0x8] + // e0: 90000008 adrp x8, 0x0 + // 00000000000000e0: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // e4: f9400108 ldr x8, [x8] + // 00000000000000e4: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // e8: f9002295 str x21, [x20, #0x40] + // ec: f9400281 ldr x1, [x20] + // f0: 12003d02 and w2, w8, #0xffff + // f4: aa1603e0 mov x0, x22 + // f8: 94000000 bl 0xf8 + // 00000000000000f8: ARM64_RELOC_BRANCH26 __PyEval_FormatExcUnbound + // fc: f9402295 ldr x21, [x20, #0x40] + // 100: f900229f str xzr, [x20, #0x40] + // 104: a9417bfd ldp x29, x30, [sp, #0x10] + // 108: 910083ff add sp, sp, #0x20 + // 10c: 14000000 b 0x10c + // 000000000000010c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[272] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xb3, 0x82, 0x5f, 0xf8, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x31, 0x40, 0xf9, + 0x17, 0x00, 0x00, 0x90, 0xf7, 0x02, 0x40, 0xf9, + 0x08, 0x2d, 0x37, 0x8b, 0x01, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe2, 0x23, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x20, 0x06, 0xf8, 0x37, 0xe8, 0x07, 0x40, 0xf9, + 0x68, 0x01, 0x00, 0xb4, 0xa9, 0x22, 0x00, 0xd1, + 0x89, 0x22, 0x00, 0xf9, 0x69, 0x02, 0x40, 0xb9, + 0xa9, 0x02, 0xf8, 0x36, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa8, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xe8, 0x3e, 0x40, 0x92, + 0x88, 0x0e, 0x08, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x08, 0x09, 0x40, 0xf9, 0xc8, 0x02, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xe8, 0x07, 0x00, 0xf9, 0xa9, 0x22, 0x00, 0xd1, + 0x89, 0x22, 0x00, 0xf9, 0x69, 0x02, 0x40, 0xb9, + 0xa9, 0xfd, 0xff, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x69, 0x02, 0x00, 0xb9, 0x41, 0xfd, 0xff, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x07, 0x40, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa8, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xff, 0x07, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x81, 0x02, 0x40, 0xf9, + 0x02, 0x3d, 0x00, 0x12, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x34, 0x47, state); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xbc, 0x0, state); + patch_aarch64_26r(code + 0xd8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0xe0, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xf8, 0x2c, state); + patch_aarch64_26r(code + 0x10c, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: aa1503f3 mov x19, x21 + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 53013d29 ubfx w9, w9, #1, #15 + // 20: 8b294d08 add x8, x8, w9, uxtw #3 + // 24: f9400d02 ldr x2, [x8, #0x18] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: a9418680 ldp x0, x1, [x20, #0x18] + // 30: aa1503e3 mov x3, x21 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __PyEval_LoadGlobalStackRef + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: f9400268 ldr x8, [x19] + // 44: b4000088 cbz x8, 0x54 + // 48: 910022b5 add x21, x21, #0x8 + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: 14000000 b 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 5c: 00 00 00 00 + const unsigned char code_body[96] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x03, 0x15, 0xaa, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x29, 0x3d, 0x01, 0x53, + 0x08, 0x4d, 0x29, 0x8b, 0x02, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x80, 0x86, 0x41, 0xa9, + 0xe3, 0x03, 0x15, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xf9, 0x88, 0x00, 0x00, 0xb4, + 0xb5, 0x22, 0x00, 0x91, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x34, 0x48, state); + patch_aarch64_26r(code + 0x50, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x58, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_GLOBAL_BUILTINS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9401288 ldr x8, [x20, #0x20] + // 4: f9401108 ldr x8, [x8, #0x20] + // 8: 39402509 ldrb w9, [x8, #0x9] + // c: 5280002a mov w10, #0x1 ; =1 + // 10: 9ac92149 lsl x9, x10, x9 + // 14: 8b090108 add x8, x8, x9 + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 20: 8b293108 add x8, x8, w9, uxth #4 + // 24: f9401508 ldr x8, [x8, #0x28] + // 28: b40000e8 cbz x8, 0x44 + // 2c: b9400109 ldr w9, [x8] + // 30: 37f80069 tbnz w9, #0x1f, 0x3c + // 34: 11000529 add w9, w9, #0x1 + // 38: b9000109 str w9, [x8] + // 3c: f80086a8 str x8, [x21], #0x8 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0x88, 0x12, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x25, 0x40, 0x39, 0x2a, 0x00, 0x80, 0x52, + 0x49, 0x21, 0xc9, 0x9a, 0x08, 0x01, 0x09, 0x8b, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x31, 0x29, 0x8b, 0x08, 0x15, 0x40, 0xf9, + 0xe8, 0x00, 0x00, 0xb4, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS_FROM_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8d09 ldr x9, [x8, #-0x8]! + // 8: 3940252a ldrb w10, [x9, #0x9] + // c: 5280002b mov w11, #0x1 ; =1 + // 10: 9aca216a lsl x10, x11, x10 + // 14: 8b0a0129 add x9, x9, x10 + // 18: 9000000a adrp x10, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 20: 8b2a3129 add x9, x9, w10, uxth #4 + // 24: f9401529 ldr x9, [x9, #0x28] + // 28: b40000e9 cbz x9, 0x44 + // 2c: b9400128 ldr w8, [x9] + // 30: 37f80068 tbnz w8, #0x1f, 0x3c + // 34: 11000508 add w8, w8, #0x1 + // 38: b9000128 str w8, [x9] + // 3c: f81f82a9 stur x9, [x21, #-0x8] + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: aa0803f5 mov x21, x8 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xe8, 0x03, 0x15, 0xaa, 0x09, 0x8d, 0x5f, 0xf8, + 0x2a, 0x25, 0x40, 0x39, 0x2b, 0x00, 0x80, 0x52, + 0x6a, 0x21, 0xca, 0x9a, 0x29, 0x01, 0x0a, 0x8b, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x29, 0x31, 0x2a, 0x8b, 0x29, 0x15, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x28, 0x01, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x28, 0x01, 0x00, 0xb9, 0xa9, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_GLOBAL_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400e88 ldr x8, [x20, #0x18] + // 4: f9401108 ldr x8, [x8, #0x20] + // 8: 39402509 ldrb w9, [x8, #0x9] + // c: 5280002a mov w10, #0x1 ; =1 + // 10: 9ac92149 lsl x9, x10, x9 + // 14: 8b090108 add x8, x8, x9 + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 20: 8b293108 add x8, x8, w9, uxth #4 + // 24: f9401508 ldr x8, [x8, #0x28] + // 28: b40000e8 cbz x8, 0x44 + // 2c: b9400109 ldr w9, [x8] + // 30: 37f80069 tbnz w9, #0x1f, 0x3c + // 34: 11000529 add w9, w9, #0x1 + // 38: b9000109 str w9, [x8] + // 3c: f80086a8 str x8, [x21], #0x8 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0x88, 0x0e, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x25, 0x40, 0x39, 0x2a, 0x00, 0x80, 0x52, + 0x49, 0x21, 0xc9, 0x9a, 0x08, 0x01, 0x09, 0x8b, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x31, 0x29, 0x8b, 0x08, 0x15, 0x40, 0xf9, + 0xe8, 0x00, 0x00, 0xb4, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_GLOBAL_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE_FROM_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8d09 ldr x9, [x8, #-0x8]! + // 8: 3940252a ldrb w10, [x9, #0x9] + // c: 5280002b mov w11, #0x1 ; =1 + // 10: 9aca216a lsl x10, x11, x10 + // 14: 8b0a0129 add x9, x9, x10 + // 18: 9000000a adrp x10, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 20: 8b2a3129 add x9, x9, w10, uxth #4 + // 24: f9401529 ldr x9, [x9, #0x28] + // 28: b40000e9 cbz x9, 0x44 + // 2c: b9400128 ldr w8, [x9] + // 30: 37f80068 tbnz w8, #0x1f, 0x3c + // 34: 11000508 add w8, w8, #0x1 + // 38: b9000128 str w8, [x9] + // 3c: f81f82a9 stur x9, [x21, #-0x8] + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: aa0803f5 mov x21, x8 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xe8, 0x03, 0x15, 0xaa, 0x09, 0x8d, 0x5f, 0xf8, + 0x2a, 0x25, 0x40, 0x39, 0x2b, 0x00, 0x80, 0x52, + 0x6a, 0x21, 0xca, 0x9a, 0x29, 0x01, 0x0a, 0x8b, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x29, 0x31, 0x2a, 0x8b, 0x29, 0x15, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x28, 0x01, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x28, 0x01, 0x00, 0xb9, 0xa9, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_LOCALS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_LOCALS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9401688 ldr x8, [x20, #0x28] + // 4: b40000e8 cbz x8, 0x20 + // 8: b9400109 ldr w9, [x8] + // c: 37f80069 tbnz w9, #0x1f, 0x18 + // 10: 11000529 add w9, w9, #0x1 + // 14: b9000109 str w9, [x8] + // 18: f80086a8 str x8, [x21], #0x8 + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 20: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 24: 910003fd mov x29, sp + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_SystemError + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_SystemError + // 34: f9400101 ldr x1, [x8] + // 38: 90000002 adrp x2, 0x0 + // 0000000000000038: ARM64_RELOC_PAGE21 l_.str + // 3c: 91000042 add x2, x2, #0x0 + // 000000000000003c: ARM64_RELOC_PAGEOFF12 l_.str + // 40: aa1603e0 mov x0, x22 + // 44: 94000000 bl 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __PyErr_SetString + // 48: f9402295 ldr x21, [x20, #0x40] + // 4c: f900229f str xzr, [x20, #0x40] + // 50: a8c17bfd ldp x29, x30, [sp], #0x10 + // 54: 14000000 b 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[88] = { + 0x88, 0x16, 0x40, 0xf9, 0xe8, 0x00, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: 'no locals found\x00' + // 10: &PyExc_SystemError+0x0 + const unsigned char data_body[24] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x10, (uintptr_t)&PyExc_SystemError); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x10); + patch_aarch64_21r(code + 0x38, (uintptr_t)data); + patch_aarch64_12(code + 0x3c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x44, 0x3f, state); + patch_aarch64_26r(code + 0x54, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_NAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f9400288 ldr x8, [x20] + // c: f9401108 ldr x8, [x8, #0x20] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 18: 8b292d08 add x8, x8, w9, uxth #3 + // 1c: f9400d02 ldr x2, [x8, #0x18] + // 20: f9002295 str x21, [x20, #0x40] + // 24: aa1603e0 mov x0, x22 + // 28: aa1403e1 mov x1, x20 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __PyEval_LoadName + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: b4000080 cbz x0, 0x48 + // 3c: f80086a0 str x0, [x21], #0x8 + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[80] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x02, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x2c, 0x49, state); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x4c, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_SMALL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 92403d08 and x8, x8, #0xffff + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 14: 8b081528 add x8, x9, x8, lsl #5 + // 18: 52869509 mov w9, #0x34a8 ; =13480 + // 1c: 8b090108 add x8, x8, x9 + // 20: f80086a8 str x8, [x21], #0x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x15, 0x08, 0x8b, + 0x09, 0x95, 0x86, 0x52, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_0.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8: 52869509 mov w9, #0x34a8 ; =13480 + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x95, 0x86, 0x52, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8: 52869909 mov w9, #0x34c8 ; =13512 + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x99, 0x86, 0x52, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_2.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8: 52869d09 mov w9, #0x34e8 ; =13544 + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x9d, 0x86, 0x52, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_3.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 8: 5286a109 mov w9, #0x3508 ; =13576 + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0xa1, 0x86, 0x52, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SPECIAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SPECIAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f85f8eb3 ldr x19, [x21, #-0x8]! + // 10: 90000008 adrp x8, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_SpecialMethods + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_SpecialMethods + // 20: 8b283137 add x23, x9, w8, uxth #4 + // 24: f94002e1 ldr x1, [x23] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 910023e2 add x2, sp, #0x8 + // 30: aa1303e0 mov x0, x19 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __PyObject_LookupSpecialMethod + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b40000c0 cbz x0, 0x58 + // 44: f94007e8 ldr x8, [sp, #0x8] + // 48: a88122a0 stp x0, x8, [x21], #0x10 + // 4c: a9417bfd ldp x29, x30, [sp, #0x10] + // 50: 910083ff add sp, sp, #0x20 + // 54: 14000000 b 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 58: f9403ac8 ldr x8, [x22, #0x70] + // 5c: b40000c8 cbz x8, 0x74 + // 60: f9400508 ldr x8, [x8, #0x8] + // 64: b4000088 cbz x8, 0x74 + // 68: a9417bfd ldp x29, x30, [sp, #0x10] + // 6c: 910083ff add sp, sp, #0x20 + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 74: f9002295 str x21, [x20, #0x40] + // 78: 90000008 adrp x8, 0x0 + // 0000000000000078: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_TypeError + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_TypeError + // 80: f9400101 ldr x1, [x8] + // 84: f94006e2 ldr x2, [x23, #0x8] + // 88: f9400668 ldr x8, [x19, #0x8] + // 8c: f9400d08 ldr x8, [x8, #0x18] + // 90: f90003e8 str x8, [sp] + // 94: aa1603e0 mov x0, x22 + // 98: 94000000 bl 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __PyErr_Format + // 9c: f9402295 ldr x21, [x20, #0x40] + // a0: f900229f str xzr, [x20, #0x40] + // a4: a9417bfd ldp x29, x30, [sp, #0x10] + // a8: 910083ff add sp, sp, #0x20 + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[176] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xb3, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x37, 0x31, 0x28, 0x8b, 0xe1, 0x02, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe2, 0x23, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0xe8, 0x07, 0x40, 0xf9, + 0xa0, 0x22, 0x81, 0xa8, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xc8, 0x3a, 0x40, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x08, 0x05, 0x40, 0xf9, 0x88, 0x00, 0x00, 0xb4, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x40, 0xf9, 0xe2, 0x06, 0x40, 0xf9, + 0x68, 0x06, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0xe8, 0x03, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyExc_TypeError+0x0 + // 8: &_Py_SpecialMethods+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x8, (uintptr_t)&_Py_SpecialMethods); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x34, 0x4a, state); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x70, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0x78, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x98, 0x30, state); + patch_aarch64_26r(code + 0xac, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_SUPER_ATTR_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_ATTR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85e82a8 ldur x8, [x21, #-0x18] + // c: 90000019 adrp x25, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PySuper_Type + // 10: f9400339 ldr x25, [x25] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PySuper_Type + // 14: eb19011f cmp x8, x25 + // 18: 540000a1 b.ne 0x2c + // 1c: f85f02b8 ldur x24, [x21, #-0x10] + // 20: f9400708 ldr x8, [x24, #0x8] + // 24: 3942ad08 ldrb w8, [x8, #0xab] + // 28: 37380068 tbnz w8, #0x7, 0x34 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 34: f85f82b3 ldur x19, [x21, #-0x8] + // 38: f9400288 ldr x8, [x20] + // 3c: f9401108 ldr x8, [x8, #0x20] + // 40: 90000009 adrp x9, 0x0 + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 48: 53023d29 ubfx w9, w9, #2, #14 + // 4c: 8b294d08 add x8, x8, w9, uxtw #3 + // 50: f9400d02 ldr x2, [x8, #0x18] + // 54: f9002295 str x21, [x20, #0x40] + // 58: aa1803e0 mov x0, x24 + // 5c: aa1303e1 mov x1, x19 + // 60: d2800003 mov x3, #0x0 ; =0 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __PySuper_Lookup + // 68: aa0003f7 mov x23, x0 + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: b9400328 ldr w8, [x25] + // 78: 37f800e8 tbnz w8, #0x1f, 0x94 + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000328 str w8, [x25] + // 84: 54000081 b.ne 0x94 + // 88: 90000000 adrp x0, 0x0 + // 0000000000000088: ARM64_RELOC_GOT_LOAD_PAGE21 _PySuper_Type + // 8c: f9400000 ldr x0, [x0] + // 000000000000008c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PySuper_Type + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: b9400308 ldr w8, [x24] + // 98: 37f800c8 tbnz w8, #0x1f, 0xb0 + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000308 str w8, [x24] + // a4: 54000061 b.ne 0xb0 + // a8: aa1803e0 mov x0, x24 + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b0: b9400268 ldr w8, [x19] + // b4: 37f800c8 tbnz w8, #0x1f, 0xcc + // b8: 71000508 subs w8, w8, #0x1 + // bc: b9000268 str w8, [x19] + // c0: 54000061 b.ne 0xcc + // c4: aa1303e0 mov x0, x19 + // c8: 94000000 bl 0xc8 + // 00000000000000c8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // cc: b40000b7 cbz x23, 0xe0 + // d0: f81e82b7 stur x23, [x21, #-0x18] + // d4: d10042b5 sub x21, x21, #0x10 + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // e0: d10062b5 sub x21, x21, #0x18 + // e4: a8c17bfd ldp x29, x30, [sp], #0x10 + // e8: 14000000 b 0xe8 + // 00000000000000e8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // ec: 00 00 00 00 + const unsigned char code_body[240] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa8, 0x82, 0x5e, 0xf8, 0x19, 0x00, 0x00, 0x90, + 0x39, 0x03, 0x40, 0xf9, 0x1f, 0x01, 0x19, 0xeb, + 0xa1, 0x00, 0x00, 0x54, 0xb8, 0x02, 0x5f, 0xf8, + 0x08, 0x07, 0x40, 0xf9, 0x08, 0xad, 0x42, 0x39, + 0x68, 0x00, 0x38, 0x37, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x82, 0x5f, 0xf8, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x29, 0x3d, 0x02, 0x53, 0x08, 0x4d, 0x29, 0x8b, + 0x02, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x03, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x28, 0x03, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x40, 0xf9, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x03, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xb7, 0x00, 0x00, 0xb4, + 0xb7, 0x82, 0x1e, 0xf8, 0xb5, 0x42, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xb5, 0x62, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x64, 0x4b, state); + patch_aarch64_33rx(code + 0x88, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_trampoline(code + 0xac, 0x0, state); + patch_aarch64_trampoline(code + 0xc8, 0x0, state); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xe8, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_SUPER_ATTR_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_METHOD.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f85e82a8 ldur x8, [x21, #-0x18] + // 10: 90000018 adrp x24, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PySuper_Type + // 14: f9400318 ldr x24, [x24] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PySuper_Type + // 18: eb18011f cmp x8, x24 + // 1c: 540000a1 b.ne 0x30 + // 20: f85f02b3 ldur x19, [x21, #-0x10] + // 24: f9400668 ldr x8, [x19, #0x8] + // 28: 3942ad08 ldrb w8, [x8, #0xab] + // 2c: 37380088 tbnz w8, #0x7, 0x3c + // 30: a9417bfd ldp x29, x30, [sp, #0x10] + // 34: 910083ff add sp, sp, #0x20 + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 3c: f85f82b7 ldur x23, [x21, #-0x8] + // 40: f9400288 ldr x8, [x20] + // 44: f9401108 ldr x8, [x8, #0x20] + // 48: 90000009 adrp x9, 0x0 + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4c: f9400129 ldr x9, [x9] + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 50: 53023d29 ubfx w9, w9, #2, #14 + // 54: 8b294d08 add x8, x8, w9, uxtw #3 + // 58: f9400d02 ldr x2, [x8, #0x18] + // 5c: b81fc3bf stur wzr, [x29, #-0x4] + // 60: f9002295 str x21, [x20, #0x40] + // 64: f94006e8 ldr x8, [x23, #0x8] + // 68: f9404908 ldr x8, [x8, #0x90] + // 6c: 90000009 adrp x9, 0x0 + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyObject_GenericGetAttr + // 70: f9400129 ldr x9, [x9] + // 0000000000000070: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyObject_GenericGetAttr + // 74: d10013aa sub x10, x29, #0x4 + // 78: eb09011f cmp x8, x9 + // 7c: 9a9f0143 csel x3, x10, xzr, eq + // 80: aa1303e0 mov x0, x19 + // 84: aa1703e1 mov x1, x23 + // 88: 94000000 bl 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __PySuper_Lookup + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: b4000560 cbz x0, 0x140 + // 98: b85fc3a8 ldur w8, [x29, #-0x4] + // 9c: 35000208 cbnz w8, 0xdc + // a0: d10022a8 sub x8, x21, #0x8 + // a4: f9002288 str x8, [x20, #0x40] + // a8: b94002e8 ldr w8, [x23] + // ac: 37f80108 tbnz w8, #0x1f, 0xcc + // b0: 71000508 subs w8, w8, #0x1 + // b4: b90002e8 str w8, [x23] + // b8: 540000a1 b.ne 0xcc + // bc: aa0003f5 mov x21, x0 + // c0: aa1703e0 mov x0, x23 + // c4: 94000000 bl 0xc4 + // 00000000000000c4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c8: aa1503e0 mov x0, x21 + // cc: d2800017 mov x23, #0x0 ; =0 + // d0: f9402288 ldr x8, [x20, #0x40] + // d4: f900229f str xzr, [x20, #0x40] + // d8: 91002115 add x21, x8, #0x8 + // dc: b9400308 ldr w8, [x24] + // e0: 37f80148 tbnz w8, #0x1f, 0x108 + // e4: 71000508 subs w8, w8, #0x1 + // e8: b9000308 str w8, [x24] + // ec: 540000e1 b.ne 0x108 + // f0: 90000008 adrp x8, 0x0 + // 00000000000000f0: ARM64_RELOC_GOT_LOAD_PAGE21 _PySuper_Type + // f4: f9400108 ldr x8, [x8] + // 00000000000000f4: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PySuper_Type + // f8: aa0003f8 mov x24, x0 + // fc: aa0803e0 mov x0, x8 + // 100: 94000000 bl 0x100 + // 0000000000000100: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 104: aa1803e0 mov x0, x24 + // 108: b9400268 ldr w8, [x19] + // 10c: 37f80108 tbnz w8, #0x1f, 0x12c + // 110: 71000508 subs w8, w8, #0x1 + // 114: b9000268 str w8, [x19] + // 118: 540000a1 b.ne 0x12c + // 11c: aa0003f8 mov x24, x0 + // 120: aa1303e0 mov x0, x19 + // 124: 94000000 bl 0x124 + // 0000000000000124: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 128: aa1803e0 mov x0, x24 + // 12c: a93edea0 stp x0, x23, [x21, #-0x18] + // 130: d10022b5 sub x21, x21, #0x8 + // 134: a9417bfd ldp x29, x30, [sp, #0x10] + // 138: 910083ff add sp, sp, #0x20 + // 13c: 14000000 b 0x13c + // 000000000000013c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 140: a9417bfd ldp x29, x30, [sp, #0x10] + // 144: 910083ff add sp, sp, #0x20 + // 148: 14000000 b 0x148 + // 0000000000000148: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 14c: 00 00 00 00 + const unsigned char code_body[336] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xa8, 0x82, 0x5e, 0xf8, + 0x18, 0x00, 0x00, 0x90, 0x18, 0x03, 0x40, 0xf9, + 0x1f, 0x01, 0x18, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xb3, 0x02, 0x5f, 0xf8, 0x68, 0x06, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0x88, 0x00, 0x38, 0x37, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xb7, 0x82, 0x5f, 0xf8, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x29, 0x3d, 0x02, 0x53, 0x08, 0x4d, 0x29, 0x8b, + 0x02, 0x0d, 0x40, 0xf9, 0xbf, 0xc3, 0x1f, 0xb8, + 0x95, 0x22, 0x00, 0xf9, 0xe8, 0x06, 0x40, 0xf9, + 0x08, 0x49, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0xaa, 0x13, 0x00, 0xd1, + 0x1f, 0x01, 0x09, 0xeb, 0x43, 0x01, 0x9f, 0x9a, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x60, 0x05, 0x00, 0xb4, + 0xa8, 0xc3, 0x5f, 0xb8, 0x08, 0x02, 0x00, 0x35, + 0xa8, 0x22, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x17, 0x00, 0x80, 0xd2, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x21, 0x00, 0x91, 0x08, 0x03, 0x40, 0xb9, + 0x48, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xe1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xf8, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x18, 0xaa, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf8, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x18, 0xaa, 0xa0, 0xde, 0x3e, 0xa9, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: &PyObject_GenericGetAttr+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, (uintptr_t)&PyObject_GenericGetAttr); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x88, 0x4b, state); + patch_aarch64_trampoline(code + 0xc4, 0x0, state); + patch_aarch64_33rx(code + 0xf0, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x100, 0x0, state); + patch_aarch64_trampoline(code + 0x124, 0x0, state); + patch_aarch64_26r(code + 0x13c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x148, state->instruction_starts[instruction->error_target]); +} + +void +emit__MAKE_CALLARGS_A_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CALLARGS_A_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f5eb3 ldp x19, x23, [x21, #-0x10] + // c: f9400668 ldr x8, [x19, #0x8] + // 10: 90000009 adrp x9, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PyTuple_Type + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyTuple_Type + // 18: eb09011f cmp x8, x9 + // 1c: 540003c0 b.eq 0x94 + // 20: f85e02a1 ldur x1, [x21, #-0x20] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1603e0 mov x0, x22 + // 2c: aa1303e2 mov x2, x19 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __Py_Check_ArgsIterable + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: 37f80320 tbnz w0, #0x1f, 0xa0 + // 40: f9002295 str x21, [x20, #0x40] + // 44: aa1303e0 mov x0, x19 + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 _PySequence_Tuple + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: b4000260 cbz x0, 0xa0 + // 58: d10042a8 sub x8, x21, #0x10 + // 5c: f9002288 str x8, [x20, #0x40] + // 60: b9400268 ldr w8, [x19] + // 64: 37f80108 tbnz w8, #0x1f, 0x84 + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b9000268 str w8, [x19] + // 70: 540000a1 b.ne 0x84 + // 74: aa0003f5 mov x21, x0 + // 78: aa1303e0 mov x0, x19 + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 80: aa1503e0 mov x0, x21 + // 84: f9402288 ldr x8, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 91004115 add x21, x8, #0x10 + // 90: aa0003f3 mov x19, x0 + // 94: a93f5eb3 stp x19, x23, [x21, #-0x10] + // 98: a8c17bfd ldp x29, x30, [sp], #0x10 + // 9c: 14000000 b 0x9c + // 000000000000009c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // a0: a8c17bfd ldp x29, x30, [sp], #0x10 + // a4: 14000000 b 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x5e, 0x7f, 0xa9, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xc0, 0x03, 0x00, 0x54, + 0xa1, 0x02, 0x5e, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x03, 0xf8, 0x37, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x60, 0x02, 0x00, 0xb4, + 0xa8, 0x42, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x41, 0x00, 0x91, + 0xf3, 0x03, 0x00, 0xaa, 0xb3, 0x5e, 0x3f, 0xa9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyTuple_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x30, 0x4c, state); + patch_aarch64_trampoline(code + 0x48, 0x1a, state); + patch_aarch64_trampoline(code + 0x7c, 0x0, state); + patch_aarch64_26r(code + 0x9c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xa4, state->instruction_starts[instruction->error_target]); +} + +void +emit__MAKE_CELL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CELL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 91014293 add x19, x20, #0x50 + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 92403d17 and x23, x8, #0xffff + // 18: f8777a60 ldr x0, [x19, x23, lsl #3] + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 _PyCell_New + // 20: b40001e0 cbz x0, 0x5c + // 24: aa0003e8 mov x8, x0 + // 28: f8777a60 ldr x0, [x19, x23, lsl #3] + // 2c: f8377a68 str x8, [x19, x23, lsl #3] + // 30: f9002295 str x21, [x20, #0x40] + // 34: b40000c0 cbz x0, 0x4c + // 38: b9400008 ldr w8, [x0] + // 3c: 37f80088 tbnz w8, #0x1f, 0x4c + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000008 str w8, [x0] + // 48: 540000e0 b.eq 0x64 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: a8c17bfd ldp x29, x30, [sp], #0x10 + // 74: 14000000 b 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[120] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x93, 0x42, 0x01, 0x91, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x17, 0x3d, 0x40, 0x92, + 0x60, 0x7a, 0x77, 0xf8, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x01, 0x00, 0xb4, 0xe8, 0x03, 0x00, 0xaa, + 0x60, 0x7a, 0x77, 0xf8, 0x68, 0x7a, 0x37, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xe0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x1c, 0x4d, state); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x74, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MAKE_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_FUNCTION.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: f9400e81 ldr x1, [x20, #0x18] + // 14: aa1303e0 mov x0, x19 + // 18: 94000000 bl 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 _PyFunction_New + // 1c: aa0003f7 mov x23, x0 + // 20: f9402288 ldr x8, [x20, #0x40] + // 24: d1002108 sub x8, x8, #0x8 + // 28: f9002288 str x8, [x20, #0x40] + // 2c: b9400268 ldr w8, [x19] + // 30: 37f80088 tbnz w8, #0x1f, 0x40 + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000268 str w8, [x19] + // 3c: 54000140 b.eq 0x64 + // 40: f9402295 ldr x21, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: b4000197 cbz x23, 0x78 + // 4c: b9405e61 ldr w1, [x19, #0x5c] + // 50: aa1703e0 mov x0, x23 + // 54: 94000000 bl 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __PyFunction_SetVersion + // 58: f80086b7 str x23, [x21], #0x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: aa1303e0 mov x0, x19 + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: b5fffed7 cbnz x23, 0x4c + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x81, 0x0e, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf7, 0x03, 0x00, 0xaa, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x40, 0x01, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x97, 0x01, 0x00, 0xb4, 0x61, 0x5e, 0x40, 0xb9, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb7, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xd7, 0xfe, 0xff, 0xb5, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x18, 0x4f, state); + patch_aarch64_trampoline(code + 0x54, 0x4e, state); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x68, 0x0, state); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->error_target]); +} + +void +emit__MAKE_WARM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_WARM.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_EXECUTOR + // 8: 52800029 mov w9, #0x1 ; =1 + // c: 39008d09 strb w9, [x8, #0x23] + // 10: f9400ac8 ldr x8, [x22, #0x10] + // 14: 528cea09 mov w9, #0x6750 ; =26448 + // 18: 72a00069 movk w9, #0x3, lsl #16 + // 1c: f869690a ldr x10, [x8, x9] + // 20: f100054a subs x10, x10, #0x1 + // 24: f829690a str x10, [x8, x9] + // 28: 54000040 b.eq 0x30 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 30: 910062c8 add x8, x22, #0x18 + // 34: 52801009 mov w9, #0x80 ; =128 + // 38: f8e93108 ldsetal x9, x8, [x8] + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[64] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x00, 0x80, 0x52, 0x09, 0x8d, 0x00, 0x39, + 0xc8, 0x0a, 0x40, 0xf9, 0x09, 0xea, 0x8c, 0x52, + 0x69, 0x00, 0xa0, 0x72, 0x0a, 0x69, 0x69, 0xf8, + 0x4a, 0x05, 0x00, 0xf1, 0x0a, 0x69, 0x29, 0xf8, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xc8, 0x62, 0x00, 0x91, 0x09, 0x10, 0x80, 0x52, + 0x08, 0x31, 0xe9, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: EXECUTOR + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MAP_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAP_ADD.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: a97f0aa1 ldp x1, x2, [x21, #-0x10] + // 14: 92800029 mov x9, #-0x2 ; =-2 + // 18: cb282128 sub x8, x9, w8, uxth + // 1c: f8687aa0 ldr x0, [x21, x8, lsl #3] + // 20: f9002295 str x21, [x20, #0x40] + // 24: 94000000 bl 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __PyDict_SetItem_Take2 + // 28: f9402288 ldr x8, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: d1004115 sub x21, x8, #0x10 + // 34: 34000060 cbz w0, 0x40 + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa1, 0x0a, 0x7f, 0xa9, 0x29, 0x00, 0x80, 0x92, + 0x28, 0x21, 0x28, 0xcb, 0xa0, 0x7a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x41, 0x00, 0xd1, 0x60, 0x00, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x24, 0x50, state); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MATCH_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_CLASS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f66b7 ldp x23, x25, [x21, #-0x10] + // c: f85e82b8 ldur x24, [x21, #-0x18] + // 10: f9002295 str x21, [x20, #0x40] + // 14: 90000008 adrp x8, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 92403d03 and x3, x8, #0xffff + // 20: aa1603e0 mov x0, x22 + // 24: aa1803e1 mov x1, x24 + // 28: aa1703e2 mov x2, x23 + // 2c: aa1903e4 mov x4, x25 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __PyEval_MatchClass + // 34: aa0003f3 mov x19, x0 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400308 ldr w8, [x24] + // 44: 37f800c8 tbnz w8, #0x1f, 0x5c + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000308 str w8, [x24] + // 50: 54000061 b.ne 0x5c + // 54: aa1803e0 mov x0, x24 + // 58: 94000000 bl 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 5c: b94002e8 ldr w8, [x23] + // 60: 37f800c8 tbnz w8, #0x1f, 0x78 + // 64: 71000508 subs w8, w8, #0x1 + // 68: b90002e8 str w8, [x23] + // 6c: 54000061 b.ne 0x78 + // 70: aa1703e0 mov x0, x23 + // 74: 94000000 bl 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 78: b9400328 ldr w8, [x25] + // 7c: 37f80088 tbnz w8, #0x1f, 0x8c + // 80: 71000508 subs w8, w8, #0x1 + // 84: b9000328 str w8, [x25] + // 88: 540000c0 b.eq 0xa0 + // 8c: b4000113 cbz x19, 0xac + // 90: f81e82b3 stur x19, [x21, #-0x18] + // 94: d10042b5 sub x21, x21, #0x10 + // 98: a8c17bfd ldp x29, x30, [sp], #0x10 + // 9c: 14000000 b 0x9c + // 000000000000009c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // a0: aa1903e0 mov x0, x25 + // a4: 94000000 bl 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a8: b5ffff53 cbnz x19, 0x90 + // ac: f9403ac8 ldr x8, [x22, #0x70] + // b0: b40000c8 cbz x8, 0xc8 + // b4: f9400508 ldr x8, [x8, #0x8] + // b8: b4000088 cbz x8, 0xc8 + // bc: d10062b5 sub x21, x21, #0x18 + // c0: a8c17bfd ldp x29, x30, [sp], #0x10 + // c4: 14000000 b 0xc4 + // 00000000000000c4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // c8: 90000013 adrp x19, 0x0 + // 00000000000000c8: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // cc: f9400273 ldr x19, [x19] + // 00000000000000cc: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // d0: f81e82b3 stur x19, [x21, #-0x18] + // d4: d10042b5 sub x21, x21, #0x10 + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[224] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x66, 0x7f, 0xa9, 0xb8, 0x82, 0x5e, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x03, 0x3d, 0x40, 0x92, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x18, 0xaa, + 0xe2, 0x03, 0x17, 0xaa, 0xe4, 0x03, 0x19, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x08, 0x03, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x28, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x28, 0x03, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x13, 0x01, 0x00, 0xb4, + 0xb3, 0x82, 0x1e, 0xf8, 0xb5, 0x42, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x53, 0xff, 0xff, 0xb5, 0xc8, 0x3a, 0x40, 0xf9, + 0xc8, 0x00, 0x00, 0xb4, 0x08, 0x05, 0x40, 0xf9, + 0x88, 0x00, 0x00, 0xb4, 0xb5, 0x62, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x13, 0x00, 0x00, 0x90, 0x73, 0x02, 0x40, 0xf9, + 0xb3, 0x82, 0x1e, 0xf8, 0xb5, 0x42, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_trampoline(code + 0x30, 0x51, state); + patch_aarch64_trampoline(code + 0x58, 0x0, state); + patch_aarch64_trampoline(code + 0x74, 0x0, state); + patch_aarch64_26r(code + 0x9c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xa4, 0x0, state); + patch_aarch64_26r(code + 0xc4, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0xc8, (uintptr_t)data); + patch_aarch64_26r(code + 0xdc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MATCH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_KEYS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f0aa1 ldp x1, x2, [x21, #-0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1603e0 mov x0, x22 + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __PyEval_MatchKeys + // 18: f9402295 ldr x21, [x20, #0x40] + // 1c: f900229f str xzr, [x20, #0x40] + // 20: b4000080 cbz x0, 0x30 + // 24: f80086a0 str x0, [x21], #0x8 + // 28: a8c17bfd ldp x29, x30, [sp], #0x10 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 30: a8c17bfd ldp x29, x30, [sp], #0x10 + // 34: 14000000 b 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[56] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa1, 0x0a, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0x52, state); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x34, state->instruction_starts[instruction->error_target]); +} + +void +emit__MATCH_MAPPING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_MAPPING.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: f9405508 ldr x8, [x8, #0xa8] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 14: 9000000a adrp x10, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 18: f940014a ldr x10, [x10] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 1c: f27a011f tst x8, #0x40 + // 20: 9a890148 csel x8, x10, x9, eq + // 24: f80086a8 str x8, [x21], #0x8 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x08, 0x55, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x7a, 0xf2, + 0x48, 0x01, 0x89, 0x9a, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MATCH_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_SEQUENCE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: f9405508 ldr x8, [x8, #0xa8] + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 14: 9000000a adrp x10, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 18: f940014a ldr x10, [x10] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 1c: f27b011f tst x8, #0x20 + // 20: 9a890148 csel x8, x10, x9, eq + // 24: f80086a8 str x8, [x21], #0x8 + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x08, 0x55, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x7b, 0xf2, + 0x48, 0x01, 0x89, 0x9a, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MAYBE_EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12003d0a and w10, w8, #0xffff + // c: 12800028 mov w8, #-0x2 ; =-2 + // 10: 4b0a0108 sub w8, w8, w10 + // 14: f868daa9 ldr x9, [x21, w8, sxtw #3] + // 18: f940052b ldr x11, [x9, #0x8] + // 1c: 9000000c adrp x12, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 20: f940018c ldr x12, [x12] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 24: eb0c017f cmp x11, x12 + // 28: 54000040 b.eq 0x30 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 30: 2a2a03ea mvn w10, w10 + // 34: f86adaab ldr x11, [x21, w10, sxtw #3] + // 38: b5ffffab cbnz x11, 0x2c + // 3c: f9400d2b ldr x11, [x9, #0x18] + // 40: b940016c ldr w12, [x11] + // 44: 37f8006c tbnz w12, #0x1f, 0x50 + // 48: 1100058c add w12, w12, #0x1 + // 4c: b900016c str w12, [x11] + // 50: f82adaab str x11, [x21, w10, sxtw #3] + // 54: f9400929 ldr x9, [x9, #0x10] + // 58: f868daa0 ldr x0, [x21, w8, sxtw #3] + // 5c: b940012a ldr w10, [x9] + // 60: 37f8006a tbnz w10, #0x1f, 0x6c + // 64: 1100054a add w10, w10, #0x1 + // 68: b900012a str w10, [x9] + // 6c: f828daa9 str x9, [x21, w8, sxtw #3] + // 70: f9002295 str x21, [x20, #0x40] + // 74: b9400008 ldr w8, [x0] + // 78: 37f80088 tbnz w8, #0x1f, 0x88 + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000008 str w8, [x0] + // 84: 54000080 b.eq 0x94 + // 88: f9402295 ldr x21, [x20, #0x40] + // 8c: f900229f str xzr, [x20, #0x40] + // 90: 14000000 b 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 94: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 98: 910003fd mov x29, sp + // 9c: 94000000 bl 0x9c + // 000000000000009c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a0: a8c17bfd ldp x29, x30, [sp], #0x10 + // a4: f9402295 ldr x21, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[176] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0a, 0x3d, 0x00, 0x12, 0x28, 0x00, 0x80, 0x12, + 0x08, 0x01, 0x0a, 0x4b, 0xa9, 0xda, 0x68, 0xf8, + 0x2b, 0x05, 0x40, 0xf9, 0x0c, 0x00, 0x00, 0x90, + 0x8c, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0c, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xea, 0x03, 0x2a, 0x2a, 0xab, 0xda, 0x6a, 0xf8, + 0xab, 0xff, 0xff, 0xb5, 0x2b, 0x0d, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x6c, 0x01, 0x00, 0xb9, + 0xab, 0xda, 0x2a, 0xf8, 0x29, 0x09, 0x40, 0xf9, + 0xa0, 0xda, 0x68, 0xf8, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xda, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyMethod_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x9c, 0x0, state); + patch_aarch64_26r(code + 0xac, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MAYBE_EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD_KW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 92403d0a and x10, x8, #0xffff + // 18: 92800048 mov x8, #-0x3 ; =-3 + // 1c: cb0a0108 sub x8, x8, x10 + // 20: f8687aa9 ldr x9, [x21, x8, lsl #3] + // 24: f940052b ldr x11, [x9, #0x8] + // 28: 9000000c adrp x12, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 _PyMethod_Type + // 2c: f940018c ldr x12, [x12] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyMethod_Type + // 30: eb0c017f cmp x11, x12 + // 34: 54000080 b.eq 0x44 + // 38: f81f82b3 stur x19, [x21, #-0x8] + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 9280002b mov x11, #-0x2 ; =-2 + // 48: cb0a016a sub x10, x11, x10 + // 4c: f86a7aab ldr x11, [x21, x10, lsl #3] + // 50: b5ffff4b cbnz x11, 0x38 + // 54: f9400d2b ldr x11, [x9, #0x18] + // 58: b940016c ldr w12, [x11] + // 5c: aa0903e0 mov x0, x9 + // 60: 37f8008c tbnz w12, #0x1f, 0x70 + // 64: 1100058c add w12, w12, #0x1 + // 68: b900016c str w12, [x11] + // 6c: f8687aa0 ldr x0, [x21, x8, lsl #3] + // 70: f82a7aab str x11, [x21, x10, lsl #3] + // 74: f9400929 ldr x9, [x9, #0x10] + // 78: b940012a ldr w10, [x9] + // 7c: 37f8006a tbnz w10, #0x1f, 0x88 + // 80: 1100054a add w10, w10, #0x1 + // 84: b900012a str w10, [x9] + // 88: f8287aa9 str x9, [x21, x8, lsl #3] + // 8c: f9002295 str x21, [x20, #0x40] + // 90: b9400008 ldr w8, [x0] + // 94: 37f80088 tbnz w8, #0x1f, 0xa4 + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b9000008 str w8, [x0] + // a0: 540000c0 b.eq 0xb8 + // a4: f9402295 ldr x21, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: f81f82b3 stur x19, [x21, #-0x8] + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b8: 94000000 bl 0xb8 + // 00000000000000b8: ARM64_RELOC_BRANCH26 __Py_Dealloc + // bc: f9402295 ldr x21, [x20, #0x40] + // c0: f900229f str xzr, [x20, #0x40] + // c4: f81f82b3 stur x19, [x21, #-0x8] + // c8: a8c17bfd ldp x29, x30, [sp], #0x10 + // cc: 14000000 b 0xcc + // 00000000000000cc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[208] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x0a, 0x3d, 0x40, 0x92, + 0x48, 0x00, 0x80, 0x92, 0x08, 0x01, 0x0a, 0xcb, + 0xa9, 0x7a, 0x68, 0xf8, 0x2b, 0x05, 0x40, 0xf9, + 0x0c, 0x00, 0x00, 0x90, 0x8c, 0x01, 0x40, 0xf9, + 0x7f, 0x01, 0x0c, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0xb3, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x2b, 0x00, 0x80, 0x92, + 0x6a, 0x01, 0x0a, 0xcb, 0xab, 0x7a, 0x6a, 0xf8, + 0x4b, 0xff, 0xff, 0xb5, 0x2b, 0x0d, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0xe0, 0x03, 0x09, 0xaa, + 0x8c, 0x00, 0xf8, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x6c, 0x01, 0x00, 0xb9, 0xa0, 0x7a, 0x68, 0xf8, + 0xab, 0x7a, 0x2a, 0xf8, 0x29, 0x09, 0x40, 0xf9, + 0x2a, 0x01, 0x40, 0xb9, 0x6a, 0x00, 0xf8, 0x37, + 0x4a, 0x05, 0x00, 0x11, 0x2a, 0x01, 0x00, 0xb9, + 0xa9, 0x7a, 0x28, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb3, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb3, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyMethod_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xb8, 0x0, state); + patch_aarch64_26r(code + 0xcc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__NOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _NOP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 14000000 b 0x0 + // 0000000000000000: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 4: 00 00 00 00 + const unsigned char code_body[8] = { + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__POP_EXCEPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_EXCEPT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9403ec9 ldr x9, [x22, #0x78] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9400120 ldr x0, [x9] + // 10: 9000000a adrp x10, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 14: f940014a ldr x10, [x10] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 18: eb0a011f cmp x8, x10 + // 1c: 9a8803e8 csel x8, xzr, x8, eq + // 20: f9000128 str x8, [x9] + // 24: b40000c0 cbz x0, 0x3c + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 540000a0 b.eq 0x4c + // 3c: f9402288 ldr x8, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: d1002115 sub x21, x8, #0x8 + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 4c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 50: 910003fd mov x29, sp + // 54: 94000000 bl 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: f9402288 ldr x8, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: d1002115 sub x21, x8, #0x8 + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 6c: 00 00 00 00 + const unsigned char code_body[112] = { + 0xa8, 0x82, 0x5f, 0xf8, 0xc9, 0x3e, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x20, 0x01, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x0a, 0xeb, 0xe8, 0x03, 0x88, 0x9a, + 0x28, 0x01, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x21, 0x00, 0xd1, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x21, 0x00, 0xd1, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x54, 0x0, state); + patch_aarch64_26r(code + 0x68, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__POP_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea0 ldr x0, [x21, #-0x8]! + // 4: b9400008 ldr w8, [x0] + // 8: 37f80088 tbnz w8, #0x1f, 0x18 + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 20: 910003fd mov x29, sp + // 24: 94000000 bl 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 28: a8c17bfd ldp x29, x30, [sp], #0x10 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa0, 0x8e, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x24, 0x0, state); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__POP_TOP_LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP_LOAD_CONST_INLINE_BORROW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f8ea0 ldr x0, [x21, #-0x8]! + // c: f9002295 str x21, [x20, #0x40] + // 10: b9400008 ldr w8, [x0] + // 14: 37f800a8 tbnz w8, #0x1f, 0x28 + // 18: 71000508 subs w8, w8, #0x1 + // 1c: b9000008 str w8, [x0] + // 20: 54000041 b.ne 0x28 + // 24: 94000000 bl 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 34: f900229f str xzr, [x20, #0x40] + // 38: f80086a8 str x8, [x21], #0x8 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x24, 0x0, state); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_EXC_INFO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_EXC_INFO.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9403ec9 ldr x9, [x22, #0x78] + // 8: f940012a ldr x10, [x9] + // c: b940010b ldr w11, [x8] + // 10: 37f8006b tbnz w11, #0x1f, 0x1c + // 14: 1100056b add w11, w11, #0x1 + // 18: b900010b str w11, [x8] + // 1c: 9000000b adrp x11, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 20: f940016b ldr x11, [x11] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 24: f100015f cmp x10, #0x0 + // 28: 9a8a016a csel x10, x11, x10, eq + // 2c: f9000128 str x8, [x9] + // 30: a93fa2aa stp x10, x8, [x21, #-0x8] + // 34: 910022b5 add x21, x21, #0x8 + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0xa8, 0x82, 0x5f, 0xf8, 0xc9, 0x3e, 0x40, 0xf9, + 0x2a, 0x01, 0x40, 0xf9, 0x0b, 0x01, 0x40, 0xb9, + 0x6b, 0x00, 0xf8, 0x37, 0x6b, 0x05, 0x00, 0x11, + 0x0b, 0x01, 0x00, 0xb9, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x00, 0xf1, + 0x6a, 0x01, 0x8a, 0x9a, 0x28, 0x01, 0x00, 0xf9, + 0xaa, 0xa2, 0x3f, 0xa9, 0xb5, 0x22, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_FRAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9002295 str x21, [x20, #0x40] + // 8: f90026c8 str x8, [x22, #0x48] + // c: b9402ec9 ldr w9, [x22, #0x2c] + // 10: 51000529 sub w9, w9, #0x1 + // 14: b9002ec9 str w9, [x22, #0x2c] + // 18: f9402115 ldr x21, [x8, #0x40] + // 1c: f900211f str xzr, [x8, #0x40] + // 20: aa0803f4 mov x20, x8 + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xc8, 0x26, 0x00, 0xf9, 0xc9, 0x2e, 0x40, 0xb9, + 0x29, 0x05, 0x00, 0x51, 0xc9, 0x2e, 0x00, 0xb9, + 0x15, 0x21, 0x40, 0xf9, 0x1f, 0x21, 0x00, 0xf9, + 0xf4, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_NULL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f80086bf str xzr, [x21], #0x8 + // 4: 14000000 b 0x4 + // 0000000000000004: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[8] = { + 0xbf, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_NULL_CONDITIONAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL_CONDITIONAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000009 adrp x9, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400129 ldr x9, [x9] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 12000128 and w8, w9, #0x1 + // c: 36000049 tbz w9, #0x0, 0x14 + // 10: f90002bf str xzr, [x21] + // 14: 8b284eb5 add x21, x21, w8, uxtw #3 + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x01, 0x00, 0x12, 0x49, 0x00, 0x00, 0x36, + 0xbf, 0x02, 0x00, 0xf9, 0xb5, 0x4e, 0x28, 0x8b, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PY_FRAME_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_GENERAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: d2800002 mov x2, #0x0 ; =0 + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 12003d2c and w12, w9, #0xffff + // 18: cb292ea8 sub x8, x21, w9, uxth #3 + // 1c: 2a2c03ea mvn w10, w12 + // 20: 9280002b mov x11, #-0x2 ; =-2 + // 24: cb292169 sub x9, x11, w9, uxth + // 28: f8697aab ldr x11, [x21, x9, lsl #3] + // 2c: f86adaaa ldr x10, [x21, w10, sxtw #3] + // 30: 928000ed mov x13, #-0x8 ; =-8 + // 34: f100015f cmp x10, #0x0 + // 38: 9a9f11aa csel x10, x13, xzr, ne + // 3c: 1a8c0584 cinc w4, w12, ne + // 40: f940196c ldr x12, [x11, #0x30] + // 44: 3940c18c ldrb w12, [x12, #0x30] + // 48: 370000cc tbnz w12, #0x0, 0x60 + // 4c: f9400962 ldr x2, [x11, #0x10] + // 50: b940004b ldr w11, [x2] + // 54: 37f8006b tbnz w11, #0x1f, 0x60 + // 58: 1100056b add w11, w11, #0x1 + // 5c: b900004b str w11, [x2] + // 60: f9002295 str x21, [x20, #0x40] + // 64: d37df133 lsl x19, x9, #3 + // 68: f8736aa1 ldr x1, [x21, x19] + // 6c: 8b0a0103 add x3, x8, x10 + // 70: aa1603e0 mov x0, x22 + // 74: d2800005 mov x5, #0x0 ; =0 + // 78: aa1403e6 mov x6, x20 + // 7c: 94000000 bl 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __PyEvalFramePushAndInit + // 80: f9402288 ldr x8, [x20, #0x40] + // 84: f900229f str xzr, [x20, #0x40] + // 88: 8b130115 add x21, x8, x19 + // 8c: b4000080 cbz x0, 0x9c + // 90: f80086a0 str x0, [x21], #0x8 + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 + // 0000000000000098: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x02, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x2c, 0x3d, 0x00, 0x12, + 0xa8, 0x2e, 0x29, 0xcb, 0xea, 0x03, 0x2c, 0x2a, + 0x2b, 0x00, 0x80, 0x92, 0x69, 0x21, 0x29, 0xcb, + 0xab, 0x7a, 0x69, 0xf8, 0xaa, 0xda, 0x6a, 0xf8, + 0xed, 0x00, 0x80, 0x92, 0x5f, 0x01, 0x00, 0xf1, + 0xaa, 0x11, 0x9f, 0x9a, 0x84, 0x05, 0x8c, 0x1a, + 0x6c, 0x19, 0x40, 0xf9, 0x8c, 0xc1, 0x40, 0x39, + 0xcc, 0x00, 0x00, 0x37, 0x62, 0x09, 0x40, 0xf9, + 0x4b, 0x00, 0x40, 0xb9, 0x6b, 0x00, 0xf8, 0x37, + 0x6b, 0x05, 0x00, 0x11, 0x4b, 0x00, 0x00, 0xb9, + 0x95, 0x22, 0x00, 0xf9, 0x33, 0xf1, 0x7d, 0xd3, + 0xa1, 0x6a, 0x73, 0xf8, 0x03, 0x01, 0x0a, 0x8b, + 0xe0, 0x03, 0x16, 0xaa, 0x05, 0x00, 0x80, 0xd2, + 0xe6, 0x03, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x01, 0x13, 0x8b, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x7c, 0x2a, state); + patch_aarch64_26r(code + 0x98, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); +} + +void +emit__PY_FRAME_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_KW.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: d2800002 mov x2, #0x0 ; =0 + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 14: 12003d2b and w11, w9, #0xffff + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: 2a2b03e8 mvn w8, w11 + // 20: 8b28cea8 add x8, x21, w8, sxtw #3 + // 24: 92403d29 and x9, x9, #0xffff + // 28: 9280002a mov x10, #-0x2 ; =-2 + // 2c: cb090157 sub x23, x10, x9 + // 30: 9280004a mov x10, #-0x3 ; =-3 + // 34: cb090149 sub x9, x10, x9 + // 38: f8697aac ldr x12, [x21, x9, lsl #3] + // 3c: f8777aaa ldr x10, [x21, x23, lsl #3] + // 40: 928000ed mov x13, #-0x8 ; =-8 + // 44: f100015f cmp x10, #0x0 + // 48: 9a9f11aa csel x10, x13, xzr, ne + // 4c: 1a8b056b cinc w11, w11, ne + // 50: b940126d ldr w13, [x19, #0x10] + // 54: 4b0d016b sub w11, w11, w13 + // 58: f940198d ldr x13, [x12, #0x30] + // 5c: 3940c1ad ldrb w13, [x13, #0x30] + // 60: 370000cd tbnz w13, #0x0, 0x78 + // 64: f9400982 ldr x2, [x12, #0x10] + // 68: b940004c ldr w12, [x2] + // 6c: 37f8006c tbnz w12, #0x1f, 0x78 + // 70: 1100058c add w12, w12, #0x1 + // 74: b900004c str w12, [x2] + // 78: f9002295 str x21, [x20, #0x40] + // 7c: 93407d64 sxtw x4, w11 + // 80: f8697aa1 ldr x1, [x21, x9, lsl #3] + // 84: 8b0a0103 add x3, x8, x10 + // 88: aa1603e0 mov x0, x22 + // 8c: aa1303e5 mov x5, x19 + // 90: aa1403e6 mov x6, x20 + // 94: 94000000 bl 0x94 + // 0000000000000094: ARM64_RELOC_BRANCH26 __PyEvalFramePushAndInit + // 98: f9402288 ldr x8, [x20, #0x40] + // 9c: d1002108 sub x8, x8, #0x8 + // a0: f9002288 str x8, [x20, #0x40] + // a4: b9400268 ldr w8, [x19] + // a8: 37f80088 tbnz w8, #0x1f, 0xb8 + // ac: 71000508 subs w8, w8, #0x1 + // b0: b9000268 str w8, [x19] + // b4: 54000100 b.eq 0xd4 + // b8: f9402288 ldr x8, [x20, #0x40] + // bc: f900229f str xzr, [x20, #0x40] + // c0: 8b170d15 add x21, x8, x23, lsl #3 + // c4: b4000180 cbz x0, 0xf4 + // c8: f80086a0 str x0, [x21], #0x8 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 + // 00000000000000d0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // d4: aa0003f5 mov x21, x0 + // d8: aa1303e0 mov x0, x19 + // dc: 94000000 bl 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e0: aa1503e0 mov x0, x21 + // e4: f9402288 ldr x8, [x20, #0x40] + // e8: f900229f str xzr, [x20, #0x40] + // ec: 8b170d15 add x21, x8, x23, lsl #3 + // f0: b5fffec0 cbnz x0, 0xc8 + // f4: a8c17bfd ldp x29, x30, [sp], #0x10 + // f8: 14000000 b 0xf8 + // 00000000000000f8: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // fc: 00 00 00 00 + const unsigned char code_body[256] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x02, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x2b, 0x3d, 0x00, 0x12, + 0xb3, 0x82, 0x5f, 0xf8, 0xe8, 0x03, 0x2b, 0x2a, + 0xa8, 0xce, 0x28, 0x8b, 0x29, 0x3d, 0x40, 0x92, + 0x2a, 0x00, 0x80, 0x92, 0x57, 0x01, 0x09, 0xcb, + 0x4a, 0x00, 0x80, 0x92, 0x49, 0x01, 0x09, 0xcb, + 0xac, 0x7a, 0x69, 0xf8, 0xaa, 0x7a, 0x77, 0xf8, + 0xed, 0x00, 0x80, 0x92, 0x5f, 0x01, 0x00, 0xf1, + 0xaa, 0x11, 0x9f, 0x9a, 0x6b, 0x05, 0x8b, 0x1a, + 0x6d, 0x12, 0x40, 0xb9, 0x6b, 0x01, 0x0d, 0x4b, + 0x8d, 0x19, 0x40, 0xf9, 0xad, 0xc1, 0x40, 0x39, + 0xcd, 0x00, 0x00, 0x37, 0x82, 0x09, 0x40, 0xf9, + 0x4c, 0x00, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x4c, 0x00, 0x00, 0xb9, + 0x95, 0x22, 0x00, 0xf9, 0x64, 0x7d, 0x40, 0x93, + 0xa1, 0x7a, 0x69, 0xf8, 0x03, 0x01, 0x0a, 0x8b, + 0xe0, 0x03, 0x16, 0xaa, 0xe5, 0x03, 0x13, 0xaa, + 0xe6, 0x03, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x00, 0x01, 0x00, 0x54, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x0d, 0x17, 0x8b, 0x80, 0x01, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x0d, 0x17, 0x8b, + 0xc0, 0xfe, 0xff, 0xb5, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x94, 0x2a, state); + patch_aarch64_26r(code + 0xd0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xdc, 0x0, state); + patch_aarch64_26r(code + 0xf8, state->instruction_starts[instruction->error_target]); +} + +void +emit__REPLACE_WITH_TRUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _REPLACE_WITH_TRUE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: b9400008 ldr w8, [x0] + // 8: 37f80088 tbnz w8, #0x1f, 0x18 + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 540000a0 b.eq 0x28 + // 18: 90000008 adrp x8, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 20: f81f82a8 stur x8, [x21, #-0x8] + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 910003fd mov x29, sp + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 90000008 adrp x8, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 40: f81f82a8 stur x8, [x21, #-0x8] + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[72] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_TrueStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x30, 0x0, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RESUME_CHECK.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400ec8 ldr x8, [x22, #0x18] + // 4: f9400289 ldr x9, [x20] + // 8: f9405529 ldr x9, [x9, #0xa8] + // c: eb09011f cmp x8, x9 + // 10: 54000041 b.ne 0x18 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0xc8, 0x0e, 0x40, 0xf9, 0x89, 0x02, 0x40, 0xf9, + 0x29, 0x55, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); +} + +void +emit__RETURN_GENERATOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_GENERATOR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f9400a80 ldr x0, [x20, #0x10] + // c: f9002295 str x21, [x20, #0x40] + // 10: 94000000 bl 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __Py_MakeCoro + // 14: f9402295 ldr x21, [x20, #0x40] + // 18: f900229f str xzr, [x20, #0x40] + // 1c: b40007c0 cbz x0, 0x114 + // 20: f9401e88 ldr x8, [x20, #0x38] + // 24: 91000908 add x8, x8, #0x2 + // 28: a903d688 stp x8, x21, [x20, #0x38] + // 2c: ad400680 ldp q0, q1, [x20] + // 30: 3c858001 stur q1, [x0, #0x58] + // 34: 3c848000 stur q0, [x0, #0x48] + // 38: ad418281 ldp q1, q0, [x20, #0x30] + // 3c: aa1403e8 mov x8, x20 + // 40: f8450d09 ldr x9, [x8, #0x50]! + // 44: 3dc00a82 ldr q2, [x20, #0x20] + // 48: 3c868002 stur q2, [x0, #0x68] + // 4c: f9004c09 str x9, [x0, #0x98] + // 50: 3c888000 stur q0, [x0, #0x88] + // 54: 3c878001 stur q1, [x0, #0x78] + // 58: f9402289 ldr x9, [x20, #0x40] + // 5c: cb080128 sub x8, x9, x8 + // 60: d343fd09 lsr x9, x8, #3 + // 64: 8b29cc0a add x10, x0, w9, sxtw #3 + // 68: 9102614a add x10, x10, #0x98 + // 6c: f900440a str x10, [x0, #0x88] + // 70: 7100093f cmp w9, #0x2 + // 74: 5400028b b.lt 0xc4 + // 78: d3438508 ubfx x8, x8, #3, #31 + // 7c: d100050a sub x10, x8, #0x1 + // 80: f100215f cmp x10, #0x8 + // 84: 540000a3 b.lo 0x98 + // 88: cb140009 sub x9, x0, x20 + // 8c: 91012129 add x9, x9, #0x48 + // 90: f101013f cmp x9, #0x40 + // 94: 54000442 b.hs 0x11c + // 98: 52800029 mov w9, #0x1 ; =1 + // 9c: cb080128 sub x8, x9, x8 + // a0: d37df12a lsl x10, x9, #3 + // a4: 8b140149 add x9, x10, x20 + // a8: 91014129 add x9, x9, #0x50 + // ac: 8b00014a add x10, x10, x0 + // b0: 9102614a add x10, x10, #0x98 + // b4: f840852b ldr x11, [x9], #0x8 + // b8: f800854b str x11, [x10], #0x8 + // bc: b1000508 adds x8, x8, #0x1 + // c0: 54ffffa3 b.lo 0xb4 + // c4: f900281f str xzr, [x0, #0x50] + // c8: 52801fa8 mov w8, #0xfd ; =253 + // cc: 39010c08 strb w8, [x0, #0x43] + // d0: 52800028 mov w8, #0x1 ; =1 + // d4: 39024808 strb w8, [x0, #0x92] + // d8: b9402ec8 ldr w8, [x22, #0x2c] + // dc: 11000508 add w8, w8, #0x1 + // e0: b9002ec8 str w8, [x22, #0x2c] + // e4: f9400693 ldr x19, [x20, #0x8] + // e8: aa0003f7 mov x23, x0 + // ec: aa1603e0 mov x0, x22 + // f0: aa1403e1 mov x1, x20 + // f4: 94000000 bl 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __PyThreadState_PopFrame + // f8: f90026d3 str x19, [x22, #0x48] + // fc: f9402275 ldr x21, [x19, #0x40] + // 100: f900227f str xzr, [x19, #0x40] + // 104: f80086b7 str x23, [x21], #0x8 + // 108: aa1303f4 mov x20, x19 + // 10c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 110: 14000000 b 0x110 + // 0000000000000110: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 114: a8c17bfd ldp x29, x30, [sp], #0x10 + // 118: 14000000 b 0x118 + // 0000000000000118: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 11c: 927df14b and x11, x10, #0xfffffffffffffff8 + // 120: b2400169 orr x9, x11, #0x1 + // 124: 9102228c add x12, x20, #0x88 + // 128: 9103400d add x13, x0, #0xd0 + // 12c: aa0b03ee mov x14, x11 + // 130: ad7e8580 ldp q0, q1, [x12, #-0x30] + // 134: ad7f8d82 ldp q2, q3, [x12, #-0x10] + // 138: ad3e85a0 stp q0, q1, [x13, #-0x30] + // 13c: ad3f8da2 stp q2, q3, [x13, #-0x10] + // 140: 9101018c add x12, x12, #0x40 + // 144: 910101ad add x13, x13, #0x40 + // 148: f10021ce subs x14, x14, #0x8 + // 14c: 54ffff21 b.ne 0x130 + // 150: eb0b015f cmp x10, x11 + // 154: 54fffb80 b.eq 0xc4 + // 158: 17ffffd1 b 0x9c + // 15c: 00 00 00 00 + const unsigned char code_body[352] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x80, 0x0a, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x07, 0x00, 0xb4, + 0x88, 0x1e, 0x40, 0xf9, 0x08, 0x09, 0x00, 0x91, + 0x88, 0xd6, 0x03, 0xa9, 0x80, 0x06, 0x40, 0xad, + 0x01, 0x80, 0x85, 0x3c, 0x00, 0x80, 0x84, 0x3c, + 0x81, 0x82, 0x41, 0xad, 0xe8, 0x03, 0x14, 0xaa, + 0x09, 0x0d, 0x45, 0xf8, 0x82, 0x0a, 0xc0, 0x3d, + 0x02, 0x80, 0x86, 0x3c, 0x09, 0x4c, 0x00, 0xf9, + 0x00, 0x80, 0x88, 0x3c, 0x01, 0x80, 0x87, 0x3c, + 0x89, 0x22, 0x40, 0xf9, 0x28, 0x01, 0x08, 0xcb, + 0x09, 0xfd, 0x43, 0xd3, 0x0a, 0xcc, 0x29, 0x8b, + 0x4a, 0x61, 0x02, 0x91, 0x0a, 0x44, 0x00, 0xf9, + 0x3f, 0x09, 0x00, 0x71, 0x8b, 0x02, 0x00, 0x54, + 0x08, 0x85, 0x43, 0xd3, 0x0a, 0x05, 0x00, 0xd1, + 0x5f, 0x21, 0x00, 0xf1, 0xa3, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x14, 0xcb, 0x29, 0x21, 0x01, 0x91, + 0x3f, 0x01, 0x01, 0xf1, 0x42, 0x04, 0x00, 0x54, + 0x29, 0x00, 0x80, 0x52, 0x28, 0x01, 0x08, 0xcb, + 0x2a, 0xf1, 0x7d, 0xd3, 0x49, 0x01, 0x14, 0x8b, + 0x29, 0x41, 0x01, 0x91, 0x4a, 0x01, 0x00, 0x8b, + 0x4a, 0x61, 0x02, 0x91, 0x2b, 0x85, 0x40, 0xf8, + 0x4b, 0x85, 0x00, 0xf8, 0x08, 0x05, 0x00, 0xb1, + 0xa3, 0xff, 0xff, 0x54, 0x1f, 0x28, 0x00, 0xf9, + 0xa8, 0x1f, 0x80, 0x52, 0x08, 0x0c, 0x01, 0x39, + 0x28, 0x00, 0x80, 0x52, 0x08, 0x48, 0x02, 0x39, + 0xc8, 0x2e, 0x40, 0xb9, 0x08, 0x05, 0x00, 0x11, + 0xc8, 0x2e, 0x00, 0xb9, 0x93, 0x06, 0x40, 0xf9, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x14, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xd3, 0x26, 0x00, 0xf9, 0x75, 0x22, 0x40, 0xf9, + 0x7f, 0x22, 0x00, 0xf9, 0xb7, 0x86, 0x00, 0xf8, + 0xf4, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x4b, 0xf1, 0x7d, 0x92, + 0x69, 0x01, 0x40, 0xb2, 0x8c, 0x22, 0x02, 0x91, + 0x0d, 0x40, 0x03, 0x91, 0xee, 0x03, 0x0b, 0xaa, + 0x80, 0x85, 0x7e, 0xad, 0x82, 0x8d, 0x7f, 0xad, + 0xa0, 0x85, 0x3e, 0xad, 0xa2, 0x8d, 0x3f, 0xad, + 0x8c, 0x01, 0x01, 0x91, 0xad, 0x01, 0x01, 0x91, + 0xce, 0x21, 0x00, 0xf1, 0x21, 0xff, 0xff, 0x54, + 0x5f, 0x01, 0x0b, 0xeb, 0x80, 0xfb, 0xff, 0x54, + 0xd1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x10, 0x54, state); + patch_aarch64_trampoline(code + 0xf4, 0x53, state); + patch_aarch64_26r(code + 0x110, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x118, state->instruction_starts[instruction->error_target]); +} + +void +emit__RETURN_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_VALUE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: aa1403e1 mov x1, x20 + // c: f85f8eb3 ldr x19, [x21, #-0x8]! + // 10: f9002295 str x21, [x20, #0x40] + // 14: b9402ec8 ldr w8, [x22, #0x2c] + // 18: 11000508 add w8, w8, #0x1 + // 1c: b9002ec8 str w8, [x22, #0x2c] + // 20: f9400694 ldr x20, [x20, #0x8] + // 24: f90026d4 str x20, [x22, #0x48] + // 28: aa1603e0 mov x0, x22 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __PyEval_FrameClearAndPop + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: f80086b3 str x19, [x21], #0x8 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe1, 0x03, 0x14, 0xaa, 0xb3, 0x8e, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xc8, 0x2e, 0x40, 0xb9, + 0x08, 0x05, 0x00, 0x11, 0xc8, 0x2e, 0x00, 0xb9, + 0x94, 0x06, 0x40, 0xf9, 0xd4, 0x26, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xb3, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x2c, 0x29, state); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SAVE_RETURN_OFFSET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SAVE_RETURN_OFFSET.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: 79009288 strh w8, [x20, #0x48] + // c: 14000000 b 0xc + // 000000000000000c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[16] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x92, 0x00, 0x79, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SEND_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SEND_GEN_FRAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 9000000a adrp x10, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyGen_Type + // c: f940014a ldr x10, [x10] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyGen_Type + // 10: eb0a013f cmp x9, x10 + // 14: 9000000a adrp x10, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 _PyCoro_Type + // 18: f940014a ldr x10, [x10] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyCoro_Type + // 1c: fa4a1124 ccmp x9, x10, #0x4, ne + // 20: 54000061 b.ne 0x2c + // 24: 39c10d09 ldrsb w9, [x8, #0x43] + // 28: 37f80049 tbnz w9, #0x1f, 0x30 + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 30: f85f82a9 ldur x9, [x21, #-0x8] + // 34: 9101210a add x10, x8, #0x48 + // 38: f940450b ldr x11, [x8, #0x88] + // 3c: f9000169 str x9, [x11] + // 40: f9404509 ldr x9, [x8, #0x88] + // 44: 91002129 add x9, x9, #0x8 + // 48: f9004509 str x9, [x8, #0x88] + // 4c: 39010d1f strb wzr, [x8, #0x43] + // 50: f9403ec9 ldr x9, [x22, #0x78] + // 54: 9100a10b add x11, x8, #0x28 + // 58: f9001909 str x9, [x8, #0x30] + // 5c: f9003ecb str x11, [x22, #0x78] + // 60: 90000009 adrp x9, 0x0 + // 0000000000000060: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 64: f9400129 ldr x9, [x9] + // 0000000000000064: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 68: 11000929 add w9, w9, #0x2 + // 6c: 79009289 strh w9, [x20, #0x48] + // 70: f9002914 str x20, [x8, #0x50] + // 74: f81f82aa stur x10, [x21, #-0x8] + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x24, 0x11, 0x4a, 0xfa, + 0x61, 0x00, 0x00, 0x54, 0x09, 0x0d, 0xc1, 0x39, + 0x49, 0x00, 0xf8, 0x37, 0x00, 0x00, 0x00, 0x14, + 0xa9, 0x82, 0x5f, 0xf8, 0x0a, 0x21, 0x01, 0x91, + 0x0b, 0x45, 0x40, 0xf9, 0x69, 0x01, 0x00, 0xf9, + 0x09, 0x45, 0x40, 0xf9, 0x29, 0x21, 0x00, 0x91, + 0x09, 0x45, 0x00, 0xf9, 0x1f, 0x0d, 0x01, 0x39, + 0xc9, 0x3e, 0x40, 0xf9, 0x0b, 0xa1, 0x00, 0x91, + 0x09, 0x19, 0x00, 0xf9, 0xcb, 0x3e, 0x00, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x29, 0x09, 0x00, 0x11, 0x89, 0x92, 0x00, 0x79, + 0x14, 0x29, 0x00, 0xf9, 0xaa, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCoro_Type+0x0 + // 10: &PyGen_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x10, (uintptr_t)&PyGen_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x2c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x60, (uintptr_t)data); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SETUP_ANNOTATIONS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SETUP_ANNOTATIONS.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f9401680 ldr x0, [x20, #0x28] + // 10: f9002295 str x21, [x20, #0x40] + // 14: b4000300 cbz x0, 0x74 + // 18: 90000013 adrp x19, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 1c: f9400273 ldr x19, [x19] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 20: 5291cc08 mov w8, #0x8e60 ; =36448 + // 24: 8b080261 add x1, x19, x8 + // 28: 910023e2 add x2, sp, #0x8 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 _PyMapping_GetOptionalItem + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: 37f80300 tbnz w0, #0x1f, 0x98 + // 3c: f94007e0 ldr x0, [sp, #0x8] + // 40: f9002295 str x21, [x20, #0x40] + // 44: b4000300 cbz x0, 0xa4 + // 48: b9400008 ldr w8, [x0] + // 4c: 37f800a8 tbnz w8, #0x1f, 0x60 + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000008 str w8, [x0] + // 58: 54000041 b.ne 0x60 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 60: f9402295 ldr x21, [x20, #0x40] + // 64: f900229f str xzr, [x20, #0x40] + // 68: a9417bfd ldp x29, x30, [sp, #0x10] + // 6c: 910083ff add sp, sp, #0x20 + // 70: 14000000 b 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 74: 90000008 adrp x8, 0x0 + // 0000000000000074: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_SystemError + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_SystemError + // 7c: f9400101 ldr x1, [x8] + // 80: 90000002 adrp x2, 0x0 + // 0000000000000080: ARM64_RELOC_PAGE21 l_.str + // 84: 91000042 add x2, x2, #0x0 + // 0000000000000084: ARM64_RELOC_PAGEOFF12 l_.str + // 88: aa1603e0 mov x0, x22 + // 8c: 94000000 bl 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __PyErr_Format + // 90: f9402295 ldr x21, [x20, #0x40] + // 94: f900229f str xzr, [x20, #0x40] + // 98: a9417bfd ldp x29, x30, [sp, #0x10] + // 9c: 910083ff add sp, sp, #0x20 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // a4: 94000000 bl 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 _PyDict_New + // a8: f90007e0 str x0, [sp, #0x8] + // ac: f9402295 ldr x21, [x20, #0x40] + // b0: f900229f str xzr, [x20, #0x40] + // b4: b4ffff20 cbz x0, 0x98 + // b8: aa0003e2 mov x2, x0 + // bc: f9002295 str x21, [x20, #0x40] + // c0: f9401680 ldr x0, [x20, #0x28] + // c4: 5291cc08 mov w8, #0x8e60 ; =36448 + // c8: 8b080261 add x1, x19, x8 + // cc: 94000000 bl 0xcc + // 00000000000000cc: ARM64_RELOC_BRANCH26 _PyObject_SetItem + // d0: f94007e8 ldr x8, [sp, #0x8] + // d4: b9400109 ldr w9, [x8] + // d8: 37f80109 tbnz w9, #0x1f, 0xf8 + // dc: 71000529 subs w9, w9, #0x1 + // e0: b9000109 str w9, [x8] + // e4: 540000a1 b.ne 0xf8 + // e8: aa0003f3 mov x19, x0 + // ec: aa0803e0 mov x0, x8 + // f0: 94000000 bl 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // f4: aa1303e0 mov x0, x19 + // f8: f9402295 ldr x21, [x20, #0x40] + // fc: f900229f str xzr, [x20, #0x40] + // 100: 35fffcc0 cbnz w0, 0x98 + // 104: 17ffffd9 b 0x68 + const unsigned char code_body[264] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x80, 0x16, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x03, 0x00, 0xb4, + 0x13, 0x00, 0x00, 0x90, 0x73, 0x02, 0x40, 0xf9, + 0x08, 0xcc, 0x91, 0x52, 0x61, 0x02, 0x08, 0x8b, + 0xe2, 0x23, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x03, 0xf8, 0x37, 0xe0, 0x07, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x03, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x07, 0x00, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0xff, 0xff, 0xb4, + 0xe2, 0x03, 0x00, 0xaa, 0x95, 0x22, 0x00, 0xf9, + 0x80, 0x16, 0x40, 0xf9, 0x08, 0xcc, 0x91, 0x52, + 0x61, 0x02, 0x08, 0x8b, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x07, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x09, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0xf3, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xc0, 0xfc, 0xff, 0x35, 0xd9, 0xff, 0xff, 0x17, + }; + // 0: 'no locals found when setting up annotations\x00' + // 2c: 00 00 00 00 + // 30: &PyExc_SystemError+0x0 + // 38: &_PyRuntime+0x0 + const unsigned char data_body[64] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x38, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x38); + patch_aarch64_trampoline(code + 0x2c, 0x47, state); + patch_aarch64_trampoline(code + 0x5c, 0x0, state); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x74, (uintptr_t)data + 0x30); + patch_aarch64_21r(code + 0x80, (uintptr_t)data); + patch_aarch64_12(code + 0x84, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x8c, 0x30, state); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xa4, 0x56, state); + patch_aarch64_trampoline(code + 0xcc, 0x55, state); + patch_aarch64_trampoline(code + 0xf0, 0x0, state); +} + +void +emit__SET_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_ADD.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 2a2803e8 mvn w8, w8 + // 14: f85f82b3 ldur x19, [x21, #-0x8] + // 18: 531d7108 lsl w8, w8, #3 + // 1c: b26db108 orr x8, x8, #0xfffffffffff80000 + // 20: f8686aa0 ldr x0, [x21, x8] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1303e1 mov x1, x19 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 _PySet_Add + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: b9400268 ldr w8, [x19] + // 3c: 37f80088 tbnz w8, #0x1f, 0x4c + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000268 str w8, [x19] + // 48: 540000a0 b.eq 0x5c + // 4c: d10022b5 sub x21, x21, #0x8 + // 50: 34000120 cbz w0, 0x74 + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 5c: aa0003f7 mov x23, x0 + // 60: aa1303e0 mov x0, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: aa1703e0 mov x0, x23 + // 6c: d10022b5 sub x21, x21, #0x8 + // 70: 35ffff20 cbnz w0, 0x54 + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x28, 0x2a, 0xb3, 0x82, 0x5f, 0xf8, + 0x08, 0x71, 0x1d, 0x53, 0x08, 0xb1, 0x6d, 0xb2, + 0xa0, 0x6a, 0x68, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0x20, 0x01, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0xb5, 0x22, 0x00, 0xd1, + 0x20, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x2c, 0xf, state); + patch_aarch64_26r(code + 0x58, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SET_FUNCTION_ATTRIBUTE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_FUNCTION_ATTRIBUTE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // c: f85f82aa ldur x10, [x21, #-0x8] + // 10: 92403d29 and x9, x9, #0xffff + // 14: 9000000b adrp x11, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FunctionAttributeOffsets + // 18: f940016b ldr x11, [x11] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FunctionAttributeOffsets + // 1c: f8697969 ldr x9, [x11, x9, lsl #3] + // 20: f829690a str x10, [x8, x9] + // 24: f81f82a8 stur x8, [x21, #-0x8] + // 28: 14000000 b 0x28 + // 0000000000000028: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0xaa, 0x82, 0x5f, 0xf8, + 0x29, 0x3d, 0x40, 0x92, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x69, 0x79, 0x69, 0xf8, + 0x0a, 0x69, 0x29, 0xf8, 0xa8, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FunctionAttributeOffsets+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FunctionAttributeOffsets); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_IP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 8: f9001e88 str x8, [x20, #0x38] + // c: 14000000 b 0xc + // 000000000000000c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[16] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x1e, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SET_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_UPDATE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: 2a2803e8 mvn w8, w8 + // 14: f85f82b3 ldur x19, [x21, #-0x8] + // 18: 531d7108 lsl w8, w8, #3 + // 1c: b26db108 orr x8, x8, #0xfffffffffff80000 + // 20: f8686aa0 ldr x0, [x21, x8] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1303e1 mov x1, x19 + // 2c: 94000000 bl 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __PySet_Update + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: b9400268 ldr w8, [x19] + // 3c: 37f80088 tbnz w8, #0x1f, 0x4c + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000268 str w8, [x19] + // 48: 540000a0 b.eq 0x5c + // 4c: d10022b5 sub x21, x21, #0x8 + // 50: 37f80120 tbnz w0, #0x1f, 0x74 + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 5c: aa0003f7 mov x23, x0 + // 60: aa1303e0 mov x0, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: aa1703e0 mov x0, x23 + // 6c: d10022b5 sub x21, x21, #0x8 + // 70: 36ffff20 tbz w0, #0x1f, 0x54 + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x28, 0x2a, 0xb3, 0x82, 0x5f, 0xf8, + 0x08, 0x71, 0x1d, 0x53, 0x08, 0xb1, 0x6d, 0xb2, + 0xa0, 0x6a, 0x68, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0x20, 0x01, 0xf8, 0x37, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0xb5, 0x22, 0x00, 0xd1, + 0x20, 0xff, 0xff, 0x36, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x2c, 0x57, state); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x78, state->instruction_starts[instruction->error_target]); +} + +void +emit__START_EXECUTOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _START_EXECUTOR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9002295 str x21, [x20, #0x40] + // 4: f9408ac0 ldr x0, [x22, #0x110] + // 8: b40000e0 cbz x0, 0x24 + // c: f9008adf str xzr, [x22, #0x110] + // 10: b9400008 ldr w8, [x0] + // 14: 37f80088 tbnz w8, #0x1f, 0x24 + // 18: 71000508 subs w8, w8, #0x1 + // 1c: b9000008 str w8, [x0] + // 20: 54000080 b.eq 0x30 + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: 14000000 b 0x2c + // 000000000000002c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 910003fd mov x29, sp + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: f9402295 ldr x21, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: 14000000 b 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0x95, 0x22, 0x00, 0xf9, 0xc0, 0x8a, 0x40, 0xf9, + 0xe0, 0x00, 0x00, 0xb4, 0xdf, 0x8a, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x38, 0x0, state); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d01 ldr x1, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1303e0 mov x0, x19 + // 2c: aa1703e2 mov x2, x23 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 _PyObject_SetAttr + // 34: aa0003f8 mov x24, x0 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b94002e8 ldr w8, [x23] + // 44: 37f800c8 tbnz w8, #0x1f, 0x5c + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b90002e8 str w8, [x23] + // 50: 54000061 b.ne 0x5c + // 54: aa1703e0 mov x0, x23 + // 58: 94000000 bl 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 5c: b9400268 ldr w8, [x19] + // 60: 37f80088 tbnz w8, #0x1f, 0x70 + // 64: 71000508 subs w8, w8, #0x1 + // 68: b9000268 str w8, [x19] + // 6c: 540000a0 b.eq 0x80 + // 70: d10042b5 sub x21, x21, #0x10 + // 74: 340000f8 cbz w24, 0x90 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 80: aa1303e0 mov x0, x19 + // 84: 94000000 bl 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 88: d10042b5 sub x21, x21, #0x10 + // 8c: 35ffff78 cbnz w24, 0x78 + // 90: a8c17bfd ldp x29, x30, [sp], #0x10 + // 94: 14000000 b 0x94 + // 0000000000000094: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x01, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe2, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf8, 0x03, 0x00, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x42, 0x00, 0xd1, 0xf8, 0x00, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x42, 0x00, 0xd1, 0x78, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x30, 0x58, state); + patch_aarch64_trampoline(code + 0x58, 0x0, state); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x84, 0x0, state); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_INSTANCE_VALUE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9ff02a9 ldp x9, x0, [x21, #-0x10]! + // 4: 90000008 adrp x8, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // c: 8b282008 add x8, x0, w8, uxth + // 10: f9400113 ldr x19, [x8] + // 14: f9000109 str x9, [x8] + // 18: b50001b3 cbnz x19, 0x4c + // 1c: f9400409 ldr x9, [x0, #0x8] + // 20: f9401129 ldr x9, [x9, #0x20] + // 24: 8b090009 add x9, x0, x9 + // 28: 9100212a add x10, x9, #0x8 + // 2c: 4b0a0108 sub w8, w8, w10 + // 30: 53037d08 lsr w8, w8, #3 + // 34: 3940052b ldrb w11, [x9, #0x1] + // 38: 3940012c ldrb w12, [x9] + // 3c: 8b0c0d4a add x10, x10, x12, lsl #3 + // 40: 382b6948 strb w8, [x10, x11] + // 44: 11000568 add w8, w11, #0x1 + // 48: 39000528 strb w8, [x9, #0x1] + // 4c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 50: 910003fd mov x29, sp + // 54: f9002295 str x21, [x20, #0x40] + // 58: b9400008 ldr w8, [x0] + // 5c: 37f800a8 tbnz w8, #0x1f, 0x70 + // 60: 71000508 subs w8, w8, #0x1 + // 64: b9000008 str w8, [x0] + // 68: 54000041 b.ne 0x70 + // 6c: 94000000 bl 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 70: b40000d3 cbz x19, 0x88 + // 74: b9400268 ldr w8, [x19] + // 78: 37f80088 tbnz w8, #0x1f, 0x88 + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000268 str w8, [x19] + // 84: 540000a0 b.eq 0x98 + // 88: f9402295 ldr x21, [x20, #0x40] + // 8c: f900229f str xzr, [x20, #0x40] + // 90: a8c17bfd ldp x29, x30, [sp], #0x10 + // 94: 14000000 b 0x94 + // 0000000000000094: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 98: aa1303e0 mov x0, x19 + // 9c: 94000000 bl 0x9c + // 000000000000009c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // a0: f9402295 ldr x21, [x20, #0x40] + // a4: f900229f str xzr, [x20, #0x40] + // a8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[176] = { + 0xa9, 0x02, 0xff, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x20, 0x28, 0x8b, + 0x13, 0x01, 0x40, 0xf9, 0x09, 0x01, 0x00, 0xf9, + 0xb3, 0x01, 0x00, 0xb5, 0x09, 0x04, 0x40, 0xf9, + 0x29, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x09, 0x8b, + 0x2a, 0x21, 0x00, 0x91, 0x08, 0x01, 0x0a, 0x4b, + 0x08, 0x7d, 0x03, 0x53, 0x2b, 0x05, 0x40, 0x39, + 0x2c, 0x01, 0x40, 0x39, 0x4a, 0x0d, 0x0c, 0x8b, + 0x48, 0x69, 0x2b, 0x38, 0x68, 0x05, 0x00, 0x11, + 0x28, 0x05, 0x00, 0x39, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xa8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0xd3, 0x00, 0x00, 0xb4, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x6c, 0x0, state); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x9c, 0x0, state); + patch_aarch64_26r(code + 0xac, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_SLOT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a9ff02a8 ldp x8, x0, [x21, #-0x10]! + // c: 90000009 adrp x9, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: 92403d29 and x9, x9, #0xffff + // 18: f8696813 ldr x19, [x0, x9] + // 1c: f8296808 str x8, [x0, x9] + // 20: f9002295 str x21, [x20, #0x40] + // 24: b9400008 ldr w8, [x0] + // 28: 37f800a8 tbnz w8, #0x1f, 0x3c + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000008 str w8, [x0] + // 34: 54000041 b.ne 0x3c + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 3c: b40000d3 cbz x19, 0x54 + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a0 b.eq 0x64 + // 54: f9402295 ldr x21, [x20, #0x40] + // 58: f900229f str xzr, [x20, #0x40] + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: aa1303e0 mov x0, x19 + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa8, 0x02, 0xff, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x29, 0x3d, 0x40, 0x92, + 0x13, 0x68, 0x69, 0xf8, 0x08, 0x68, 0x29, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0xa8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x94, 0xd3, 0x00, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x38, 0x0, state); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x68, 0x0, state); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_WITH_HINT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82b3 ldur x19, [x21, #-0x8] + // 4: f85e8262 ldur x2, [x19, #-0x18] + // 8: b4000302 cbz x2, 0x68 + // c: 90000008 adrp x8, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPERAND0 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPERAND0 + // 14: 92403d08 and x8, x8, #0xffff + // 18: f9401049 ldr x9, [x2, #0x20] + // 1c: f9400d2a ldr x10, [x9, #0x18] + // 20: eb08015f cmp x10, x8 + // 24: 54000229 b.ls 0x68 + // 28: 3940292a ldrb w10, [x9, #0xa] + // 2c: 340001ea cbz w10, 0x68 + // 30: f940028a ldr x10, [x20] + // 34: f940114a ldr x10, [x10, #0x20] + // 38: 9000000b adrp x11, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 3c: f940016b ldr x11, [x11] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 40: 8b2b2d4a add x10, x10, w11, uxth #3 + // 44: f9400d43 ldr x3, [x10, #0x18] + // 48: 3940252a ldrb w10, [x9, #0x9] + // 4c: 5280002b mov w11, #0x1 ; =1 + // 50: 9aca216a lsl x10, x11, x10 + // 54: 8b0a0129 add x9, x9, x10 + // 58: 8b081139 add x25, x9, x8, lsl #4 + // 5c: f8420f28 ldr x8, [x25, #0x20]! + // 60: eb03011f cmp x8, x3 + // 64: 54000040 b.eq 0x6c + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 6c: f9400737 ldr x23, [x25, #0x8] + // 70: b4ffffd7 cbz x23, 0x68 + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 910003fd mov x29, sp + // 7c: f85f02b8 ldur x24, [x21, #-0x10] + // 80: f9002295 str x21, [x20, #0x40] + // 84: 39406040 ldrb w0, [x2, #0x18] + // 88: 340000a0 cbz w0, 0x9c + // 8c: 52800021 mov w1, #0x1 ; =1 + // 90: aa1803e4 mov x4, x24 + // 94: 94000000 bl 0x94 + // 0000000000000094: ARM64_RELOC_BRANCH26 __PyDict_SendEvent + // 98: f9402295 ldr x21, [x20, #0x40] + // 9c: f9000738 str x24, [x25, #0x8] + // a0: d10042a8 sub x8, x21, #0x10 + // a4: f9002288 str x8, [x20, #0x40] + // a8: b9400268 ldr w8, [x19] + // ac: 37f800c8 tbnz w8, #0x1f, 0xc4 + // b0: 71000508 subs w8, w8, #0x1 + // b4: b9000268 str w8, [x19] + // b8: 54000061 b.ne 0xc4 + // bc: aa1303e0 mov x0, x19 + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c4: b94002e8 ldr w8, [x23] + // c8: 37f800c8 tbnz w8, #0x1f, 0xe0 + // cc: 71000508 subs w8, w8, #0x1 + // d0: b90002e8 str w8, [x23] + // d4: 54000061 b.ne 0xe0 + // d8: aa1703e0 mov x0, x23 + // dc: 94000000 bl 0xdc + // 00000000000000dc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e0: f9402295 ldr x21, [x20, #0x40] + // e4: f900229f str xzr, [x20, #0x40] + // e8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ec: 14000000 b 0xec + // 00000000000000ec: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[240] = { + 0xb3, 0x82, 0x5f, 0xf8, 0x62, 0x82, 0x5e, 0xf8, + 0x02, 0x03, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x3d, 0x40, 0x92, + 0x49, 0x10, 0x40, 0xf9, 0x2a, 0x0d, 0x40, 0xf9, + 0x5f, 0x01, 0x08, 0xeb, 0x29, 0x02, 0x00, 0x54, + 0x2a, 0x29, 0x40, 0x39, 0xea, 0x01, 0x00, 0x34, + 0x8a, 0x02, 0x40, 0xf9, 0x4a, 0x11, 0x40, 0xf9, + 0x0b, 0x00, 0x00, 0x90, 0x6b, 0x01, 0x40, 0xf9, + 0x4a, 0x2d, 0x2b, 0x8b, 0x43, 0x0d, 0x40, 0xf9, + 0x2a, 0x25, 0x40, 0x39, 0x2b, 0x00, 0x80, 0x52, + 0x6a, 0x21, 0xca, 0x9a, 0x29, 0x01, 0x0a, 0x8b, + 0x39, 0x11, 0x08, 0x8b, 0x28, 0x0f, 0x42, 0xf8, + 0x1f, 0x01, 0x03, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x37, 0x07, 0x40, 0xf9, + 0xd7, 0xff, 0xff, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xb8, 0x02, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x40, 0x60, 0x40, 0x39, + 0xa0, 0x00, 0x00, 0x34, 0x21, 0x00, 0x80, 0x52, + 0xe4, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x38, 0x07, 0x00, 0xf9, + 0xa8, 0x42, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x94, 0x59, state); + patch_aarch64_trampoline(code + 0xc0, 0x0, state); + patch_aarch64_trampoline(code + 0xdc, 0x0, state); + patch_aarch64_26r(code + 0xec, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_DEREF.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: f85f82a9 ldur x9, [x21, #-0x8] + // c: 8b282e88 add x8, x20, w8, uxth #3 + // 10: f9402908 ldr x8, [x8, #0x50] + // 14: f9002295 str x21, [x20, #0x40] + // 18: f9400900 ldr x0, [x8, #0x10] + // 1c: f9000909 str x9, [x8, #0x10] + // 20: b40000c0 cbz x0, 0x38 + // 24: b9400008 ldr w8, [x0] + // 28: 37f80088 tbnz w8, #0x1f, 0x38 + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000008 str w8, [x0] + // 34: 540000a0 b.eq 0x48 + // 38: f9402288 ldr x8, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: d1002115 sub x21, x8, #0x8 + // 44: 14000000 b 0x44 + // 0000000000000044: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 48: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4c: 910003fd mov x29, sp + // 50: 94000000 bl 0x50 + // 0000000000000050: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: f9402288 ldr x8, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: d1002115 sub x21, x8, #0x8 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[104] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa9, 0x82, 0x5f, 0xf8, 0x88, 0x2e, 0x28, 0x8b, + 0x08, 0x29, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x09, 0x40, 0xf9, 0x09, 0x09, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x21, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x21, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x50, 0x0, state); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // c: 8b292e89 add x9, x20, w9, uxth #3 + // 10: f9402920 ldr x0, [x9, #0x50] + // 14: f9002928 str x8, [x9, #0x50] + // 18: f9002295 str x21, [x20, #0x40] + // 1c: b40000c0 cbz x0, 0x34 + // 20: b9400008 ldr w8, [x0] + // 24: 37f80088 tbnz w8, #0x1f, 0x34 + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000008 str w8, [x0] + // 30: 54000080 b.eq 0x40 + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: 14000000 b 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 40: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 44: 910003fd mov x29, sp + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: f9402295 ldr x21, [x20, #0x40] + // 54: f900229f str xzr, [x20, #0x40] + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 5c: 00 00 00 00 + const unsigned char code_body[96] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x89, 0x2e, 0x29, 0x8b, + 0x20, 0x29, 0x40, 0xf9, 0x28, 0x29, 0x00, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x48, 0x0, state); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_0.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9402a80 ldr x0, [x20, #0x50] + // 8: f9002a88 str x8, [x20, #0x50] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x2a, 0x40, 0xf9, + 0x88, 0x2a, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_1.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9402e80 ldr x0, [x20, #0x58] + // 8: f9002e88 str x8, [x20, #0x58] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x2e, 0x40, 0xf9, + 0x88, 0x2e, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_2.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403280 ldr x0, [x20, #0x60] + // 8: f9003288 str x8, [x20, #0x60] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x32, 0x40, 0xf9, + 0x88, 0x32, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_3.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403680 ldr x0, [x20, #0x68] + // 8: f9003688 str x8, [x20, #0x68] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x36, 0x40, 0xf9, + 0x88, 0x36, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_4.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403a80 ldr x0, [x20, #0x70] + // 8: f9003a88 str x8, [x20, #0x70] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x3a, 0x40, 0xf9, + 0x88, 0x3a, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_5.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403e80 ldr x0, [x20, #0x78] + // 8: f9003e88 str x8, [x20, #0x78] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x3e, 0x40, 0xf9, + 0x88, 0x3e, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_6.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9404280 ldr x0, [x20, #0x80] + // 8: f9004288 str x8, [x20, #0x80] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x42, 0x40, 0xf9, + 0x88, 0x42, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_7.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9404680 ldr x0, [x20, #0x88] + // 8: f9004688 str x8, [x20, #0x88] + // c: f9002295 str x21, [x20, #0x40] + // 10: b40000c0 cbz x0, 0x28 + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x46, 0x40, 0xf9, + 0x88, 0x46, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_GLOBAL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9400288 ldr x8, [x20] + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: 90000009 adrp x9, 0x0 + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d01 ldr x1, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: f9400e80 ldr x0, [x20, #0x18] + // 2c: aa1303e2 mov x2, x19 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 _PyDict_SetItem + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: b9400268 ldr w8, [x19] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000268 str w8, [x19] + // 4c: 540000a0 b.eq 0x60 + // 50: d10022b5 sub x21, x21, #0x8 + // 54: 34000120 cbz w0, 0x78 + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 60: aa0003f7 mov x23, x0 + // 64: aa1303e0 mov x0, x19 + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 6c: aa1703e0 mov x0, x23 + // 70: d10022b5 sub x21, x21, #0x8 + // 74: 35ffff20 cbnz w0, 0x58 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x88, 0x02, 0x40, 0xf9, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x01, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x80, 0x0e, 0x40, 0xf9, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0x20, 0x01, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x17, 0xaa, + 0xb5, 0x22, 0x00, 0xd1, 0x20, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x30, 0x5a, state); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x68, 0x0, state); + patch_aarch64_26r(code + 0x7c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_NAME.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 910043fd add x29, sp, #0x10 + // c: f85f82b3 ldur x19, [x21, #-0x8] + // 10: f9400288 ldr x8, [x20] + // 14: f9401108 ldr x8, [x8, #0x20] + // 18: 90000009 adrp x9, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 20: 8b292d08 add x8, x8, w9, uxth #3 + // 24: f9400d01 ldr x1, [x8, #0x18] + // 28: f9401680 ldr x0, [x20, #0x28] + // 2c: b40001c0 cbz x0, 0x64 + // 30: f9400408 ldr x8, [x0, #0x8] + // 34: 90000009 adrp x9, 0x0 + // 0000000000000034: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // 38: f9400129 ldr x9, [x9] + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 3c: f9002295 str x21, [x20, #0x40] + // 40: aa1303e2 mov x2, x19 + // 44: eb09011f cmp x8, x9 + // 48: 540003c0 b.eq 0xc0 + // 4c: 94000000 bl 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 _PyObject_SetItem + // 50: f9402295 ldr x21, [x20, #0x40] + // 54: f900229f str xzr, [x20, #0x40] + // 58: b9400268 ldr w8, [x19] + // 5c: 36f803c8 tbz w8, #0x1f, 0xd4 + // 60: 14000020 b 0xe0 + // 64: f9002295 str x21, [x20, #0x40] + // 68: 90000008 adrp x8, 0x0 + // 0000000000000068: ARM64_RELOC_GOT_LOAD_PAGE21 _PyExc_SystemError + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyExc_SystemError + // 70: f9400108 ldr x8, [x8] + // 74: f90003e1 str x1, [sp] + // 78: 90000002 adrp x2, 0x0 + // 0000000000000078: ARM64_RELOC_PAGE21 l_.str + // 7c: 91000042 add x2, x2, #0x0 + // 000000000000007c: ARM64_RELOC_PAGEOFF12 l_.str + // 80: aa1603e0 mov x0, x22 + // 84: aa0803e1 mov x1, x8 + // 88: 94000000 bl 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __PyErr_Format + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: b9400268 ldr w8, [x19] + // 98: 37f800c8 tbnz w8, #0x1f, 0xb0 + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000268 str w8, [x19] + // a4: 54000061 b.ne 0xb0 + // a8: aa1303e0 mov x0, x19 + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b0: d10022b5 sub x21, x21, #0x8 + // b4: a9417bfd ldp x29, x30, [sp, #0x10] + // b8: 910083ff add sp, sp, #0x20 + // bc: 14000000 b 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // c0: 94000000 bl 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 _PyDict_SetItem + // c4: f9402295 ldr x21, [x20, #0x40] + // c8: f900229f str xzr, [x20, #0x40] + // cc: b9400268 ldr w8, [x19] + // d0: 37f80088 tbnz w8, #0x1f, 0xe0 + // d4: 71000508 subs w8, w8, #0x1 + // d8: b9000268 str w8, [x19] + // dc: 540000c0 b.eq 0xf4 + // e0: d10022b5 sub x21, x21, #0x8 + // e4: 34000140 cbz w0, 0x10c + // e8: a9417bfd ldp x29, x30, [sp, #0x10] + // ec: 910083ff add sp, sp, #0x20 + // f0: 14000000 b 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // f4: aa0003f7 mov x23, x0 + // f8: aa1303e0 mov x0, x19 + // fc: 94000000 bl 0xfc + // 00000000000000fc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 100: aa1703e0 mov x0, x23 + // 104: d10022b5 sub x21, x21, #0x8 + // 108: 35ffff00 cbnz w0, 0xe8 + // 10c: a9417bfd ldp x29, x30, [sp, #0x10] + // 110: 910083ff add sp, sp, #0x20 + // 114: 14000000 b 0x114 + // 0000000000000114: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[280] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xb3, 0x82, 0x5f, 0xf8, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x01, 0x0d, 0x40, 0xf9, + 0x80, 0x16, 0x40, 0xf9, 0xc0, 0x01, 0x00, 0xb4, + 0x08, 0x04, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe2, 0x03, 0x13, 0xaa, 0x1f, 0x01, 0x09, 0xeb, + 0xc0, 0x03, 0x00, 0x54, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xc8, 0x03, 0xf8, 0x36, + 0x20, 0x00, 0x00, 0x14, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0xe1, 0x03, 0x00, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0x40, 0x01, 0x00, 0x34, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0xb5, 0x22, 0x00, 0xd1, + 0x00, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: 'no locals found when storing %R\x00' + // 20: &PyExc_SystemError+0x0 + // 28: &PyDict_Type+0x0 + // 30: OPARG + const unsigned char data_body[56] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x28, (uintptr_t)&PyDict_Type); + patch_64(data + 0x30, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x30); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x28); + patch_aarch64_trampoline(code + 0x4c, 0x55, state); + patch_aarch64_33rx(code + 0x68, (uintptr_t)data + 0x20); + patch_aarch64_21r(code + 0x78, (uintptr_t)data); + patch_aarch64_12(code + 0x7c, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x88, 0x30, state); + patch_aarch64_trampoline(code + 0xac, 0x0, state); + patch_aarch64_26r(code + 0xbc, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xc0, 0x5a, state); + patch_aarch64_26r(code + 0xf0, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0xfc, 0x0, state); + patch_aarch64_26r(code + 0x114, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SLICE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f06a0 ldp x0, x1, [x21, #-0x10] + // c: a97e4eb8 ldp x24, x19, [x21, #-0x20] + // 10: f9002295 str x21, [x20, #0x40] + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __PyBuildSlice_ConsumeRefs + // 18: aa0003f7 mov x23, x0 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: b40002a0 cbz x0, 0x78 + // 28: d10042a8 sub x8, x21, #0x10 + // 2c: f9002288 str x8, [x20, #0x40] + // 30: aa1303e0 mov x0, x19 + // 34: aa1703e1 mov x1, x23 + // 38: aa1803e2 mov x2, x24 + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 _PyObject_SetItem + // 40: b94002e8 ldr w8, [x23] + // 44: 37f80108 tbnz w8, #0x1f, 0x64 + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b90002e8 str w8, [x23] + // 50: 540000a1 b.ne 0x64 + // 54: aa0003f5 mov x21, x0 + // 58: aa1703e0 mov x0, x23 + // 5c: 94000000 bl 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 60: aa1503e0 mov x0, x21 + // 64: f9402288 ldr x8, [x20, #0x40] + // 68: f900229f str xzr, [x20, #0x40] + // 6c: 91004115 add x21, x8, #0x10 + // 70: 7100001f cmp w0, #0x0 + // 74: 1a9f17f7 cset w23, eq + // 78: b9400308 ldr w8, [x24] + // 7c: 37f800c8 tbnz w8, #0x1f, 0x94 + // 80: 71000508 subs w8, w8, #0x1 + // 84: b9000308 str w8, [x24] + // 88: 54000061 b.ne 0x94 + // 8c: aa1803e0 mov x0, x24 + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: b9400268 ldr w8, [x19] + // 98: 37f80088 tbnz w8, #0x1f, 0xa8 + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000268 str w8, [x19] + // a4: 540000a0 b.eq 0xb8 + // a8: d10082b5 sub x21, x21, #0x20 + // ac: 360000f7 tbz w23, #0x0, 0xc8 + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b8: aa1303e0 mov x0, x19 + // bc: 94000000 bl 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c0: d10082b5 sub x21, x21, #0x20 + // c4: 3707ff77 tbnz w23, #0x0, 0xb0 + // c8: a8c17bfd ldp x29, x30, [sp], #0x10 + // cc: 14000000 b 0xcc + // 00000000000000cc: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[208] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa0, 0x06, 0x7f, 0xa9, 0xb8, 0x4e, 0x7e, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x02, 0x00, 0xb4, + 0xa8, 0x42, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0xe2, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x41, 0x00, 0x91, + 0x1f, 0x00, 0x00, 0x71, 0xf7, 0x17, 0x9f, 0x1a, + 0x08, 0x03, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x82, 0x00, 0xd1, 0xf7, 0x00, 0x00, 0x36, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xb5, 0x82, 0x00, 0xd1, 0x77, 0xff, 0x07, 0x37, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0xc, state); + patch_aarch64_trampoline(code + 0x3c, 0x55, state); + patch_aarch64_trampoline(code + 0x5c, 0x0, state); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xbc, 0x0, state); + patch_aarch64_26r(code + 0xcc, state->instruction_starts[instruction->error_target]); +} + +void +emit__STORE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // c: f85e82b8 ldur x24, [x21, #-0x18] + // 10: f9002295 str x21, [x20, #0x40] + // 14: aa1703e0 mov x0, x23 + // 18: aa1303e1 mov x1, x19 + // 1c: aa1803e2 mov x2, x24 + // 20: 94000000 bl 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 _PyObject_SetItem + // 24: aa0003f9 mov x25, x0 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: b9400308 ldr w8, [x24] + // 34: 37f800c8 tbnz w8, #0x1f, 0x4c + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b9000308 str w8, [x24] + // 40: 54000061 b.ne 0x4c + // 44: aa1803e0 mov x0, x24 + // 48: 94000000 bl 0x48 + // 0000000000000048: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 4c: b94002e8 ldr w8, [x23] + // 50: 37f800c8 tbnz w8, #0x1f, 0x68 + // 54: 71000508 subs w8, w8, #0x1 + // 58: b90002e8 str w8, [x23] + // 5c: 54000061 b.ne 0x68 + // 60: aa1703e0 mov x0, x23 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: b9400268 ldr w8, [x19] + // 6c: 37f80088 tbnz w8, #0x1f, 0x7c + // 70: 71000508 subs w8, w8, #0x1 + // 74: b9000268 str w8, [x19] + // 78: 540000a0 b.eq 0x8c + // 7c: d10062b5 sub x21, x21, #0x18 + // 80: 340000f9 cbz w25, 0x9c + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 8c: aa1303e0 mov x0, x19 + // 90: 94000000 bl 0x90 + // 0000000000000090: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 94: d10062b5 sub x21, x21, #0x18 + // 98: 35ffff79 cbnz w25, 0x84 + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 + // 00000000000000a0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb7, 0x4e, 0x7f, 0xa9, 0xb8, 0x82, 0x5e, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0xe2, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xf9, 0x03, 0x00, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x08, 0x03, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe8, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x62, 0x00, 0xd1, + 0xf9, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xb5, 0x62, 0x00, 0xd1, + 0x79, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x20, 0x55, state); + patch_aarch64_trampoline(code + 0x48, 0x0, state); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x90, 0x0, state); + patch_aarch64_26r(code + 0xa0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_DICT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f02b3 ldur x19, [x21, #-0x10] + // 4: f9400668 ldr x8, [x19, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyDict_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyDict_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 20: 910003fd mov x29, sp + // 24: f85e82a2 ldur x2, [x21, #-0x18] + // 28: f85f82a1 ldur x1, [x21, #-0x8] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: aa1303e0 mov x0, x19 + // 34: 94000000 bl 0x34 + // 0000000000000034: ARM64_RELOC_BRANCH26 __PyDict_SetItem_Take2 + // 38: f9402288 ldr x8, [x20, #0x40] + // 3c: d1006108 sub x8, x8, #0x18 + // 40: f9002288 str x8, [x20, #0x40] + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540000c0 b.eq 0x6c + // 58: f9402295 ldr x21, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 34000140 cbz w0, 0x8c + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 6c: aa0003f5 mov x21, x0 + // 70: aa1303e0 mov x0, x19 + // 74: 94000000 bl 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 78: aa1503e0 mov x0, x21 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 35ffff00 cbnz w0, 0x68 + // 8c: 14000000 b 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[144] = { + 0xb3, 0x02, 0x5f, 0xf8, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xa2, 0x82, 0x5e, 0xf8, + 0xa1, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x61, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x40, 0x01, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0xff, 0xff, 0x35, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyDict_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x34, 0x50, state); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->error_target]); + patch_aarch64_trampoline(code + 0x74, 0x0, state); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_LIST_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503f9 mov x25, x21 + // 4: f85e8f28 ldr x8, [x25, #-0x18]! + // 8: f9400b38 ldr x24, [x25, #0x10] + // c: f9400709 ldr x9, [x24, #0x8] + // 10: 9000000a adrp x10, 0x0 + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // 14: f940014a ldr x10, [x10] + // 0000000000000014: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 18: eb0a013f cmp x9, x10 + // 1c: 540006c1 b.ne 0xf4 + // 20: f9400733 ldr x19, [x25, #0x8] + // 24: f9400669 ldr x9, [x19, #0x8] + // 28: 9000000a adrp x10, 0x0 + // 0000000000000028: ARM64_RELOC_GOT_LOAD_PAGE21 _PyList_Type + // 2c: f940014a ldr x10, [x10] + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyList_Type + // 30: eb0a013f cmp x9, x10 + // 34: 54000601 b.ne 0xf4 + // 38: f9400b09 ldr x9, [x24, #0x10] + // 3c: 927df929 and x9, x9, #0xfffffffffffffffb + // 40: f100253f cmp x9, #0x9 + // 44: 54000582 b.hs 0xf4 + // 48: b9401b09 ldr w9, [x24, #0x18] + // 4c: f9400a6a ldr x10, [x19, #0x10] + // 50: eb09015f cmp x10, x9 + // 54: 5400050d b.le 0xf4 + // 58: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 5c: 910003fd mov x29, sp + // 60: f9400e6a ldr x10, [x19, #0x18] + // 64: f8697957 ldr x23, [x10, x9, lsl #3] + // 68: f8297948 str x8, [x10, x9, lsl #3] + // 6c: b9400308 ldr w8, [x24] + // 70: 37f801c8 tbnz w8, #0x1f, 0xa8 + // 74: 71000508 subs w8, w8, #0x1 + // 78: b9000308 str w8, [x24] + // 7c: 54000161 b.ne 0xa8 + // 80: 90000009 adrp x9, 0x0 + // 0000000000000080: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 84: f9400129 ldr x9, [x9] + // 0000000000000084: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 88: f9532128 ldr x8, [x9, #0x2640] + // 8c: b40000a8 cbz x8, 0xa0 + // 90: f9532522 ldr x2, [x9, #0x2648] + // 94: aa1803e0 mov x0, x24 + // 98: 52800021 mov w1, #0x1 ; =1 + // 9c: d63f0100 blr x8 + // a0: aa1803e0 mov x0, x24 + // a4: 94000000 bl 0xa4 + // 00000000000000a4: ARM64_RELOC_BRANCH26 __PyLong_ExactDealloc + // a8: f9002299 str x25, [x20, #0x40] + // ac: b9400268 ldr w8, [x19] + // b0: 37f800c8 tbnz w8, #0x1f, 0xc8 + // b4: 71000508 subs w8, w8, #0x1 + // b8: b9000268 str w8, [x19] + // bc: 54000061 b.ne 0xc8 + // c0: aa1303e0 mov x0, x19 + // c4: 94000000 bl 0xc4 + // 00000000000000c4: ARM64_RELOC_BRANCH26 __Py_Dealloc + // c8: b94002e8 ldr w8, [x23] + // cc: 37f800c8 tbnz w8, #0x1f, 0xe4 + // d0: 71000508 subs w8, w8, #0x1 + // d4: b90002e8 str w8, [x23] + // d8: 54000061 b.ne 0xe4 + // dc: aa1703e0 mov x0, x23 + // e0: 94000000 bl 0xe0 + // 00000000000000e0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // e4: f9402295 ldr x21, [x20, #0x40] + // e8: f900229f str xzr, [x20, #0x40] + // ec: a8c17bfd ldp x29, x30, [sp], #0x10 + // f0: 14000000 b 0xf0 + // 00000000000000f0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // f4: 14000000 b 0xf4 + // 00000000000000f4: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + const unsigned char code_body[248] = { + 0xf9, 0x03, 0x15, 0xaa, 0x28, 0x8f, 0x5e, 0xf8, + 0x38, 0x0b, 0x40, 0xf9, 0x09, 0x07, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0xc1, 0x06, 0x00, 0x54, + 0x33, 0x07, 0x40, 0xf9, 0x69, 0x06, 0x40, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x01, 0x06, 0x00, 0x54, + 0x09, 0x0b, 0x40, 0xf9, 0x29, 0xf9, 0x7d, 0x92, + 0x3f, 0x25, 0x00, 0xf1, 0x82, 0x05, 0x00, 0x54, + 0x09, 0x1b, 0x40, 0xb9, 0x6a, 0x0a, 0x40, 0xf9, + 0x5f, 0x01, 0x09, 0xeb, 0x0d, 0x05, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x6a, 0x0e, 0x40, 0xf9, 0x57, 0x79, 0x69, 0xf8, + 0x48, 0x79, 0x29, 0xf8, 0x08, 0x03, 0x40, 0xb9, + 0xc8, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0x61, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x21, 0x53, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x25, 0x53, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x99, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0xc8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe8, 0x02, 0x40, 0xb9, 0xc8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + // 8: &PyList_Type+0x0 + // 10: &PyLong_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x80, (uintptr_t)data); + patch_aarch64_trampoline(code + 0xa4, 0x2, state); + patch_aarch64_trampoline(code + 0xc4, 0x0, state); + patch_aarch64_trampoline(code + 0xe0, 0x0, state); + patch_aarch64_26r(code + 0xf0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xf4, state->instruction_starts[instruction->jump_target]); +} + +void +emit__SWAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SWAP.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: 90000008 adrp x8, 0x0 + // 0000000000000000: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 8: cb282ea8 sub x8, x21, w8, uxth #3 + // c: f9400109 ldr x9, [x8] + // 10: f85f82aa ldur x10, [x21, #-0x8] + // 14: f900010a str x10, [x8] + // 18: f81f82a9 stur x9, [x21, #-0x8] + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x2e, 0x28, 0xcb, 0x09, 0x01, 0x40, 0xf9, + 0xaa, 0x82, 0x5f, 0xf8, 0x0a, 0x01, 0x00, 0xf9, + 0xa9, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TIER2_RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TIER2_RESUME_CHECK.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f9400ec8 ldr x8, [x22, #0x18] + // 4: f2401d1f tst x8, #0xff + // 8: 54000040 b.eq 0x10 + // c: 14000000 b 0xc + // 000000000000000c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 10: 14000000 b 0x10 + // 0000000000000010: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 14: 00 00 00 00 + const unsigned char code_body[24] = { + 0xc8, 0x0e, 0x40, 0xf9, 0x1f, 0x1d, 0x40, 0xf2, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x10, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1303e0 mov x0, x19 + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 _PyObject_IsTrue + // 18: f9402295 ldr x21, [x20, #0x40] + // 1c: f900229f str xzr, [x20, #0x40] + // 20: b9400268 ldr w8, [x19] + // 24: 37f80088 tbnz w8, #0x1f, 0x34 + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000268 str w8, [x19] + // 30: 54000160 b.eq 0x5c + // 34: 37f801e0 tbnz w0, #0x1f, 0x70 + // 38: 90000008 adrp x8, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 40: 90000009 adrp x9, 0x0 + // 0000000000000040: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 48: 7100001f cmp w0, #0x0 + // 4c: 9a880128 csel x8, x9, x8, eq + // 50: f81f82a8 stur x8, [x21, #-0x8] + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 + // 0000000000000058: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 5c: aa0003f7 mov x23, x0 + // 60: aa1303e0 mov x0, x19 + // 64: 94000000 bl 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 68: aa1703e0 mov x0, x23 + // 6c: 36fffe60 tbz w0, #0x1f, 0x38 + // 70: d10022b5 sub x21, x21, #0x8 + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 7c: 00 00 00 00 + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x01, 0x00, 0x54, 0xe0, 0x01, 0xf8, 0x37, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x00, 0x00, 0x71, 0x28, 0x01, 0x88, 0x9a, + 0xa8, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0x60, 0xfe, 0xff, 0x36, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0x22, state); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x64, 0x0, state); + patch_aarch64_26r(code + 0x78, state->instruction_starts[instruction->error_target]); +} + +void +emit__TO_BOOL_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_BOOL.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400508 ldr x8, [x8, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyBool_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyBool_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x05, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyBool_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyBool_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_INT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: f9400408 ldr x8, [x0, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyLong_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyLong_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: f9400808 ldr x8, [x0, #0x10] + // 20: 92400508 and x8, x8, #0x3 + // 24: f100051f cmp x8, #0x1 + // 28: 540000a1 b.ne 0x3c + // 2c: 90000008 adrp x8, 0x0 + // 000000000000002c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 34: f81f82a8 stur x8, [x21, #-0x8] + // 38: 14000000 b 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 3c: b9400008 ldr w8, [x0] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000008 str w8, [x0] + // 4c: 540000a0 b.eq 0x60 + // 50: 90000008 adrp x8, 0x0 + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 58: f81f82a8 stur x8, [x21, #-0x8] + // 5c: 14000000 b 0x5c + // 000000000000005c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 60: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 64: 910003fd mov x29, sp + // 68: 94000000 bl 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 6c: 90000008 adrp x8, 0x0 + // 000000000000006c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: f81f82a8 stur x8, [x21, #-0x8] + // 7c: 14000000 b 0x7c + // 000000000000007c: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[128] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x08, 0x40, 0xf9, + 0x08, 0x05, 0x40, 0x92, 0x1f, 0x05, 0x00, 0xf1, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xa8, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: &PyLong_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x50, (uintptr_t)data); + patch_aarch64_26r(code + 0x5c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x68, 0x0, state); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data); + patch_aarch64_26r(code + 0x7c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_LIST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: f9400408 ldr x8, [x0, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyList_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyList_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: f9400813 ldr x19, [x0, #0x10] + // 20: b9400008 ldr w8, [x0] + // 24: 37f80108 tbnz w8, #0x1f, 0x44 + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000008 str w8, [x0] + // 30: 540000a1 b.ne 0x44 + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 910003fd mov x29, sp + // 3c: 94000000 bl 0x3c + // 000000000000003c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 90000008 adrp x8, 0x0 + // 0000000000000044: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 48: f9400108 ldr x8, [x8] + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 4c: 90000009 adrp x9, 0x0 + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 50: f9400129 ldr x9, [x9] + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 54: f100027f cmp x19, #0x0 + // 58: 9a880128 csel x8, x9, x8, eq + // 5c: f81f82a8 stur x8, [x21, #-0x8] + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x13, 0x08, 0x40, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x7f, 0x02, 0x00, 0xf1, + 0x28, 0x01, 0x88, 0x9a, 0xa8, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &PyList_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&PyList_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x3c, 0x0, state); + patch_aarch64_33rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_NONE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // c: eb09011f cmp x8, x9 + // 10: 54000040 b.eq 0x18 + // 14: 14000000 b 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 18: 90000008 adrp x8, 0x0 + // 0000000000000018: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 20: f81f82a8 stur x8, [x21, #-0x8] + // 24: 14000000 b 0x24 + // 0000000000000024: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_NoneStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_STR.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: f9400408 ldr x8, [x0, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyUnicode_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyUnicode_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c + // 18: 14000000 b 0x18 + // 0000000000000018: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 1c: 90000008 adrp x8, 0x0 + // 000000000000001c: ARM64_RELOC_GOT_LOAD_PAGE21 __PyRuntime + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __PyRuntime + // 24: 5290fc09 mov w9, #0x87e0 ; =34784 + // 28: 8b090108 add x8, x8, x9 + // 2c: eb08001f cmp x0, x8 + // 30: 54000140 b.eq 0x58 + // 34: b9400008 ldr w8, [x0] + // 38: 37f80088 tbnz w8, #0x1f, 0x48 + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b9000008 str w8, [x0] + // 44: 54000120 b.eq 0x68 + // 48: 90000008 adrp x8, 0x0 + // 0000000000000048: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 50: f81f82a8 stur x8, [x21, #-0x8] + // 54: 14000000 b 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 58: 90000008 adrp x8, 0x0 + // 0000000000000058: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 5c: f9400108 ldr x8, [x8] + // 000000000000005c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // 60: f81f82a8 stur x8, [x21, #-0x8] + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 68: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 6c: 910003fd mov x29, sp + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 74: 90000008 adrp x8, 0x0 + // 0000000000000074: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: f81f82a8 stur x8, [x21, #-0x8] + // 84: 14000000 b 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[136] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0xfc, 0x90, 0x52, + 0x08, 0x01, 0x09, 0x8b, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x20, 0x01, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: &_PyRuntime+0x0 + // 18: &PyUnicode_Type+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x70, 0x0, state); + patch_aarch64_33rx(code + 0x74, (uintptr_t)data); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__UNARY_INVERT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_INVERT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1303e0 mov x0, x19 + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 _PyNumber_Invert + // 18: f9402295 ldr x21, [x20, #0x40] + // 1c: f900229f str xzr, [x20, #0x40] + // 20: b9400268 ldr w8, [x19] + // 24: 37f80088 tbnz w8, #0x1f, 0x34 + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000268 str w8, [x19] + // 30: 540000a0 b.eq 0x44 + // 34: b4000120 cbz x0, 0x58 + // 38: f81f82a0 stur x0, [x21, #-0x8] + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: aa0003f7 mov x23, x0 + // 48: aa1303e0 mov x0, x19 + // 4c: 94000000 bl 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 50: aa1703e0 mov x0, x23 + // 54: b5ffff37 cbnz x23, 0x38 + // 58: d10022b5 sub x21, x21, #0x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x20, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0x37, 0xff, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0x5b, state); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x4c, 0x0, state); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNARY_NEGATIVE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NEGATIVE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: f85f82b3 ldur x19, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1303e0 mov x0, x19 + // 14: 94000000 bl 0x14 + // 0000000000000014: ARM64_RELOC_BRANCH26 _PyNumber_Negative + // 18: f9402295 ldr x21, [x20, #0x40] + // 1c: f900229f str xzr, [x20, #0x40] + // 20: b9400268 ldr w8, [x19] + // 24: 37f80088 tbnz w8, #0x1f, 0x34 + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000268 str w8, [x19] + // 30: 540000a0 b.eq 0x44 + // 34: b4000120 cbz x0, 0x58 + // 38: f81f82a0 stur x0, [x21, #-0x8] + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 44: aa0003f7 mov x23, x0 + // 48: aa1303e0 mov x0, x19 + // 4c: 94000000 bl 0x4c + // 000000000000004c: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 50: aa1703e0 mov x0, x23 + // 54: b5ffff37 cbnz x23, 0x38 + // 58: d10022b5 sub x21, x21, #0x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 + // 0000000000000060: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x20, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x17, 0xaa, 0x37, 0xff, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x14, 0x5c, state); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x4c, 0x0, state); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNARY_NOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NOT.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_FalseStruct + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_FalseStruct + // c: 9000000a adrp x10, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_TrueStruct + // 10: f940014a ldr x10, [x10] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_TrueStruct + // 14: eb09011f cmp x8, x9 + // 18: 9a890148 csel x8, x10, x9, eq + // 1c: f81f82a8 stur x8, [x21, #-0x8] + // 20: 14000000 b 0x20 + // 0000000000000020: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x48, 0x01, 0x89, 0x9a, 0xa8, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__UNPACK_EX( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_EX.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000008 adrp x8, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f9400108 ldr x8, [x8] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: f85f82b7 ldur x23, [x21, #-0x8] + // 14: 12001d13 and w19, w8, #0xff + // 18: 8b334ea9 add x9, x21, w19, uxtw #3 + // 1c: 53083d18 ubfx w24, w8, #8, #8 + // 20: 8b384d24 add x4, x9, w24, uxtw #3 + // 24: f9002295 str x21, [x20, #0x40] + // 28: aa1603e0 mov x0, x22 + // 2c: aa1703e1 mov x1, x23 + // 30: aa1303e2 mov x2, x19 + // 34: aa1803e3 mov x3, x24 + // 38: 94000000 bl 0x38 + // 0000000000000038: ARM64_RELOC_BRANCH26 __PyEval_UnpackIterableStackRef + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: b94002e8 ldr w8, [x23] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b90002e8 str w8, [x23] + // 54: 540000c0 b.eq 0x6c + // 58: 34000140 cbz w0, 0x80 + // 5c: 0b180268 add w8, w19, w24 + // 60: 8b284eb5 add x21, x21, w8, uxtw #3 + // 64: a8c17bfd ldp x29, x30, [sp], #0x10 + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 6c: aa0003f9 mov x25, x0 + // 70: aa1703e0 mov x0, x23 + // 74: 94000000 bl 0x74 + // 0000000000000074: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 78: aa1903e0 mov x0, x25 + // 7c: 35ffff00 cbnz w0, 0x5c + // 80: d10022b5 sub x21, x21, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xb7, 0x82, 0x5f, 0xf8, 0x13, 0x1d, 0x00, 0x12, + 0xa9, 0x4e, 0x33, 0x8b, 0x18, 0x3d, 0x08, 0x53, + 0x24, 0x4d, 0x38, 0x8b, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0xe2, 0x03, 0x13, 0xaa, 0xe3, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x40, 0x01, 0x00, 0x34, 0x68, 0x02, 0x18, 0x0b, + 0xb5, 0x4e, 0x28, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf9, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0xff, 0xff, 0x35, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x38, 0x5d, state); + patch_aarch64_26r(code + 0x68, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x74, 0x0, state); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNPACK_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 910003fd mov x29, sp + // 8: 90000017 adrp x23, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // c: f94002f7 ldr x23, [x23] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 10: aa1503e8 mov x8, x21 + // 14: f85f8d13 ldr x19, [x8, #-0x8]! + // 18: 8b372d04 add x4, x8, w23, uxth #3 + // 1c: f9002295 str x21, [x20, #0x40] + // 20: 12003ee2 and w2, w23, #0xffff + // 24: aa1603e0 mov x0, x22 + // 28: aa1303e1 mov x1, x19 + // 2c: 12800003 mov w3, #-0x1 ; =-1 + // 30: 94000000 bl 0x30 + // 0000000000000030: ARM64_RELOC_BRANCH26 __PyEval_UnpackIterableStackRef + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: b9400268 ldr w8, [x19] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000268 str w8, [x19] + // 4c: 540000e0 b.eq 0x68 + // 50: 34000160 cbz w0, 0x7c + // 54: 92403ee8 and x8, x23, #0xffff + // 58: 8b080ea8 add x8, x21, x8, lsl #3 + // 5c: d1002115 sub x21, x8, #0x8 + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 + // 0000000000000064: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 68: aa0003f8 mov x24, x0 + // 6c: aa1303e0 mov x0, x19 + // 70: 94000000 bl 0x70 + // 0000000000000070: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 74: aa1803e0 mov x0, x24 + // 78: 35fffee0 cbnz w0, 0x54 + // 7c: d10022b5 sub x21, x21, #0x8 + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x17, 0x00, 0x00, 0x90, 0xf7, 0x02, 0x40, 0xf9, + 0xe8, 0x03, 0x15, 0xaa, 0x13, 0x8d, 0x5f, 0xf8, + 0x04, 0x2d, 0x37, 0x8b, 0x95, 0x22, 0x00, 0xf9, + 0xe2, 0x3e, 0x00, 0x12, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x03, 0x00, 0x80, 0x12, + 0x00, 0x00, 0x00, 0x94, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x00, 0x00, 0x54, + 0x60, 0x01, 0x00, 0x34, 0xe8, 0x3e, 0x40, 0x92, + 0xa8, 0x0e, 0x08, 0x8b, 0x15, 0x21, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf8, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x18, 0xaa, + 0xe0, 0xfe, 0xff, 0x35, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x30, 0x5d, state); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0x70, 0x0, state); + patch_aarch64_26r(code + 0x84, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNPACK_SEQUENCE_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_LIST.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8d00 ldr x0, [x8, #-0x8]! + // 8: f9400409 ldr x9, [x0, #0x8] + // c: 9000000a adrp x10, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyList_Type + // 10: f940014a ldr x10, [x10] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyList_Type + // 14: eb0a013f cmp x9, x10 + // 18: 54000381 b.ne 0x88 + // 1c: f9400813 ldr x19, [x0, #0x10] + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 28: eb29227f cmp x19, w9, uxth + // 2c: 540002e1 b.ne 0x88 + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 910003fd mov x29, sp + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 40: 72003d3f tst w9, #0xffff + // 44: 54000240 b.eq 0x8c + // 48: f9400c0a ldr x10, [x0, #0x18] + // 4c: 91000669 add x9, x19, #0x1 + // 50: 8b130d4a add x10, x10, x19, lsl #3 + // 54: d100214a sub x10, x10, #0x8 + // 58: 14000006 b 0x70 + // 5c: f800850b str x11, [x8], #0x8 + // 60: d1000529 sub x9, x9, #0x1 + // 64: d100214a sub x10, x10, #0x8 + // 68: f100053f cmp x9, #0x1 + // 6c: 54000109 b.ls 0x8c + // 70: f940014b ldr x11, [x10] + // 74: b940016c ldr w12, [x11] + // 78: 37ffff2c tbnz w12, #0x1f, 0x5c + // 7c: 1100058c add w12, w12, #0x1 + // 80: b900016c str w12, [x11] + // 84: 17fffff6 b 0x5c + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 8c: b9400008 ldr w8, [x0] + // 90: 37f80088 tbnz w8, #0x1f, 0xa0 + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000008 str w8, [x0] + // 9c: 540000a0 b.eq 0xb0 + // a0: 8b130ea8 add x8, x21, x19, lsl #3 + // a4: d1002115 sub x21, x8, #0x8 + // a8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ac: 14000000 b 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // b0: 94000000 bl 0xb0 + // 00000000000000b0: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b4: 8b130ea8 add x8, x21, x19, lsl #3 + // b8: d1002115 sub x21, x8, #0x8 + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 + // 00000000000000c0: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // c4: 00 00 00 00 + const unsigned char code_body[200] = { + 0xe8, 0x03, 0x15, 0xaa, 0x00, 0x8d, 0x5f, 0xf8, + 0x09, 0x04, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0xeb, + 0x81, 0x03, 0x00, 0x54, 0x13, 0x08, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x7f, 0x22, 0x29, 0xeb, 0xe1, 0x02, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x3f, 0x3d, 0x00, 0x72, 0x40, 0x02, 0x00, 0x54, + 0x0a, 0x0c, 0x40, 0xf9, 0x69, 0x06, 0x00, 0x91, + 0x4a, 0x0d, 0x13, 0x8b, 0x4a, 0x21, 0x00, 0xd1, + 0x06, 0x00, 0x00, 0x14, 0x0b, 0x85, 0x00, 0xf8, + 0x29, 0x05, 0x00, 0xd1, 0x4a, 0x21, 0x00, 0xd1, + 0x3f, 0x05, 0x00, 0xf1, 0x09, 0x01, 0x00, 0x54, + 0x4b, 0x01, 0x40, 0xf9, 0x6c, 0x01, 0x40, 0xb9, + 0x2c, 0xff, 0xff, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x6c, 0x01, 0x00, 0xb9, 0xf6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xa8, 0x0e, 0x13, 0x8b, 0x15, 0x21, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x94, 0xa8, 0x0e, 0x13, 0x8b, + 0x15, 0x21, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyList_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0xac, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xb0, 0x0, state); + patch_aarch64_26r(code + 0xc0, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__UNPACK_SEQUENCE_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: aa1503e8 mov x8, x21 + // 4: f85f8d00 ldr x0, [x8, #-0x8]! + // 8: f9400409 ldr x9, [x0, #0x8] + // c: 9000000a adrp x10, 0x0 + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGE21 _PyTuple_Type + // 10: f940014a ldr x10, [x10] + // 0000000000000010: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyTuple_Type + // 14: eb0a013f cmp x9, x10 + // 18: 54000361 b.ne 0x84 + // 1c: f9400813 ldr x19, [x0, #0x10] + // 20: 90000009 adrp x9, 0x0 + // 0000000000000020: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 28: eb29227f cmp x19, w9, uxth + // 2c: 540002c1 b.ne 0x84 + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 910003fd mov x29, sp + // 38: 90000009 adrp x9, 0x0 + // 0000000000000038: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // 40: 72003d3f tst w9, #0xffff + // 44: 54000220 b.eq 0x88 + // 48: 91000669 add x9, x19, #0x1 + // 4c: 8b130c0a add x10, x0, x19, lsl #3 + // 50: 9100414a add x10, x10, #0x10 + // 54: 14000006 b 0x6c + // 58: f800850b str x11, [x8], #0x8 + // 5c: d1000529 sub x9, x9, #0x1 + // 60: d100214a sub x10, x10, #0x8 + // 64: f100053f cmp x9, #0x1 + // 68: 54000109 b.ls 0x88 + // 6c: f940014b ldr x11, [x10] + // 70: b940016c ldr w12, [x11] + // 74: 37ffff2c tbnz w12, #0x1f, 0x58 + // 78: 1100058c add w12, w12, #0x1 + // 7c: b900016c str w12, [x11] + // 80: 17fffff6 b 0x58 + // 84: 14000000 b 0x84 + // 0000000000000084: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 88: b9400008 ldr w8, [x0] + // 8c: 37f80088 tbnz w8, #0x1f, 0x9c + // 90: 71000508 subs w8, w8, #0x1 + // 94: b9000008 str w8, [x0] + // 98: 540000a0 b.eq 0xac + // 9c: 8b130ea8 add x8, x21, x19, lsl #3 + // a0: d1002115 sub x21, x8, #0x8 + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // ac: 94000000 bl 0xac + // 00000000000000ac: ARM64_RELOC_BRANCH26 __Py_Dealloc + // b0: 8b130ea8 add x8, x21, x19, lsl #3 + // b4: d1002115 sub x21, x8, #0x8 + // b8: a8c17bfd ldp x29, x30, [sp], #0x10 + // bc: 14000000 b 0xbc + // 00000000000000bc: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[192] = { + 0xe8, 0x03, 0x15, 0xaa, 0x00, 0x8d, 0x5f, 0xf8, + 0x09, 0x04, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0xeb, + 0x61, 0x03, 0x00, 0x54, 0x13, 0x08, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x7f, 0x22, 0x29, 0xeb, 0xc1, 0x02, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x3f, 0x3d, 0x00, 0x72, 0x20, 0x02, 0x00, 0x54, + 0x69, 0x06, 0x00, 0x91, 0x0a, 0x0c, 0x13, 0x8b, + 0x4a, 0x41, 0x00, 0x91, 0x06, 0x00, 0x00, 0x14, + 0x0b, 0x85, 0x00, 0xf8, 0x29, 0x05, 0x00, 0xd1, + 0x4a, 0x21, 0x00, 0xd1, 0x3f, 0x05, 0x00, 0xf1, + 0x09, 0x01, 0x00, 0x54, 0x4b, 0x01, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0x2c, 0xff, 0xff, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x6c, 0x01, 0x00, 0xb9, + 0xf6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xa8, 0x0e, 0x13, 0x8b, + 0x15, 0x21, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x94, + 0xa8, 0x0e, 0x13, 0x8b, 0x15, 0x21, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyTuple_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data); + patch_aarch64_26r(code + 0x84, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0xa8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_trampoline(code + 0xac, 0x0, state); + patch_aarch64_26r(code + 0xbc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__UNPACK_SEQUENCE_TWO_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TWO_TUPLE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: f9400408 ldr x8, [x0, #0x8] + // 8: 90000009 adrp x9, 0x0 + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGE21 _PyTuple_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: ARM64_RELOC_GOT_LOAD_PAGEOFF12 _PyTuple_Type + // 10: eb09011f cmp x8, x9 + // 14: 540002c1 b.ne 0x6c + // 18: f9400808 ldr x8, [x0, #0x10] + // 1c: f100091f cmp x8, #0x2 + // 20: 54000261 b.ne 0x6c + // 24: f9400c13 ldr x19, [x0, #0x18] + // 28: b9400268 ldr w8, [x19] + // 2c: 37f80068 tbnz w8, #0x1f, 0x38 + // 30: 11000508 add w8, w8, #0x1 + // 34: b9000268 str w8, [x19] + // 38: f9401017 ldr x23, [x0, #0x20] + // 3c: b94002e8 ldr w8, [x23] + // 40: 37f80068 tbnz w8, #0x1f, 0x4c + // 44: 11000508 add w8, w8, #0x1 + // 48: b90002e8 str w8, [x23] + // 4c: b9400008 ldr w8, [x0] + // 50: 37f80088 tbnz w8, #0x1f, 0x60 + // 54: 71000508 subs w8, w8, #0x1 + // 58: b9000008 str w8, [x0] + // 5c: 540000a0 b.eq 0x70 + // 60: a93fceb7 stp x23, x19, [x21, #-0x8] + // 64: 910022b5 add x21, x21, #0x8 + // 68: 14000000 b 0x68 + // 0000000000000068: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 6c: 14000000 b 0x6c + // 000000000000006c: ARM64_RELOC_BRANCH26 __JIT_JUMP_TARGET + // 70: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 74: 910003fd mov x29, sp + // 78: 94000000 bl 0x78 + // 0000000000000078: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: a93fceb7 stp x23, x19, [x21, #-0x8] + // 84: 910022b5 add x21, x21, #0x8 + // 88: 14000000 b 0x88 + // 0000000000000088: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xc1, 0x02, 0x00, 0x54, + 0x08, 0x08, 0x40, 0xf9, 0x1f, 0x09, 0x00, 0xf1, + 0x61, 0x02, 0x00, 0x54, 0x13, 0x0c, 0x40, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x68, 0x02, 0x00, 0xb9, + 0x17, 0x10, 0x40, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0xe8, 0x02, 0x00, 0xb9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb7, 0xce, 0x3f, 0xa9, 0xb5, 0x22, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb7, 0xce, 0x3f, 0xa9, 0xb5, 0x22, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x68, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x6c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_trampoline(code + 0x78, 0x0, state); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__WITH_EXCEPT_START( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _WITH_EXCEPT_START.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: d10103ff sub sp, sp, #0x40 + // 4: a9037bfd stp x29, x30, [sp, #0x30] + // 8: 9100c3fd add x29, sp, #0x30 + // c: f85f82b7 ldur x23, [x21, #-0x8] + // 10: a97de2b3 ldp x19, x24, [x21, #-0x28] + // 14: f94006f9 ldr x25, [x23, #0x8] + // 18: aa1703e0 mov x0, x23 + // 1c: 94000000 bl 0x1c + // 000000000000001c: ARM64_RELOC_BRANCH26 _PyException_GetTraceback + // 20: b4000180 cbz x0, 0x50 + // 24: f9002295 str x21, [x20, #0x40] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f800e8 tbnz w8, #0x1f, 0x48 + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 54000081 b.ne 0x48 + // 3c: aa0003f5 mov x21, x0 + // 40: 94000000 bl 0x40 + // 0000000000000040: ARM64_RELOC_BRANCH26 __Py_Dealloc + // 44: aa1503e0 mov x0, x21 + // 48: f9402295 ldr x21, [x20, #0x40] + // 4c: 14000003 b 0x58 + // 50: 90000000 adrp x0, 0x0 + // 0000000000000050: ARM64_RELOC_GOT_LOAD_PAGE21 __Py_NoneStruct + // 54: f9400000 ldr x0, [x0] + // 0000000000000054: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __Py_NoneStruct + // 58: a900e3ff stp xzr, x24, [sp, #0x8] + // 5c: 910023e8 add x8, sp, #0x8 + // 60: 91004108 add x8, x8, #0x10 + // 64: a901dff9 stp x25, x23, [sp, #0x18] + // 68: f90017e0 str x0, [sp, #0x28] + // 6c: f9002295 str x21, [x20, #0x40] + // 70: f100031f cmp x24, #0x0 + // 74: da9f03e9 csetm x9, ne + // 78: 8b090d01 add x1, x8, x9, lsl #3 + // 7c: b2410be8 mov x8, #-0x7ffffffffffffffd ; =-9223372036854775805 + // 80: 9a880502 cinc x2, x8, ne + // 84: aa1303e0 mov x0, x19 + // 88: d2800003 mov x3, #0x0 ; =0 + // 8c: 94000000 bl 0x8c + // 000000000000008c: ARM64_RELOC_BRANCH26 _PyObject_Vectorcall + // 90: f9402295 ldr x21, [x20, #0x40] + // 94: f900229f str xzr, [x20, #0x40] + // 98: b40000a0 cbz x0, 0xac + // 9c: f80086a0 str x0, [x21], #0x8 + // a0: a9437bfd ldp x29, x30, [sp, #0x30] + // a4: 910103ff add sp, sp, #0x40 + // a8: 14000000 b 0xa8 + // 00000000000000a8: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + // ac: a9437bfd ldp x29, x30, [sp, #0x30] + // b0: 910103ff add sp, sp, #0x40 + // b4: 14000000 b 0xb4 + // 00000000000000b4: ARM64_RELOC_BRANCH26 __JIT_ERROR_TARGET + const unsigned char code_body[184] = { + 0xff, 0x03, 0x01, 0xd1, 0xfd, 0x7b, 0x03, 0xa9, + 0xfd, 0xc3, 0x00, 0x91, 0xb7, 0x82, 0x5f, 0xf8, + 0xb3, 0xe2, 0x7d, 0xa9, 0xf9, 0x06, 0x40, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x94, + 0x80, 0x01, 0x00, 0xb4, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x00, 0xaa, + 0x00, 0x00, 0x00, 0x94, 0xe0, 0x03, 0x15, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x40, 0xf9, + 0xff, 0xe3, 0x00, 0xa9, 0xe8, 0x23, 0x00, 0x91, + 0x08, 0x41, 0x00, 0x91, 0xf9, 0xdf, 0x01, 0xa9, + 0xe0, 0x17, 0x00, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x1f, 0x03, 0x00, 0xf1, 0xe9, 0x03, 0x9f, 0xda, + 0x01, 0x0d, 0x09, 0x8b, 0xe8, 0x0b, 0x41, 0xb2, + 0x02, 0x05, 0x88, 0x9a, 0xe0, 0x03, 0x13, 0xaa, + 0x03, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x00, 0x94, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0x43, 0xa9, 0xff, 0x03, 0x01, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0x43, 0xa9, + 0xff, 0x03, 0x01, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_trampoline(code + 0x1c, 0x5e, state); + patch_aarch64_trampoline(code + 0x40, 0x0, state); + patch_aarch64_33rx(code + 0x50, (uintptr_t)data); + patch_aarch64_trampoline(code + 0x8c, 0x15, state); + patch_aarch64_26r(code + 0xa8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xb4, state->instruction_starts[instruction->error_target]); +} + +void +emit__YIELD_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _YIELD_VALUE.o: file format mach-o arm64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 : + // 0: f85f8ea9 ldr x9, [x21, #-0x8]! + // 4: 90000008 adrp x8, 0x0 + // 0000000000000004: ARM64_RELOC_GOT_LOAD_PAGE21 __JIT_OPARG + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: ARM64_RELOC_GOT_LOAD_PAGEOFF12 __JIT_OPARG + // c: 51000908 sub w8, w8, #0x2 + // 10: 381fb288 sturb w8, [x20, #-0x5] + // 14: f9401e88 ldr x8, [x20, #0x38] + // 18: 91000908 add x8, x8, #0x2 + // 1c: a903d688 stp x8, x21, [x20, #0x38] + // 20: f85e8288 ldur x8, [x20, #-0x18] + // 24: f9003ec8 str x8, [x22, #0x78] + // 28: f81e829f stur xzr, [x20, #-0x18] + // 2c: b9402ec8 ldr w8, [x22, #0x2c] + // 30: 11000508 add w8, w8, #0x1 + // 34: b9002ec8 str w8, [x22, #0x2c] + // 38: f9400688 ldr x8, [x20, #0x8] + // 3c: f90026c8 str x8, [x22, #0x48] + // 40: f900069f str xzr, [x20, #0x8] + // 44: f9402115 ldr x21, [x8, #0x40] + // 48: f900211f str xzr, [x8, #0x40] + // 4c: f80086a9 str x9, [x21], #0x8 + // 50: aa0803f4 mov x20, x8 + // 54: 14000000 b 0x54 + // 0000000000000054: ARM64_RELOC_BRANCH26 __JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa9, 0x8e, 0x5f, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x09, 0x00, 0x51, + 0x88, 0xb2, 0x1f, 0x38, 0x88, 0x1e, 0x40, 0xf9, + 0x08, 0x09, 0x00, 0x91, 0x88, 0xd6, 0x03, 0xa9, + 0x88, 0x82, 0x5e, 0xf8, 0xc8, 0x3e, 0x00, 0xf9, + 0x9f, 0x82, 0x1e, 0xf8, 0xc8, 0x2e, 0x40, 0xb9, + 0x08, 0x05, 0x00, 0x11, 0xc8, 0x2e, 0x00, 0xb9, + 0x88, 0x06, 0x40, 0xf9, 0xc8, 0x26, 0x00, 0xf9, + 0x9f, 0x06, 0x00, 0xf9, 0x15, 0x21, 0x40, 0xf9, + 0x1f, 0x21, 0x00, 0xf9, 0xa9, 0x86, 0x00, 0xf8, + 0xf4, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +static_assert(SYMBOL_MASK_WORDS >= 3, "SYMBOL_MASK_WORDS too small"); + +typedef struct { + void (*emit)( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state); + size_t code_size; + size_t data_size; + symbol_mask trampoline_mask; +} StencilGroup; + +static const StencilGroup shim = {emit_shim, 104, 0, {0}}; + +static const StencilGroup stencil_groups[MAX_UOP_ID + 1] = { + [_BINARY_OP] = {emit__BINARY_OP, 160, 16, {0x01}}, + [_BINARY_OP_ADD_FLOAT] = {emit__BINARY_OP_ADD_FLOAT, 64, 0, {0x02}}, + [_BINARY_OP_ADD_INT] = {emit__BINARY_OP_ADD_INT, 192, 8, {0x0c}}, + [_BINARY_OP_ADD_UNICODE] = {emit__BINARY_OP_ADD_UNICODE, 192, 8, {0x30}}, + [_BINARY_OP_EXTEND] = {emit__BINARY_OP_EXTEND, 144, 8, {0x01}}, + [_BINARY_OP_INPLACE_ADD_UNICODE] = {emit__BINARY_OP_INPLACE_ADD_UNICODE, 232, 16, {0x50}}, + [_BINARY_OP_MULTIPLY_FLOAT] = {emit__BINARY_OP_MULTIPLY_FLOAT, 64, 0, {0x02}}, + [_BINARY_OP_MULTIPLY_INT] = {emit__BINARY_OP_MULTIPLY_INT, 192, 8, {0x84}}, + [_BINARY_OP_SUBSCR_CHECK_FUNC] = {emit__BINARY_OP_SUBSCR_CHECK_FUNC, 104, 0, {0}}, + [_BINARY_OP_SUBSCR_DICT] = {emit__BINARY_OP_SUBSCR_DICT, 224, 8, {0x301}}, + [_BINARY_OP_SUBSCR_INIT_CALL] = {emit__BINARY_OP_SUBSCR_INIT_CALL, 152, 0, {0}}, + [_BINARY_OP_SUBSCR_LIST_INT] = {emit__BINARY_OP_SUBSCR_LIST_INT, 232, 24, {0x05}}, + [_BINARY_OP_SUBSCR_STR_INT] = {emit__BINARY_OP_SUBSCR_STR_INT, 376, 24, {0x05}}, + [_BINARY_OP_SUBSCR_TUPLE_INT] = {emit__BINARY_OP_SUBSCR_TUPLE_INT, 232, 24, {0x05}}, + [_BINARY_OP_SUBTRACT_FLOAT] = {emit__BINARY_OP_SUBTRACT_FLOAT, 64, 0, {0x02}}, + [_BINARY_OP_SUBTRACT_INT] = {emit__BINARY_OP_SUBTRACT_INT, 192, 8, {0x404}}, + [_BINARY_SLICE] = {emit__BINARY_SLICE, 200, 0, {0x1801}}, + [_BUILD_LIST] = {emit__BUILD_LIST, 80, 8, {0x2000}}, + [_BUILD_MAP] = {emit__BUILD_MAP, 200, 8, {0x4001}}, + [_BUILD_SET] = {emit__BUILD_SET, 392, 8, {0x18001}}, + [_BUILD_SLICE] = {emit__BUILD_SLICE, 176, 8, {0x20001}}, + [_BUILD_STRING] = {emit__BUILD_STRING, 168, 16, {0x40001}}, + [_BUILD_TUPLE] = {emit__BUILD_TUPLE, 80, 8, {0x80000}}, + [_CALL_BUILTIN_CLASS] = {emit__CALL_BUILTIN_CLASS, 288, 8, {0x01}}, + [_CALL_BUILTIN_FAST] = {emit__CALL_BUILTIN_FAST, 312, 16, {0x01}}, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = {emit__CALL_BUILTIN_FAST_WITH_KEYWORDS, 312, 16, {0x01}}, + [_CALL_BUILTIN_O] = {emit__CALL_BUILTIN_O, 272, 16, {0x01}}, + [_CALL_INTRINSIC_1] = {emit__CALL_INTRINSIC_1, 136, 16, {0x01}}, + [_CALL_INTRINSIC_2] = {emit__CALL_INTRINSIC_2, 168, 16, {0x01}}, + [_CALL_ISINSTANCE] = {emit__CALL_ISINSTANCE, 328, 24, {0x100001}}, + [_CALL_KW_NON_PY] = {emit__CALL_KW_NON_PY, 352, 8, {0x200001}}, + [_CALL_LEN] = {emit__CALL_LEN, 264, 8, {0xc00001}}, + [_CALL_LIST_APPEND] = {emit__CALL_LIST_APPEND, 248, 0, {0x1000001}}, + [_CALL_METHOD_DESCRIPTOR_FAST] = {emit__CALL_METHOD_DESCRIPTOR_FAST, 344, 16, {0x01}}, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 344, 16, {0x01}}, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = {emit__CALL_METHOD_DESCRIPTOR_NOARGS, 288, 16, {0x01}}, + [_CALL_METHOD_DESCRIPTOR_O] = {emit__CALL_METHOD_DESCRIPTOR_O, 368, 16, {0x01}}, + [_CALL_NON_PY_GENERAL] = {emit__CALL_NON_PY_GENERAL, 264, 8, {0x200001}}, + [_CALL_STR_1] = {emit__CALL_STR_1, 144, 8, {0x2000001}}, + [_CALL_TUPLE_1] = {emit__CALL_TUPLE_1, 144, 8, {0x4000001}}, + [_CALL_TYPE_1] = {emit__CALL_TYPE_1, 128, 8, {0x01}}, + [_CHECK_AND_ALLOCATE_OBJECT] = {emit__CHECK_AND_ALLOCATE_OBJECT, 248, 24, {0x8000001}}, + [_CHECK_ATTR_CLASS] = {emit__CHECK_ATTR_CLASS, 48, 8, {0}}, + [_CHECK_ATTR_METHOD_LAZY_DICT] = {emit__CHECK_ATTR_METHOD_LAZY_DICT, 32, 8, {0}}, + [_CHECK_ATTR_MODULE_PUSH_KEYS] = {emit__CHECK_ATTR_MODULE_PUSH_KEYS, 72, 16, {0}}, + [_CHECK_ATTR_WITH_HINT] = {emit__CHECK_ATTR_WITH_HINT, 24, 0, {0}}, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 64, 16, {0}}, + [_CHECK_EG_MATCH] = {emit__CHECK_EG_MATCH, 320, 8, {0x70000001}}, + [_CHECK_EXC_MATCH] = {emit__CHECK_EXC_MATCH, 192, 16, {0x80000001, 0x01}}, + [_CHECK_FUNCTION] = {emit__CHECK_FUNCTION, 32, 8, {0}}, + [_CHECK_FUNCTION_EXACT_ARGS] = {emit__CHECK_FUNCTION_EXACT_ARGS, 64, 8, {0}}, + [_CHECK_FUNCTION_VERSION] = {emit__CHECK_FUNCTION_VERSION, 72, 24, {0}}, + [_CHECK_FUNCTION_VERSION_INLINE] = {emit__CHECK_FUNCTION_VERSION_INLINE, 40, 16, {0}}, + [_CHECK_FUNCTION_VERSION_KW] = {emit__CHECK_FUNCTION_VERSION_KW, 72, 24, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE] = {emit__CHECK_IS_NOT_PY_CALLABLE, 64, 24, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = {emit__CHECK_IS_NOT_PY_CALLABLE_KW, 64, 24, {0}}, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = {emit__CHECK_MANAGED_OBJECT_HAS_VALUES, 32, 0, {0}}, + [_CHECK_METHOD_VERSION] = {emit__CHECK_METHOD_VERSION, 112, 32, {0}}, + [_CHECK_METHOD_VERSION_KW] = {emit__CHECK_METHOD_VERSION_KW, 112, 32, {0}}, + [_CHECK_PEP_523] = {emit__CHECK_PEP_523, 24, 0, {0}}, + [_CHECK_PERIODIC] = {emit__CHECK_PERIODIC, 56, 0, {0x00, 0x02}}, + [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = {emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM, 72, 8, {0x00, 0x02}}, + [_CHECK_STACK_SPACE] = {emit__CHECK_STACK_SPACE, 72, 8, {0}}, + [_CHECK_STACK_SPACE_OPERAND] = {emit__CHECK_STACK_SPACE_OPERAND, 56, 8, {0}}, + [_CHECK_VALIDITY] = {emit__CHECK_VALIDITY, 24, 8, {0}}, + [_CHECK_VALIDITY_AND_SET_IP] = {emit__CHECK_VALIDITY_AND_SET_IP, 40, 16, {0}}, + [_COMPARE_OP] = {emit__COMPARE_OP, 272, 24, {0x01, 0x0c}}, + [_COMPARE_OP_FLOAT] = {emit__COMPARE_OP_FLOAT, 224, 32, {0x00, 0x10}}, + [_COMPARE_OP_INT] = {emit__COMPARE_OP_INT, 264, 32, {0x04}}, + [_COMPARE_OP_STR] = {emit__COMPARE_OP_STR, 216, 32, {0x10, 0x20}}, + [_CONTAINS_OP] = {emit__CONTAINS_OP, 168, 24, {0x01, 0x40}}, + [_CONTAINS_OP_DICT] = {emit__CONTAINS_OP_DICT, 200, 32, {0x01, 0x80}}, + [_CONTAINS_OP_SET] = {emit__CONTAINS_OP_SET, 208, 40, {0x01, 0x100}}, + [_CONVERT_VALUE] = {emit__CONVERT_VALUE, 144, 16, {0x01}}, + [_COPY] = {emit__COPY, 40, 8, {0}}, + [_COPY_FREE_VARS] = {emit__COPY_FREE_VARS, 104, 8, {0}}, + [_CREATE_INIT_FRAME] = {emit__CREATE_INIT_FRAME, 248, 24, {0x00, 0x600}}, + [_DELETE_ATTR] = {emit__DELETE_ATTR, 128, 8, {0x01, 0x800}}, + [_DELETE_DEREF] = {emit__DELETE_DEREF, 144, 8, {0x01, 0x1000}}, + [_DELETE_FAST] = {emit__DELETE_FAST, 168, 96, {0x01, 0x6000}}, + [_DELETE_GLOBAL] = {emit__DELETE_GLOBAL, 136, 48, {0x00, 0xa000}}, + [_DELETE_NAME] = {emit__DELETE_NAME, 192, 80, {0x00, 0x32000}}, + [_DELETE_SUBSCR] = {emit__DELETE_SUBSCR, 128, 0, {0x01, 0x20000}}, + [_DEOPT] = {emit__DEOPT, 40, 16, {0}}, + [_DICT_MERGE] = {emit__DICT_MERGE, 208, 8, {0x01, 0xc0000}}, + [_DICT_UPDATE] = {emit__DICT_UPDATE, 272, 64, {0x01, 0x310000}}, + [_END_FOR] = {emit__END_FOR, 72, 0, {0x01}}, + [_END_SEND] = {emit__END_SEND, 72, 0, {0x01}}, + [_ERROR_POP_N] = {emit__ERROR_POP_N, 48, 16, {0}}, + [_EXIT_INIT_CHECK] = {emit__EXIT_INIT_CHECK, 104, 64, {0x00, 0x400000}}, + [_EXIT_TRACE] = {emit__EXIT_TRACE, 448, 16, {0x01, 0x800000}}, + [_EXPAND_METHOD] = {emit__EXPAND_METHOD, 144, 8, {0x01}}, + [_EXPAND_METHOD_KW] = {emit__EXPAND_METHOD_KW, 144, 8, {0x01}}, + [_FATAL_ERROR] = {emit__FATAL_ERROR, 32, 40, {0x00, 0x1000000}}, + [_FORMAT_SIMPLE] = {emit__FORMAT_SIMPLE, 152, 8, {0x01, 0x2000000}}, + [_FORMAT_WITH_SPEC] = {emit__FORMAT_WITH_SPEC, 136, 0, {0x01, 0x2000000}}, + [_FOR_ITER_GEN_FRAME] = {emit__FOR_ITER_GEN_FRAME, 120, 24, {0}}, + [_FOR_ITER_TIER_TWO] = {emit__FOR_ITER_TIER_TWO, 160, 8, {0x00, 0xc100000}}, + [_GET_AITER] = {emit__GET_AITER, 344, 168, {0x01, 0x10000}}, + [_GET_ANEXT] = {emit__GET_ANEXT, 56, 0, {0x00, 0x10000000}}, + [_GET_AWAITABLE] = {emit__GET_AWAITABLE, 112, 8, {0x01, 0x20000000}}, + [_GET_ITER] = {emit__GET_ITER, 104, 0, {0x01, 0x40000000}}, + [_GET_LEN] = {emit__GET_LEN, 64, 0, {0xc00000}}, + [_GET_YIELD_FROM_ITER] = {emit__GET_YIELD_FROM_ITER, 216, 96, {0x01, 0xc0000000}}, + [_GUARD_BINARY_OP_EXTEND] = {emit__GUARD_BINARY_OP_EXTEND, 64, 8, {0}}, + [_GUARD_BOTH_FLOAT] = {emit__GUARD_BOTH_FLOAT, 48, 8, {0}}, + [_GUARD_BOTH_INT] = {emit__GUARD_BOTH_INT, 48, 8, {0}}, + [_GUARD_BOTH_UNICODE] = {emit__GUARD_BOTH_UNICODE, 48, 8, {0}}, + [_GUARD_BUILTINS_VERSION_PUSH_KEYS] = {emit__GUARD_BUILTINS_VERSION_PUSH_KEYS, 64, 16, {0}}, + [_GUARD_DORV_NO_DICT] = {emit__GUARD_DORV_NO_DICT, 40, 0, {0}}, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = {emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 32, 0, {0}}, + [_GUARD_GLOBALS_VERSION] = {emit__GUARD_GLOBALS_VERSION, 56, 16, {0}}, + [_GUARD_GLOBALS_VERSION_PUSH_KEYS] = {emit__GUARD_GLOBALS_VERSION_PUSH_KEYS, 64, 16, {0}}, + [_GUARD_IS_FALSE_POP] = {emit__GUARD_IS_FALSE_POP, 32, 8, {0}}, + [_GUARD_IS_NONE_POP] = {emit__GUARD_IS_NONE_POP, 88, 8, {0x01}}, + [_GUARD_IS_NOT_NONE_POP] = {emit__GUARD_IS_NOT_NONE_POP, 104, 8, {0x01}}, + [_GUARD_IS_TRUE_POP] = {emit__GUARD_IS_TRUE_POP, 32, 8, {0}}, + [_GUARD_KEYS_VERSION] = {emit__GUARD_KEYS_VERSION, 40, 8, {0}}, + [_GUARD_NOS_FLOAT] = {emit__GUARD_NOS_FLOAT, 32, 8, {0}}, + [_GUARD_NOS_INT] = {emit__GUARD_NOS_INT, 32, 8, {0}}, + [_GUARD_NOT_EXHAUSTED_LIST] = {emit__GUARD_NOT_EXHAUSTED_LIST, 48, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_RANGE] = {emit__GUARD_NOT_EXHAUSTED_RANGE, 24, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_TUPLE] = {emit__GUARD_NOT_EXHAUSTED_TUPLE, 40, 0, {0}}, + [_GUARD_TOS_FLOAT] = {emit__GUARD_TOS_FLOAT, 32, 8, {0}}, + [_GUARD_TOS_INT] = {emit__GUARD_TOS_INT, 32, 8, {0}}, + [_GUARD_TYPE_VERSION] = {emit__GUARD_TYPE_VERSION, 40, 8, {0}}, + [_GUARD_TYPE_VERSION_AND_LOCK] = {emit__GUARD_TYPE_VERSION_AND_LOCK, 40, 8, {0}}, + [_IMPORT_FROM] = {emit__IMPORT_FROM, 80, 8, {0x00, 0x00, 0x01}}, + [_IMPORT_NAME] = {emit__IMPORT_NAME, 168, 8, {0x01, 0x00, 0x02}}, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS, 144, 8, {0x01}}, + [_INIT_CALL_PY_EXACT_ARGS] = {emit__INIT_CALL_PY_EXACT_ARGS, 352, 8, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_0] = {emit__INIT_CALL_PY_EXACT_ARGS_0, 160, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_1] = {emit__INIT_CALL_PY_EXACT_ARGS_1, 168, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_2] = {emit__INIT_CALL_PY_EXACT_ARGS_2, 184, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_3] = {emit__INIT_CALL_PY_EXACT_ARGS_3, 192, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_4] = {emit__INIT_CALL_PY_EXACT_ARGS_4, 200, 0, {0}}, + [_IS_NONE] = {emit__IS_NONE, 104, 24, {0x01}}, + [_IS_OP] = {emit__IS_OP, 136, 24, {0x01}}, + [_ITER_CHECK_LIST] = {emit__ITER_CHECK_LIST, 32, 8, {0}}, + [_ITER_CHECK_RANGE] = {emit__ITER_CHECK_RANGE, 32, 8, {0}}, + [_ITER_CHECK_TUPLE] = {emit__ITER_CHECK_TUPLE, 32, 8, {0}}, + [_ITER_NEXT_LIST] = {emit__ITER_NEXT_LIST, 48, 0, {0}}, + [_ITER_NEXT_RANGE] = {emit__ITER_NEXT_RANGE, 64, 0, {0x00, 0x00, 0x04}}, + [_ITER_NEXT_TUPLE] = {emit__ITER_NEXT_TUPLE, 48, 0, {0}}, + [_JUMP_TO_TOP] = {emit__JUMP_TO_TOP, 8, 0, {0}}, + [_LIST_APPEND] = {emit__LIST_APPEND, 96, 8, {0x1000000}}, + [_LIST_EXTEND] = {emit__LIST_EXTEND, 296, 64, {0x01, 0x4110000, 0x18}}, + [_LOAD_ATTR] = {emit__LOAD_ATTR, 264, 8, {0x01, 0x00, 0x60}}, + [_LOAD_ATTR_CLASS] = {emit__LOAD_ATTR_CLASS, 80, 8, {0x01}}, + [_LOAD_ATTR_INSTANCE_VALUE] = {emit__LOAD_ATTR_INSTANCE_VALUE, 112, 8, {0x01}}, + [_LOAD_ATTR_METHOD_LAZY_DICT] = {emit__LOAD_ATTR_METHOD_LAZY_DICT, 40, 8, {0}}, + [_LOAD_ATTR_METHOD_NO_DICT] = {emit__LOAD_ATTR_METHOD_NO_DICT, 40, 8, {0}}, + [_LOAD_ATTR_METHOD_WITH_VALUES] = {emit__LOAD_ATTR_METHOD_WITH_VALUES, 40, 8, {0}}, + [_LOAD_ATTR_MODULE] = {emit__LOAD_ATTR_MODULE, 120, 8, {0x01}}, + [_LOAD_ATTR_MODULE_FROM_KEYS] = {emit__LOAD_ATTR_MODULE_FROM_KEYS, 136, 8, {0x01}}, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 72, 8, {0x01}}, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 72, 8, {0x01}}, + [_LOAD_ATTR_PROPERTY_FRAME] = {emit__LOAD_ATTR_PROPERTY_FRAME, 224, 8, {0}}, + [_LOAD_ATTR_SLOT] = {emit__LOAD_ATTR_SLOT, 96, 8, {0x01}}, + [_LOAD_ATTR_WITH_HINT] = {emit__LOAD_ATTR_WITH_HINT, 184, 16, {0x01}}, + [_LOAD_BUILD_CLASS] = {emit__LOAD_BUILD_CLASS, 136, 48, {0x00, 0x80000000, 0x80}}, + [_LOAD_COMMON_CONSTANT] = {emit__LOAD_COMMON_CONSTANT, 48, 24, {0}}, + [_LOAD_CONST_IMMORTAL] = {emit__LOAD_CONST_IMMORTAL, 32, 8, {0}}, + [_LOAD_CONST_INLINE] = {emit__LOAD_CONST_INLINE, 32, 8, {0}}, + [_LOAD_CONST_INLINE_BORROW] = {emit__LOAD_CONST_INLINE_BORROW, 16, 8, {0}}, + [_LOAD_CONST_MORTAL] = {emit__LOAD_CONST_MORTAL, 48, 8, {0}}, + [_LOAD_DEREF] = {emit__LOAD_DEREF, 104, 8, {0x00, 0x1000}}, + [_LOAD_FAST] = {emit__LOAD_FAST, 40, 8, {0}}, + [_LOAD_FAST_0] = {emit__LOAD_FAST_0, 32, 0, {0}}, + [_LOAD_FAST_1] = {emit__LOAD_FAST_1, 32, 0, {0}}, + [_LOAD_FAST_2] = {emit__LOAD_FAST_2, 32, 0, {0}}, + [_LOAD_FAST_3] = {emit__LOAD_FAST_3, 32, 0, {0}}, + [_LOAD_FAST_4] = {emit__LOAD_FAST_4, 32, 0, {0}}, + [_LOAD_FAST_5] = {emit__LOAD_FAST_5, 32, 0, {0}}, + [_LOAD_FAST_6] = {emit__LOAD_FAST_6, 32, 0, {0}}, + [_LOAD_FAST_7] = {emit__LOAD_FAST_7, 32, 0, {0}}, + [_LOAD_FAST_AND_CLEAR] = {emit__LOAD_FAST_AND_CLEAR, 32, 8, {0}}, + [_LOAD_FAST_CHECK] = {emit__LOAD_FAST_CHECK, 128, 96, {0x00, 0x6000}}, + [_LOAD_FROM_DICT_OR_DEREF] = {emit__LOAD_FROM_DICT_OR_DEREF, 272, 8, {0x01, 0x1000, 0x80}}, + [_LOAD_GLOBAL] = {emit__LOAD_GLOBAL, 96, 8, {0x00, 0x00, 0x100}}, + [_LOAD_GLOBAL_BUILTINS] = {emit__LOAD_GLOBAL_BUILTINS, 72, 8, {0}}, + [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = {emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS, 80, 8, {0}}, + [_LOAD_GLOBAL_MODULE] = {emit__LOAD_GLOBAL_MODULE, 72, 8, {0}}, + [_LOAD_GLOBAL_MODULE_FROM_KEYS] = {emit__LOAD_GLOBAL_MODULE_FROM_KEYS, 80, 8, {0}}, + [_LOAD_LOCALS] = {emit__LOAD_LOCALS, 88, 24, {0x00, 0x80000000}}, + [_LOAD_NAME] = {emit__LOAD_NAME, 80, 8, {0x00, 0x00, 0x200}}, + [_LOAD_SMALL_INT] = {emit__LOAD_SMALL_INT, 40, 16, {0}}, + [_LOAD_SMALL_INT_0] = {emit__LOAD_SMALL_INT_0, 24, 8, {0}}, + [_LOAD_SMALL_INT_1] = {emit__LOAD_SMALL_INT_1, 24, 8, {0}}, + [_LOAD_SMALL_INT_2] = {emit__LOAD_SMALL_INT_2, 24, 8, {0}}, + [_LOAD_SMALL_INT_3] = {emit__LOAD_SMALL_INT_3, 24, 8, {0}}, + [_LOAD_SPECIAL] = {emit__LOAD_SPECIAL, 176, 24, {0x00, 0x10000, 0x400}}, + [_LOAD_SUPER_ATTR_ATTR] = {emit__LOAD_SUPER_ATTR_ATTR, 240, 16, {0x01, 0x00, 0x800}}, + [_LOAD_SUPER_ATTR_METHOD] = {emit__LOAD_SUPER_ATTR_METHOD, 336, 24, {0x01, 0x00, 0x800}}, + [_MAKE_CALLARGS_A_TUPLE] = {emit__MAKE_CALLARGS_A_TUPLE, 168, 8, {0x4000001, 0x00, 0x1000}}, + [_MAKE_CELL] = {emit__MAKE_CELL, 120, 8, {0x01, 0x00, 0x2000}}, + [_MAKE_FUNCTION] = {emit__MAKE_FUNCTION, 128, 0, {0x01, 0x00, 0xc000}}, + [_MAKE_WARM] = {emit__MAKE_WARM, 64, 8, {0}}, + [_MAP_ADD] = {emit__MAP_ADD, 72, 8, {0x00, 0x00, 0x10000}}, + [_MATCH_CLASS] = {emit__MATCH_CLASS, 224, 16, {0x01, 0x00, 0x20000}}, + [_MATCH_KEYS] = {emit__MATCH_KEYS, 56, 0, {0x00, 0x00, 0x40000}}, + [_MATCH_MAPPING] = {emit__MATCH_MAPPING, 48, 16, {0}}, + [_MATCH_SEQUENCE] = {emit__MATCH_SEQUENCE, 48, 16, {0}}, + [_MAYBE_EXPAND_METHOD] = {emit__MAYBE_EXPAND_METHOD, 176, 16, {0x01}}, + [_MAYBE_EXPAND_METHOD_KW] = {emit__MAYBE_EXPAND_METHOD_KW, 208, 16, {0x01}}, + [_NOP] = {emit__NOP, 8, 0, {0}}, + [_POP_EXCEPT] = {emit__POP_EXCEPT, 112, 8, {0x01}}, + [_POP_TOP] = {emit__POP_TOP, 48, 0, {0x01}}, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = {emit__POP_TOP_LOAD_CONST_INLINE_BORROW, 72, 8, {0x01}}, + [_PUSH_EXC_INFO] = {emit__PUSH_EXC_INFO, 64, 8, {0}}, + [_PUSH_FRAME] = {emit__PUSH_FRAME, 40, 0, {0}}, + [_PUSH_NULL] = {emit__PUSH_NULL, 8, 0, {0}}, + [_PUSH_NULL_CONDITIONAL] = {emit__PUSH_NULL_CONDITIONAL, 32, 8, {0}}, + [_PY_FRAME_GENERAL] = {emit__PY_FRAME_GENERAL, 168, 8, {0x00, 0x400}}, + [_PY_FRAME_KW] = {emit__PY_FRAME_KW, 256, 8, {0x01, 0x400}}, + [_REPLACE_WITH_TRUE] = {emit__REPLACE_WITH_TRUE, 72, 8, {0x01}}, + [_RESUME_CHECK] = {emit__RESUME_CHECK, 32, 0, {0}}, + [_RETURN_GENERATOR] = {emit__RETURN_GENERATOR, 352, 0, {0x00, 0x00, 0x180000}}, + [_RETURN_VALUE] = {emit__RETURN_VALUE, 72, 0, {0x00, 0x200}}, + [_SAVE_RETURN_OFFSET] = {emit__SAVE_RETURN_OFFSET, 16, 8, {0}}, + [_SEND_GEN_FRAME] = {emit__SEND_GEN_FRAME, 128, 24, {0}}, + [_SETUP_ANNOTATIONS] = {emit__SETUP_ANNOTATIONS, 264, 64, {0x01, 0x10000, 0x600080}}, + [_SET_ADD] = {emit__SET_ADD, 128, 8, {0x8001}}, + [_SET_FUNCTION_ATTRIBUTE] = {emit__SET_FUNCTION_ATTRIBUTE, 48, 16, {0}}, + [_SET_IP] = {emit__SET_IP, 16, 8, {0}}, + [_SET_UPDATE] = {emit__SET_UPDATE, 128, 8, {0x01, 0x00, 0x800000}}, + [_START_EXECUTOR] = {emit__START_EXECUTOR, 80, 0, {0x01}}, + [_STORE_ATTR] = {emit__STORE_ATTR, 152, 8, {0x01, 0x00, 0x1000000}}, + [_STORE_ATTR_INSTANCE_VALUE] = {emit__STORE_ATTR_INSTANCE_VALUE, 176, 8, {0x01}}, + [_STORE_ATTR_SLOT] = {emit__STORE_ATTR_SLOT, 128, 8, {0x01}}, + [_STORE_ATTR_WITH_HINT] = {emit__STORE_ATTR_WITH_HINT, 240, 16, {0x01, 0x00, 0x2000000}}, + [_STORE_DEREF] = {emit__STORE_DEREF, 104, 8, {0x01}}, + [_STORE_FAST] = {emit__STORE_FAST, 96, 8, {0x01}}, + [_STORE_FAST_0] = {emit__STORE_FAST_0, 80, 0, {0x01}}, + [_STORE_FAST_1] = {emit__STORE_FAST_1, 80, 0, {0x01}}, + [_STORE_FAST_2] = {emit__STORE_FAST_2, 80, 0, {0x01}}, + [_STORE_FAST_3] = {emit__STORE_FAST_3, 80, 0, {0x01}}, + [_STORE_FAST_4] = {emit__STORE_FAST_4, 80, 0, {0x01}}, + [_STORE_FAST_5] = {emit__STORE_FAST_5, 80, 0, {0x01}}, + [_STORE_FAST_6] = {emit__STORE_FAST_6, 80, 0, {0x01}}, + [_STORE_FAST_7] = {emit__STORE_FAST_7, 80, 0, {0x01}}, + [_STORE_GLOBAL] = {emit__STORE_GLOBAL, 128, 8, {0x01, 0x00, 0x4000000}}, + [_STORE_NAME] = {emit__STORE_NAME, 280, 56, {0x01, 0x10000, 0x4200000}}, + [_STORE_SLICE] = {emit__STORE_SLICE, 208, 0, {0x1001, 0x00, 0x200000}}, + [_STORE_SUBSCR] = {emit__STORE_SUBSCR, 168, 0, {0x01, 0x00, 0x200000}}, + [_STORE_SUBSCR_DICT] = {emit__STORE_SUBSCR_DICT, 144, 8, {0x01, 0x00, 0x10000}}, + [_STORE_SUBSCR_LIST_INT] = {emit__STORE_SUBSCR_LIST_INT, 248, 24, {0x05}}, + [_SWAP] = {emit__SWAP, 32, 8, {0}}, + [_TIER2_RESUME_CHECK] = {emit__TIER2_RESUME_CHECK, 24, 0, {0}}, + [_TO_BOOL] = {emit__TO_BOOL, 128, 16, {0x01, 0x04}}, + [_TO_BOOL_BOOL] = {emit__TO_BOOL_BOOL, 32, 8, {0}}, + [_TO_BOOL_INT] = {emit__TO_BOOL_INT, 128, 24, {0x01}}, + [_TO_BOOL_LIST] = {emit__TO_BOOL_LIST, 104, 24, {0x01}}, + [_TO_BOOL_NONE] = {emit__TO_BOOL_NONE, 40, 16, {0}}, + [_TO_BOOL_STR] = {emit__TO_BOOL_STR, 136, 32, {0x01}}, + [_UNARY_INVERT] = {emit__UNARY_INVERT, 104, 0, {0x01, 0x00, 0x8000000}}, + [_UNARY_NEGATIVE] = {emit__UNARY_NEGATIVE, 104, 0, {0x01, 0x00, 0x10000000}}, + [_UNARY_NOT] = {emit__UNARY_NOT, 40, 16, {0}}, + [_UNPACK_EX] = {emit__UNPACK_EX, 144, 8, {0x01, 0x00, 0x20000000}}, + [_UNPACK_SEQUENCE] = {emit__UNPACK_SEQUENCE, 136, 8, {0x01, 0x00, 0x20000000}}, + [_UNPACK_SEQUENCE_LIST] = {emit__UNPACK_SEQUENCE_LIST, 200, 16, {0x01}}, + [_UNPACK_SEQUENCE_TUPLE] = {emit__UNPACK_SEQUENCE_TUPLE, 192, 16, {0x01}}, + [_UNPACK_SEQUENCE_TWO_TUPLE] = {emit__UNPACK_SEQUENCE_TWO_TUPLE, 144, 8, {0x01}}, + [_WITH_EXCEPT_START] = {emit__WITH_EXCEPT_START, 184, 8, {0x200001, 0x00, 0x40000000}}, + [_YIELD_VALUE] = {emit__YIELD_VALUE, 88, 8, {0}}, +}; + +static const void * const symbols_map[95] = { + [0] = &_Py_Dealloc, + [1] = &_PyFloat_FromDouble_ConsumeInputs, + [2] = &_PyLong_ExactDealloc, + [3] = &_PyLong_Add, + [4] = &_PyUnicode_ExactDealloc, + [5] = &PyUnicode_Concat, + [6] = &PyUnicode_Append, + [7] = &_PyLong_Multiply, + [8] = &_PyErr_SetKeyError, + [9] = &PyDict_GetItemRef, + [10] = &_PyLong_Subtract, + [11] = &PyObject_GetItem, + [12] = &_PyBuildSlice_ConsumeRefs, + [13] = &_PyList_FromStackRefStealOnSuccess, + [14] = &_PyDict_FromItems, + [15] = &PySet_Add, + [16] = &PySet_New, + [17] = &PySlice_New, + [18] = &_PyUnicode_JoinArray, + [19] = &_PyTuple_FromStackRefStealOnSuccess, + [20] = &PyObject_IsInstance, + [21] = &PyObject_Vectorcall, + [22] = &PyLong_FromSsize_t, + [23] = &PyObject_Size, + [24] = &_PyList_AppendTakeRefListResize, + [25] = &PyObject_Str, + [26] = &PySequence_Tuple, + [27] = &PyType_GenericAlloc, + [28] = &PyErr_SetHandledException, + [29] = &_PyEval_ExceptionGroupMatch, + [30] = &_PyEval_CheckExceptStarTypeValid, + [31] = &PyErr_GivenExceptionMatches, + [32] = &_PyEval_CheckExceptTypeValid, + [33] = &_Py_HandlePending, + [34] = &PyObject_IsTrue, + [35] = &PyObject_RichCompare, + [36] = &_PyFloat_ExactDealloc, + [37] = &_PyUnicode_Equal, + [38] = &PySequence_Contains, + [39] = &PyDict_Contains, + [40] = &_PySet_Contains, + [41] = &_PyEval_FrameClearAndPop, + [42] = &_PyEvalFramePushAndInit, + [43] = &PyObject_DelAttr, + [44] = &_PyEval_FormatExcUnbound, + [45] = &_PyEval_FormatExcCheckArg, + [46] = &PyTuple_GetItem, + [47] = &PyDict_Pop, + [48] = &_PyErr_Format, + [49] = &PyObject_DelItem, + [50] = &_PyEval_FormatKwargsError, + [51] = &_PyDict_MergeEx, + [52] = &_PyErr_ExceptionMatches, + [53] = &PyDict_Update, + [54] = &PyErr_Format, + [55] = &_PyOptimizer_Optimize, + [56] = &_Py_FatalErrorFunc, + [57] = &PyObject_Format, + [58] = &_PyErr_Clear, + [59] = &_PyEval_MonitorRaise, + [60] = &_PyEval_GetANext, + [61] = &_PyEval_GetAwaitable, + [62] = &PyObject_GetIter, + [63] = &_PyErr_SetString, + [64] = &_PyEval_ImportFrom, + [65] = &_PyEval_ImportName, + [66] = &PyLong_FromLong, + [67] = &PySequence_Check, + [68] = &_PyList_Extend, + [69] = &_PyObject_GetMethod, + [70] = &PyObject_GetAttr, + [71] = &PyMapping_GetOptionalItem, + [72] = &_PyEval_LoadGlobalStackRef, + [73] = &_PyEval_LoadName, + [74] = &_PyObject_LookupSpecialMethod, + [75] = &_PySuper_Lookup, + [76] = &_Py_Check_ArgsIterable, + [77] = &PyCell_New, + [78] = &_PyFunction_SetVersion, + [79] = &PyFunction_New, + [80] = &_PyDict_SetItem_Take2, + [81] = &_PyEval_MatchClass, + [82] = &_PyEval_MatchKeys, + [83] = &_PyThreadState_PopFrame, + [84] = &_Py_MakeCoro, + [85] = &PyObject_SetItem, + [86] = &PyDict_New, + [87] = &_PySet_Update, + [88] = &PyObject_SetAttr, + [89] = &_PyDict_SendEvent, + [90] = &PyDict_SetItem, + [91] = &PyNumber_Invert, + [92] = &PyNumber_Negative, + [93] = &_PyEval_UnpackIterableStackRef, + [94] = &PyException_GetTraceback, +}; diff --git a/Tools/jit/stencils/aarch64-unknown-linux-gnu.h b/Tools/jit/stencils/aarch64-unknown-linux-gnu.h new file mode 100644 index 00000000000000..7a877a3bf31ab8 --- /dev/null +++ b/Tools/jit/stencils/aarch64-unknown-linux-gnu.h @@ -0,0 +1,24064 @@ +void +emit_shim( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // shim.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 6db63bef stp d15, d14, [sp, #-0xa0]! + // 4: a90857f6 stp x22, x21, [sp, #0x80] + // 8: aa0103f5 mov x21, x1 + // c: aa0203f6 mov x22, x2 + // 10: a9094ff4 stp x20, x19, [sp, #0x90] + // 14: aa0003f4 mov x20, x0 + // 18: 6d0133ed stp d13, d12, [sp, #0x10] + // 1c: 6d022beb stp d11, d10, [sp, #0x20] + // 20: 6d0323e9 stp d9, d8, [sp, #0x30] + // 24: a9047bfd stp x29, x30, [sp, #0x40] + // 28: 910103fd add x29, sp, #0x40 + // 2c: a9056ffc stp x28, x27, [sp, #0x50] + // 30: a90667fa stp x26, x25, [sp, #0x60] + // 34: a9075ff8 stp x24, x23, [sp, #0x70] + // 38: 94000000 bl 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_CALL26 _JIT_CONTINUE + // 3c: a9494ff4 ldp x20, x19, [sp, #0x90] + // 40: a94857f6 ldp x22, x21, [sp, #0x80] + // 44: a9475ff8 ldp x24, x23, [sp, #0x70] + // 48: a94667fa ldp x26, x25, [sp, #0x60] + // 4c: a9456ffc ldp x28, x27, [sp, #0x50] + // 50: a9447bfd ldp x29, x30, [sp, #0x40] + // 54: 6d4323e9 ldp d9, d8, [sp, #0x30] + // 58: 6d422beb ldp d11, d10, [sp, #0x20] + // 5c: 6d4133ed ldp d13, d12, [sp, #0x10] + // 60: 6cca3bef ldp d15, d14, [sp], #0xa0 + // 64: d65f03c0 ret + const unsigned char code_body[104] = { + 0xef, 0x3b, 0xb6, 0x6d, 0xf6, 0x57, 0x08, 0xa9, + 0xf5, 0x03, 0x01, 0xaa, 0xf6, 0x03, 0x02, 0xaa, + 0xf4, 0x4f, 0x09, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xed, 0x33, 0x01, 0x6d, 0xeb, 0x2b, 0x02, 0x6d, + 0xe9, 0x23, 0x03, 0x6d, 0xfd, 0x7b, 0x04, 0xa9, + 0xfd, 0x03, 0x01, 0x91, 0xfc, 0x6f, 0x05, 0xa9, + 0xfa, 0x67, 0x06, 0xa9, 0xf8, 0x5f, 0x07, 0xa9, + 0x00, 0x00, 0x00, 0x94, 0xf4, 0x4f, 0x49, 0xa9, + 0xf6, 0x57, 0x48, 0xa9, 0xf8, 0x5f, 0x47, 0xa9, + 0xfa, 0x67, 0x46, 0xa9, 0xfc, 0x6f, 0x45, 0xa9, + 0xfd, 0x7b, 0x44, 0xa9, 0xe9, 0x23, 0x43, 0x6d, + 0xeb, 0x2b, 0x42, 0x6d, 0xed, 0x33, 0x41, 0x6d, + 0xef, 0x3b, 0xca, 0x6c, 0xc0, 0x03, 0x5f, 0xd6, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyEval_BinaryOps + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyEval_BinaryOps + // 18: a97f4eb8 ldp x24, x19, [x21, #-0x10] + // 1c: f9002295 str x21, [x20, #0x40] + // 20: 92403d08 and x8, x8, #0xffff + // 24: f8687928 ldr x8, [x9, x8, lsl #3] + // 28: aa1803e0 mov x0, x24 + // 2c: aa1303e1 mov x1, x19 + // 30: d63f0100 blr x8 + // 34: f9402299 ldr x25, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: aa0003f7 mov x23, x0 + // 40: b9400308 ldr w8, [x24] + // 44: 37f80108 tbnz w8, #0x1f, 0x64 <_JIT_ENTRY+0x64> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000308 str w8, [x24] + // 50: 540000a1 b.ne 0x64 <_JIT_ENTRY+0x64> + // 54: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000054: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 58: aa1803e0 mov x0, x24 + // 5c: f9400108 ldr x8, [x8] + // 000000000000005c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 60: d63f0100 blr x8 + // 64: b9400268 ldr w8, [x19] + // 68: 37f80088 tbnz w8, #0x1f, 0x78 <_JIT_ENTRY+0x78> + // 6c: 71000508 subs w8, w8, #0x1 + // 70: b9000268 str w8, [x19] + // 74: 540000c0 b.eq 0x8c <_JIT_ENTRY+0x8c> + // 78: b4000157 cbz x23, 0xa0 <_JIT_ENTRY+0xa0> + // 7c: d1002335 sub x21, x25, #0x8 + // 80: f81f0337 stur x23, [x25, #-0x10] + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_CONTINUE + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 90: aa1303e0 mov x0, x19 + // 94: f9400108 ldr x8, [x8] + // 0000000000000094: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 98: d63f0100 blr x8 + // 9c: b5ffff17 cbnz x23, 0x7c <_JIT_ENTRY+0x7c> + // a0: d1004335 sub x21, x25, #0x10 + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // ac: 00 00 00 00 + const unsigned char code_body[176] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb8, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x28, 0x79, 0x68, 0xf8, + 0xe0, 0x03, 0x18, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x57, 0x01, 0x00, 0xb4, 0x35, 0x23, 0x00, 0xd1, + 0x37, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x17, 0xff, 0xff, 0xb5, + 0x35, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_BinaryOps+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_BinaryOps); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x54, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x8c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x94, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xa8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_ADD_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8ea1 ldr x1, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e60 ldr x0, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyFloat_FromDouble_ConsumeInputs + // 14: fd400820 ldr d0, [x1, #0x10] + // 18: 910003fd mov x29, sp + // 1c: fd400801 ldr d1, [x0, #0x10] + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC _PyFloat_FromDouble_ConsumeInputs + // 24: 1e602820 fadd d0, d1, d0 + // 28: d63f0100 blr x8 + // 2c: b4000080 cbz x0, 0x3c <_JIT_ENTRY+0x3c> + // 30: f9000260 str x0, [x19] + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: aa1303f5 mov x21, x19 + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa1, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x60, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x20, 0x08, 0x40, 0xfd, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x08, 0x40, 0xfd, + 0x08, 0x01, 0x40, 0xf9, 0x20, 0x28, 0x60, 0x1e, + 0x00, 0x01, 0x3f, 0xd6, 0x80, 0x00, 0x00, 0xb4, + 0x60, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_ADD_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8eb9 ldr x25, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e78 ldr x24, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyLong_Add + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyLong_Add + // 18: aa1903e1 mov x1, x25 + // 1c: 910003fd mov x29, sp + // 20: aa1803e0 mov x0, x24 + // 24: d63f0100 blr x8 + // 28: b9400328 ldr w8, [x25] + // 2c: aa0003f7 mov x23, x0 + // 30: 37f80208 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000328 str w8, [x25] + // 3c: 540001a1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 40: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 48: f9544928 ldr x8, [x9, #0x2890] + // 4c: b40000a8 cbz x8, 0x60 <_JIT_ENTRY+0x60> + // 50: f9544d22 ldr x2, [x9, #0x2898] + // 54: aa1903e0 mov x0, x25 + // 58: 52800021 mov w1, #0x1 // =1 + // 5c: d63f0100 blr x8 + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // 64: aa1903e0 mov x0, x25 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // 6c: d63f0100 blr x8 + // 70: b9400308 ldr w8, [x24] + // 74: 37f80088 tbnz w8, #0x1f, 0x84 <_JIT_ENTRY+0x84> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b9000308 str w8, [x24] + // 80: 540000a0 b.eq 0x94 <_JIT_ENTRY+0x94> + // 84: b4000237 cbz x23, 0xc8 <_JIT_ENTRY+0xc8> + // 88: f9000277 str x23, [x19] + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 98: f9400129 ldr x9, [x9] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 9c: f9544928 ldr x8, [x9, #0x2890] + // a0: b40000a8 cbz x8, 0xb4 <_JIT_ENTRY+0xb4> + // a4: f9544d22 ldr x2, [x9, #0x2898] + // a8: aa1803e0 mov x0, x24 + // ac: 52800021 mov w1, #0x1 // =1 + // b0: d63f0100 blr x8 + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // b8: aa1803e0 mov x0, x24 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // c0: d63f0100 blr x8 + // c4: b5fffe37 cbnz x23, 0x88 <_JIT_ENTRY+0x88> + // c8: aa1303f5 mov x21, x19 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // d4: 00 00 00 00 + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb9, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x78, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x19, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x28, 0x03, 0x40, 0xb9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x19, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x37, 0x02, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x37, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Add+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Add); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_UNICODE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8eb9 ldr x25, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e78 ldr x24, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE PyUnicode_Concat + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Concat + // 18: aa1903e1 mov x1, x25 + // 1c: 910003fd mov x29, sp + // 20: aa1803e0 mov x0, x24 + // 24: d63f0100 blr x8 + // 28: b9400328 ldr w8, [x25] + // 2c: aa0003f7 mov x23, x0 + // 30: 37f80208 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000328 str w8, [x25] + // 3c: 540001a1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 40: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 48: f9544928 ldr x8, [x9, #0x2890] + // 4c: b40000a8 cbz x8, 0x60 <_JIT_ENTRY+0x60> + // 50: f9544d22 ldr x2, [x9, #0x2898] + // 54: aa1903e0 mov x0, x25 + // 58: 52800021 mov w1, #0x1 // =1 + // 5c: d63f0100 blr x8 + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _PyUnicode_ExactDealloc + // 64: aa1903e0 mov x0, x25 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_ExactDealloc + // 6c: d63f0100 blr x8 + // 70: b9400308 ldr w8, [x24] + // 74: 37f80088 tbnz w8, #0x1f, 0x84 <_JIT_ENTRY+0x84> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b9000308 str w8, [x24] + // 80: 540000a0 b.eq 0x94 <_JIT_ENTRY+0x94> + // 84: b4000237 cbz x23, 0xc8 <_JIT_ENTRY+0xc8> + // 88: f9000277 str x23, [x19] + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 98: f9400129 ldr x9, [x9] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 9c: f9544928 ldr x8, [x9, #0x2890] + // a0: b40000a8 cbz x8, 0xb4 <_JIT_ENTRY+0xb4> + // a4: f9544d22 ldr x2, [x9, #0x2898] + // a8: aa1803e0 mov x0, x24 + // ac: 52800021 mov w1, #0x1 // =1 + // b0: d63f0100 blr x8 + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyUnicode_ExactDealloc + // b8: aa1803e0 mov x0, x24 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_ExactDealloc + // c0: d63f0100 blr x8 + // c4: b5fffe37 cbnz x23, 0x88 <_JIT_ENTRY+0x88> + // c8: aa1303f5 mov x21, x19 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // d4: 00 00 00 00 + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb9, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x78, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x19, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x28, 0x03, 0x40, 0xb9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x19, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x37, 0x02, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x37, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Concat+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Concat); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_EXTEND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 10: a97f4eb8 ldp x24, x19, [x21, #-0x10] + // 14: f9002295 str x21, [x20, #0x40] + // 18: f9400908 ldr x8, [x8, #0x10] + // 1c: aa1803e0 mov x0, x24 + // 20: aa1303e1 mov x1, x19 + // 24: d63f0100 blr x8 + // 28: f9402299 ldr x25, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: aa0003f7 mov x23, x0 + // 34: b9400308 ldr w8, [x24] + // 38: 37f80108 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b9000308 str w8, [x24] + // 44: 540000a1 b.ne 0x58 <_JIT_ENTRY+0x58> + // 48: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000048: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 4c: aa1803e0 mov x0, x24 + // 50: f9400108 ldr x8, [x8] + // 0000000000000050: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 54: d63f0100 blr x8 + // 58: b9400268 ldr w8, [x19] + // 5c: 37f80088 tbnz w8, #0x1f, 0x6c <_JIT_ENTRY+0x6c> + // 60: 71000508 subs w8, w8, #0x1 + // 64: b9000268 str w8, [x19] + // 68: 540000a0 b.eq 0x7c <_JIT_ENTRY+0x7c> + // 6c: d1002335 sub x21, x25, #0x8 + // 70: f81f0337 stur x23, [x25, #-0x10] + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 <_JIT_ENTRY+0x78> + // 0000000000000078: R_AARCH64_JUMP26 _JIT_CONTINUE + // 7c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000007c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 80: aa1303e0 mov x0, x19 + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 88: d63f0100 blr x8 + // 8c: d1002335 sub x21, x25, #0x8 + // 90: f81f0337 stur x23, [x25, #-0x10] + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xb8, 0x4e, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x09, 0x40, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xf7, 0x03, 0x00, 0xaa, 0x08, 0x03, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x35, 0x23, 0x00, 0xd1, + 0x37, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x35, 0x23, 0x00, 0xd1, + 0x37, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x50, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x7c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x84, (uintptr_t)data + 0x8); +} + +void +emit__BINARY_OP_INPLACE_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_INPLACE_ADD_UNICODE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000018 adrp x24, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: 91014299 add x25, x20, #0x50 + // 8: aa1503e8 mov x8, x21 + // c: f9400318 ldr x24, [x24] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 10: f85f0eb7 ldr x23, [x21, #-0x10]! + // 14: f878db29 ldr x9, [x25, w24, sxtw #3] + // 18: eb17013f cmp x9, x23 + // 1c: 54000060 b.eq 0x28 <_JIT_ENTRY+0x28> + // 20: aa0803f5 mov x21, x8 + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 28: d10083ff sub sp, sp, #0x20 + // 2c: b94002e9 ldr w9, [x23] + // 30: f85f8113 ldur x19, [x8, #-0x8] + // 34: a9017bfd stp x29, x30, [sp, #0x10] + // 38: 910043fd add x29, sp, #0x10 + // 3c: 37f80209 tbnz w9, #0x1f, 0x7c <_JIT_ENTRY+0x7c> + // 40: 71000528 subs w8, w9, #0x1 + // 44: b90002e8 str w8, [x23] + // 48: 540001a1 b.ne 0x7c <_JIT_ENTRY+0x7c> + // 4c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 50: f9400129 ldr x9, [x9] + // 0000000000000050: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 54: f9544928 ldr x8, [x9, #0x2890] + // 58: b40000a8 cbz x8, 0x6c <_JIT_ENTRY+0x6c> + // 5c: f9544d22 ldr x2, [x9, #0x2898] + // 60: aa1703e0 mov x0, x23 + // 64: 52800021 mov w1, #0x1 // =1 + // 68: d63f0100 blr x8 + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _PyUnicode_ExactDealloc + // 70: aa1703e0 mov x0, x23 + // 74: f9400108 ldr x8, [x8] + // 0000000000000074: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_ExactDealloc + // 78: d63f0100 blr x8 + // 7c: f878db28 ldr x8, [x25, w24, sxtw #3] + // 80: 910023e0 add x0, sp, #0x8 + // 84: aa1303e1 mov x1, x19 + // 88: f90007e8 str x8, [sp, #0x8] + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE PyUnicode_Append + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Append + // 94: d63f0100 blr x8 + // 98: f94007e8 ldr x8, [sp, #0x8] + // 9c: f838db28 str x8, [x25, w24, sxtw #3] + // a0: b9400269 ldr w9, [x19] + // a4: 37f80229 tbnz w9, #0x1f, 0xe8 <_JIT_ENTRY+0xe8> + // a8: 71000528 subs w8, w9, #0x1 + // ac: b9000268 str w8, [x19] + // b0: 540001a1 b.ne 0xe4 <_JIT_ENTRY+0xe4> + // b4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // b8: f9400129 ldr x9, [x9] + // 00000000000000b8: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // bc: f9544928 ldr x8, [x9, #0x2890] + // c0: b40000a8 cbz x8, 0xd4 <_JIT_ENTRY+0xd4> + // c4: f9544d22 ldr x2, [x9, #0x2898] + // c8: aa1303e0 mov x0, x19 + // cc: 52800021 mov w1, #0x1 // =1 + // d0: d63f0100 blr x8 + // d4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d4: R_AARCH64_ADR_GOT_PAGE _PyUnicode_ExactDealloc + // d8: aa1303e0 mov x0, x19 + // dc: f9400108 ldr x8, [x8] + // 00000000000000dc: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_ExactDealloc + // e0: d63f0100 blr x8 + // e4: f878db28 ldr x8, [x25, w24, sxtw #3] + // e8: a9417bfd ldp x29, x30, [sp, #0x10] + // ec: 910083ff add sp, sp, #0x20 + // f0: b4000048 cbz x8, 0xf8 <_JIT_ENTRY+0xf8> + // f4: 14000000 b 0xf4 <_JIT_ENTRY+0xf4> + // 00000000000000f4: R_AARCH64_JUMP26 _JIT_CONTINUE + // f8: 14000000 b 0xf8 <_JIT_ENTRY+0xf8> + // 00000000000000f8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // fc: 00 00 00 00 + const unsigned char code_body[256] = { + 0x18, 0x00, 0x00, 0x90, 0x99, 0x42, 0x01, 0x91, + 0xe8, 0x03, 0x15, 0xaa, 0x18, 0x03, 0x40, 0xf9, + 0xb7, 0x0e, 0x5f, 0xf8, 0x29, 0xdb, 0x78, 0xf8, + 0x3f, 0x01, 0x17, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xf5, 0x03, 0x08, 0xaa, 0x00, 0x00, 0x00, 0x14, + 0xff, 0x83, 0x00, 0xd1, 0xe9, 0x02, 0x40, 0xb9, + 0x13, 0x81, 0x5f, 0xf8, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0x09, 0x02, 0xf8, 0x37, + 0x28, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x28, 0xdb, 0x78, 0xf8, + 0xe0, 0x23, 0x00, 0x91, 0xe1, 0x03, 0x13, 0xaa, + 0xe8, 0x07, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x07, 0x40, 0xf9, 0x28, 0xdb, 0x38, 0xf8, + 0x69, 0x02, 0x40, 0xb9, 0x29, 0x02, 0xf8, 0x37, + 0x28, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x28, 0xdb, 0x78, 0xf8, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x48, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + // 18: &PyUnicode_Append+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)&PyUnicode_Append); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x6c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x8c, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0xb4, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xd4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xdc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xf4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xf8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_MULTIPLY_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8ea1 ldr x1, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e60 ldr x0, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyFloat_FromDouble_ConsumeInputs + // 14: fd400820 ldr d0, [x1, #0x10] + // 18: 910003fd mov x29, sp + // 1c: fd400801 ldr d1, [x0, #0x10] + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC _PyFloat_FromDouble_ConsumeInputs + // 24: 1e600820 fmul d0, d1, d0 + // 28: d63f0100 blr x8 + // 2c: b4000080 cbz x0, 0x3c <_JIT_ENTRY+0x3c> + // 30: f9000260 str x0, [x19] + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: aa1303f5 mov x21, x19 + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa1, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x60, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x20, 0x08, 0x40, 0xfd, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x08, 0x40, 0xfd, + 0x08, 0x01, 0x40, 0xf9, 0x20, 0x08, 0x60, 0x1e, + 0x00, 0x01, 0x3f, 0xd6, 0x80, 0x00, 0x00, 0xb4, + 0x60, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_MULTIPLY_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8eb9 ldr x25, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e78 ldr x24, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyLong_Multiply + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyLong_Multiply + // 18: aa1903e1 mov x1, x25 + // 1c: 910003fd mov x29, sp + // 20: aa1803e0 mov x0, x24 + // 24: d63f0100 blr x8 + // 28: b9400328 ldr w8, [x25] + // 2c: aa0003f7 mov x23, x0 + // 30: 37f80208 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000328 str w8, [x25] + // 3c: 540001a1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 40: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 48: f9544928 ldr x8, [x9, #0x2890] + // 4c: b40000a8 cbz x8, 0x60 <_JIT_ENTRY+0x60> + // 50: f9544d22 ldr x2, [x9, #0x2898] + // 54: aa1903e0 mov x0, x25 + // 58: 52800021 mov w1, #0x1 // =1 + // 5c: d63f0100 blr x8 + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // 64: aa1903e0 mov x0, x25 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // 6c: d63f0100 blr x8 + // 70: b9400308 ldr w8, [x24] + // 74: 37f80088 tbnz w8, #0x1f, 0x84 <_JIT_ENTRY+0x84> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b9000308 str w8, [x24] + // 80: 540000a0 b.eq 0x94 <_JIT_ENTRY+0x94> + // 84: b4000237 cbz x23, 0xc8 <_JIT_ENTRY+0xc8> + // 88: f9000277 str x23, [x19] + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 98: f9400129 ldr x9, [x9] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 9c: f9544928 ldr x8, [x9, #0x2890] + // a0: b40000a8 cbz x8, 0xb4 <_JIT_ENTRY+0xb4> + // a4: f9544d22 ldr x2, [x9, #0x2898] + // a8: aa1803e0 mov x0, x24 + // ac: 52800021 mov w1, #0x1 // =1 + // b0: d63f0100 blr x8 + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // b8: aa1803e0 mov x0, x24 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // c0: d63f0100 blr x8 + // c4: b5fffe37 cbnz x23, 0x88 <_JIT_ENTRY+0x88> + // c8: aa1303f5 mov x21, x19 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // d4: 00 00 00 00 + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb9, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x78, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x19, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x28, 0x03, 0x40, 0xb9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x19, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x37, 0x02, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x37, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Multiply+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Multiply); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_SUBSCR_CHECK_FUNC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_CHECK_FUNC.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 3942a528 ldrb w8, [x9, #0xa9] + // c: 360802a8 tbz w8, #0x1, 0x60 <_JIT_ENTRY+0x60> + // 10: f941c928 ldr x8, [x9, #0x390] + // 14: b4000268 cbz x8, 0x60 <_JIT_ENTRY+0x60> + // 18: b9439929 ldr w9, [x9, #0x398] + // 1c: b940910a ldr w10, [x8, #0x90] + // 20: 6b09015f cmp w10, w9 + // 24: 540001e1 b.ne 0x60 <_JIT_ENTRY+0x60> + // 28: f9407ac9 ldr x9, [x22, #0xf0] + // 2c: b40001a9 cbz x9, 0x60 <_JIT_ENTRY+0x60> + // 30: f940190a ldr x10, [x8, #0x30] + // 34: f9407ecb ldr x11, [x22, #0xf8] + // 38: b9804d4a ldrsw x10, [x10, #0x4c] + // 3c: cb090169 sub x9, x11, x9 + // 40: eb890d5f cmp x10, x9, asr #3 + // 44: 540000ea b.ge 0x60 <_JIT_ENTRY+0x60> + // 48: b9400109 ldr w9, [x8] + // 4c: 37f80069 tbnz w9, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 50: 11000529 add w9, w9, #0x1 + // 54: b9000109 str w9, [x8] + // 58: f80086a8 str x8, [x21], #0x8 + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x28, 0xa5, 0x42, 0x39, 0xa8, 0x02, 0x08, 0x36, + 0x28, 0xc9, 0x41, 0xf9, 0x68, 0x02, 0x00, 0xb4, + 0x29, 0x99, 0x43, 0xb9, 0x0a, 0x91, 0x40, 0xb9, + 0x5f, 0x01, 0x09, 0x6b, 0xe1, 0x01, 0x00, 0x54, + 0xc9, 0x7a, 0x40, 0xf9, 0xa9, 0x01, 0x00, 0xb4, + 0x0a, 0x19, 0x40, 0xf9, 0xcb, 0x7e, 0x40, 0xf9, + 0x4a, 0x4d, 0x80, 0xb9, 0x69, 0x01, 0x09, 0xcb, + 0x5f, 0x0d, 0x89, 0xeb, 0xea, 0x00, 0x00, 0x54, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x5c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->jump_target]); +} + +void +emit__BINARY_OP_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: f85f02b8 ldur x24, [x21, #-0x10] + // 8: a9017bfd stp x29, x30, [sp, #0x10] + // c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // 10: 910043fd add x29, sp, #0x10 + // 14: f9400708 ldr x8, [x24, #0x8] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 1c: eb09011f cmp x8, x9 + // 20: 54000080 b.eq 0x30 <_JIT_ENTRY+0x30> + // 24: a9417bfd ldp x29, x30, [sp, #0x10] + // 28: 910083ff add sp, sp, #0x20 + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 30: f85f82b3 ldur x19, [x21, #-0x8] + // 34: f9002295 str x21, [x20, #0x40] + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE PyDict_GetItemRef + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC PyDict_GetItemRef + // 40: 910023e2 add x2, sp, #0x8 + // 44: aa1803e0 mov x0, x24 + // 48: aa1303e1 mov x1, x19 + // 4c: d63f0100 blr x8 + // 50: f9402299 ldr x25, [x20, #0x40] + // 54: 2a0003f7 mov w23, w0 + // 58: f900229f str xzr, [x20, #0x40] + // 5c: 35000100 cbnz w0, 0x7c <_JIT_ENTRY+0x7c> + // 60: f9002299 str x25, [x20, #0x40] + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _PyErr_SetKeyError + // 68: aa1303e0 mov x0, x19 + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _PyErr_SetKeyError + // 70: d63f0100 blr x8 + // 74: f9402299 ldr x25, [x20, #0x40] + // 78: f900229f str xzr, [x20, #0x40] + // 7c: b9400308 ldr w8, [x24] + // 80: 37f80108 tbnz w8, #0x1f, 0xa0 <_JIT_ENTRY+0xa0> + // 84: 71000508 subs w8, w8, #0x1 + // 88: b9000308 str w8, [x24] + // 8c: 540000a1 b.ne 0xa0 <_JIT_ENTRY+0xa0> + // 90: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 94: aa1803e0 mov x0, x24 + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 9c: d63f0100 blr x8 + // a0: b9400268 ldr w8, [x19] + // a4: 37f80088 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // a8: 71000508 subs w8, w8, #0x1 + // ac: b9000268 str w8, [x19] + // b0: 54000120 b.eq 0xd4 <_JIT_ENTRY+0xd4> + // b4: 710002ff cmp w23, #0x0 + // b8: 540001ad b.le 0xec <_JIT_ENTRY+0xec> + // bc: f94007e8 ldr x8, [sp, #0x8] + // c0: a9417bfd ldp x29, x30, [sp, #0x10] + // c4: d1002335 sub x21, x25, #0x8 + // c8: f81f0328 stur x8, [x25, #-0x10] + // cc: 910083ff add sp, sp, #0x20 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_CONTINUE + // d4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d8: aa1303e0 mov x0, x19 + // dc: f9400108 ldr x8, [x8] + // 00000000000000dc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // e0: d63f0100 blr x8 + // e4: 710002ff cmp w23, #0x0 + // e8: 54fffeac b.gt 0xbc <_JIT_ENTRY+0xbc> + // ec: a9417bfd ldp x29, x30, [sp, #0x10] + // f0: d1004335 sub x21, x25, #0x10 + // f4: 910083ff add sp, sp, #0x20 + // f8: 14000000 b 0xf8 <_JIT_ENTRY+0xf8> + // 00000000000000f8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // fc: 00 00 00 00 + const unsigned char code_body[256] = { + 0xff, 0x83, 0x00, 0xd1, 0xb8, 0x02, 0x5f, 0xf8, + 0xfd, 0x7b, 0x01, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0xfd, 0x43, 0x00, 0x91, 0x08, 0x07, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x80, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xb3, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe2, 0x23, 0x00, 0x91, 0xe0, 0x03, 0x18, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x99, 0x22, 0x40, 0xf9, 0xf7, 0x03, 0x00, 0x2a, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x01, 0x00, 0x35, + 0x99, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x08, 0x03, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x20, 0x01, 0x00, 0x54, 0xff, 0x02, 0x00, 0x71, + 0xad, 0x01, 0x00, 0x54, 0xe8, 0x07, 0x40, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0x35, 0x23, 0x00, 0xd1, + 0x28, 0x03, 0x1f, 0xf8, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x02, 0x00, 0x71, + 0xac, 0xfe, 0xff, 0x54, 0xfd, 0x7b, 0x41, 0xa9, + 0x35, 0x43, 0x00, 0xd1, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: &PyDict_GetItemRef+0x0 + // 10: &_PyErr_SetKeyError+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, (uintptr_t)&PyDict_GetItemRef); + patch_64(data + 0x10, (uintptr_t)&_PyErr_SetKeyError); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x90, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x98, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xd0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xd4, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xdc, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xf8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_SUBSCR_INIT_CALL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_INIT_CALL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82ab ldur x11, [x21, #-0x8] + // 4: f9407ac9 ldr x9, [x22, #0xf0] + // 8: aa1503e8 mov x8, x21 + // c: 3cde82a0 ldur q0, [x21, #-0x18] + // 10: f940196a ldr x10, [x11, #0x30] + // 14: b9804d4c ldrsw x12, [x10, #0x4c] + // 18: 8b0c0d2c add x12, x9, x12, lsl #3 + // 1c: f9007acc str x12, [x22, #0xf0] + // 20: a900ad34 stp x20, x11, [x9, #0x8] + // 24: b940014c ldr w12, [x10] + // 28: 37f8006c tbnz w12, #0x1f, 0x34 <_JIT_ENTRY+0x34> + // 2c: 1100058c add w12, w12, #0x1 + // 30: b900014c str w12, [x10] + // 34: f900012a str x10, [x9] + // 38: 9103414d add x13, x10, #0xd0 + // 3c: b980494c ldrsw x12, [x10, #0x48] + // 40: 3dc00561 ldr q1, [x11, #0x10] + // 44: a902fd3f stp xzr, xzr, [x9, #0x28] + // 48: b900493f str wzr, [x9, #0x48] + // 4c: 8b0c0d2b add x11, x9, x12, lsl #3 + // 50: 71000d9f cmp w12, #0x3 + // 54: 3c818121 stur q1, [x9, #0x18] + // 58: 9101416b add x11, x11, #0x50 + // 5c: a903ad2d stp x13, x11, [x9, #0x38] + // 60: 5400010b b.lt 0x80 <_JIT_ENTRY+0x80> + // 64: 9101812b add x11, x9, #0x60 + // 68: 5280004c mov w12, #0x2 // =2 + // 6c: f800857f str xzr, [x11], #0x8 + // 70: 9100058c add x12, x12, #0x1 + // 74: b980494d ldrsw x13, [x10, #0x48] + // 78: eb0d019f cmp x12, x13 + // 7c: 54ffff8b b.lt 0x6c <_JIT_ENTRY+0x6c> + // 80: 528000ca mov w10, #0x6 // =6 + // 84: d1004115 sub x21, x8, #0x10 + // 88: 3d801520 str q0, [x9, #0x50] + // 8c: 7900928a strh w10, [x20, #0x48] + // 90: f81e8109 stur x9, [x8, #-0x18] + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0xab, 0x82, 0x5f, 0xf8, 0xc9, 0x7a, 0x40, 0xf9, + 0xe8, 0x03, 0x15, 0xaa, 0xa0, 0x82, 0xde, 0x3c, + 0x6a, 0x19, 0x40, 0xf9, 0x4c, 0x4d, 0x80, 0xb9, + 0x2c, 0x0d, 0x0c, 0x8b, 0xcc, 0x7a, 0x00, 0xf9, + 0x34, 0xad, 0x00, 0xa9, 0x4c, 0x01, 0x40, 0xb9, + 0x6c, 0x00, 0xf8, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x4c, 0x01, 0x00, 0xb9, 0x2a, 0x01, 0x00, 0xf9, + 0x4d, 0x41, 0x03, 0x91, 0x4c, 0x49, 0x80, 0xb9, + 0x61, 0x05, 0xc0, 0x3d, 0x3f, 0xfd, 0x02, 0xa9, + 0x3f, 0x49, 0x00, 0xb9, 0x2b, 0x0d, 0x0c, 0x8b, + 0x9f, 0x0d, 0x00, 0x71, 0x21, 0x81, 0x81, 0x3c, + 0x6b, 0x41, 0x01, 0x91, 0x2d, 0xad, 0x03, 0xa9, + 0x0b, 0x01, 0x00, 0x54, 0x2b, 0x81, 0x01, 0x91, + 0x4c, 0x00, 0x80, 0x52, 0x7f, 0x85, 0x00, 0xf8, + 0x8c, 0x05, 0x00, 0x91, 0x4d, 0x49, 0x80, 0xb9, + 0x9f, 0x01, 0x0d, 0xeb, 0x8b, 0xff, 0xff, 0x54, + 0xca, 0x00, 0x80, 0x52, 0x15, 0x41, 0x00, 0xd1, + 0x20, 0x15, 0x80, 0x3d, 0x8a, 0x92, 0x00, 0x79, + 0x09, 0x81, 0x1e, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_LIST_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f8 mov x24, x21 + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: a9ff5f13 ldp x19, x23, [x24, #-0x10]! + // c: f94006e8 ldr x8, [x23, #0x8] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 14: eb09011f cmp x8, x9 + // 18: 540006c1 b.ne 0xf0 <_JIT_ENTRY+0xf0> + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE PyList_Type + // 20: f9400668 ldr x8, [x19, #0x8] + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC PyList_Type + // 28: eb09011f cmp x8, x9 + // 2c: 54000621 b.ne 0xf0 <_JIT_ENTRY+0xf0> + // 30: f9400ae8 ldr x8, [x23, #0x10] + // 34: 927df908 and x8, x8, #0xfffffffffffffffb + // 38: f100251f cmp x8, #0x9 + // 3c: 540005a2 b.hs 0xf0 <_JIT_ENTRY+0xf0> + // 40: b9401ae8 ldr w8, [x23, #0x18] + // 44: f9400a69 ldr x9, [x19, #0x10] + // 48: eb08013f cmp x9, x8 + // 4c: 5400052d b.le 0xf0 <_JIT_ENTRY+0xf0> + // 50: f9400e69 ldr x9, [x19, #0x18] + // 54: f8687939 ldr x25, [x9, x8, lsl #3] + // 58: b9400328 ldr w8, [x25] + // 5c: 37f80068 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 60: 11000508 add w8, w8, #0x1 + // 64: b9000328 str w8, [x25] + // 68: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 6c: b94002e8 ldr w8, [x23] + // 70: 910003fd mov x29, sp + // 74: 37f80208 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b90002e8 str w8, [x23] + // 80: 540001a1 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // 84: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 8c: f9544928 ldr x8, [x9, #0x2890] + // 90: b40000a8 cbz x8, 0xa4 <_JIT_ENTRY+0xa4> + // 94: f9544d22 ldr x2, [x9, #0x2898] + // 98: aa1703e0 mov x0, x23 + // 9c: 52800021 mov w1, #0x1 // =1 + // a0: d63f0100 blr x8 + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // a8: aa1703e0 mov x0, x23 + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // b0: d63f0100 blr x8 + // b4: f9002298 str x24, [x20, #0x40] + // b8: b9400268 ldr w8, [x19] + // bc: 37f80108 tbnz w8, #0x1f, 0xdc <_JIT_ENTRY+0xdc> + // c0: 71000508 subs w8, w8, #0x1 + // c4: b9000268 str w8, [x19] + // c8: 540000a1 b.ne 0xdc <_JIT_ENTRY+0xdc> + // cc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d0: aa1303e0 mov x0, x19 + // d4: f9400108 ldr x8, [x8] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d8: d63f0100 blr x8 + // dc: f9402295 ldr x21, [x20, #0x40] + // e0: f900229f str xzr, [x20, #0x40] + // e4: f80086b9 str x25, [x21], #0x8 + // e8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ec: 14000000 b 0xec <_JIT_ENTRY+0xec> + // 00000000000000ec: R_AARCH64_JUMP26 _JIT_CONTINUE + // f0: 14000000 b 0xf0 <_JIT_ENTRY+0xf0> + // 00000000000000f0: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // f4: 00 00 00 00 + const unsigned char code_body[248] = { + 0xf8, 0x03, 0x15, 0xaa, 0x09, 0x00, 0x00, 0x90, + 0x13, 0x5f, 0xff, 0xa9, 0xe8, 0x06, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0xc1, 0x06, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x21, 0x06, 0x00, 0x54, + 0xe8, 0x0a, 0x40, 0xf9, 0x08, 0xf9, 0x7d, 0x92, + 0x1f, 0x25, 0x00, 0xf1, 0xa2, 0x05, 0x00, 0x54, + 0xe8, 0x1a, 0x40, 0xb9, 0x69, 0x0a, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x2d, 0x05, 0x00, 0x54, + 0x69, 0x0e, 0x40, 0xf9, 0x39, 0x79, 0x68, 0xf8, + 0x28, 0x03, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x28, 0x03, 0x00, 0xb9, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe8, 0x02, 0x40, 0xb9, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x02, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb9, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyList_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xcc, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xd4, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0xec, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xf0, state->instruction_starts[instruction->jump_target]); +} + +void +emit__BINARY_OP_SUBSCR_STR_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_STR_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f8 mov x24, x21 + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: a9ff5f13 ldp x19, x23, [x24, #-0x10]! + // c: f94006e8 ldr x8, [x23, #0x8] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 14: eb09011f cmp x8, x9 + // 18: 540006a1 b.ne 0xec <_JIT_ENTRY+0xec> + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE PyUnicode_Type + // 20: f9400668 ldr x8, [x19, #0x8] + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Type + // 28: eb09011f cmp x8, x9 + // 2c: 54000601 b.ne 0xec <_JIT_ENTRY+0xec> + // 30: f9400ae8 ldr x8, [x23, #0x10] + // 34: 927df908 and x8, x8, #0xfffffffffffffffb + // 38: f100251f cmp x8, #0x9 + // 3c: 54000582 b.hs 0xec <_JIT_ENTRY+0xec> + // 40: b9401ae8 ldr w8, [x23, #0x18] + // 44: f9400a69 ldr x9, [x19, #0x10] + // 48: eb08013f cmp x9, x8 + // 4c: 5400050d b.le 0xec <_JIT_ENTRY+0xec> + // 50: 79404669 ldrh w9, [x19, #0x22] + // 54: 1200092a and w10, w9, #0x7 + // 58: 7100095f cmp w10, #0x2 + // 5c: 540000e0 b.eq 0x78 <_JIT_ENTRY+0x78> + // 60: 7100055f cmp w10, #0x1 + // 64: 54000121 b.ne 0x88 <_JIT_ENTRY+0x88> + // 68: 37180169 tbnz w9, #0x3, 0x94 <_JIT_ENTRY+0x94> + // 6c: f9401e69 ldr x9, [x19, #0x38] + // 70: 38686939 ldrb w25, [x9, x8] + // 74: 1400001c b 0xe4 <_JIT_ENTRY+0xe4> + // 78: 371801c9 tbnz w9, #0x3, 0xb0 <_JIT_ENTRY+0xb0> + // 7c: f9401e69 ldr x9, [x19, #0x38] + // 80: 78687939 ldrh w25, [x9, x8, lsl #1] + // 84: 14000018 b 0xe4 <_JIT_ENTRY+0xe4> + // 88: 37180229 tbnz w9, #0x3, 0xcc <_JIT_ENTRY+0xcc> + // 8c: f9401e69 ldr x9, [x19, #0x38] + // 90: 14000014 b 0xe0 <_JIT_ENTRY+0xe0> + // 94: 721c013f tst w9, #0x10 + // 98: 52800509 mov w9, #0x28 // =40 + // 9c: 5280070a mov w10, #0x38 // =56 + // a0: 9a890149 csel x9, x10, x9, eq + // a4: 8b090269 add x9, x19, x9 + // a8: 38686939 ldrb w25, [x9, x8] + // ac: 1400000e b 0xe4 <_JIT_ENTRY+0xe4> + // b0: 721c013f tst w9, #0x10 + // b4: 52800509 mov w9, #0x28 // =40 + // b8: 5280070a mov w10, #0x38 // =56 + // bc: 9a890149 csel x9, x10, x9, eq + // c0: 8b090269 add x9, x19, x9 + // c4: 78687939 ldrh w25, [x9, x8, lsl #1] + // c8: 14000007 b 0xe4 <_JIT_ENTRY+0xe4> + // cc: 721c013f tst w9, #0x10 + // d0: 52800509 mov w9, #0x28 // =40 + // d4: 5280070a mov w10, #0x38 // =56 + // d8: 9a890149 csel x9, x10, x9, eq + // dc: 8b090269 add x9, x19, x9 + // e0: b8687939 ldr w25, [x9, x8, lsl #2] + // e4: 7102033f cmp w25, #0x80 + // e8: 54000043 b.lo 0xf0 <_JIT_ENTRY+0xf0> + // ec: 14000000 b 0xec <_JIT_ENTRY+0xec> + // 00000000000000ec: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // f0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // f4: 90000015 adrp x21, 0x0 <_JIT_ENTRY> + // 00000000000000f4: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // f8: b94002e8 ldr w8, [x23] + // fc: 910003fd mov x29, sp + // 100: f94002b5 ldr x21, [x21] + // 0000000000000100: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 104: 37f801c8 tbnz w8, #0x1f, 0x13c <_JIT_ENTRY+0x13c> + // 108: 71000508 subs w8, w8, #0x1 + // 10c: b90002e8 str w8, [x23] + // 110: 54000161 b.ne 0x13c <_JIT_ENTRY+0x13c> + // 114: f9544aa8 ldr x8, [x21, #0x2890] + // 118: b40000a8 cbz x8, 0x12c <_JIT_ENTRY+0x12c> + // 11c: f9544ea2 ldr x2, [x21, #0x2898] + // 120: aa1703e0 mov x0, x23 + // 124: 52800021 mov w1, #0x1 // =1 + // 128: d63f0100 blr x8 + // 12c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000012c: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // 130: aa1703e0 mov x0, x23 + // 134: f9400108 ldr x8, [x8] + // 0000000000000134: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // 138: d63f0100 blr x8 + // 13c: f9002298 str x24, [x20, #0x40] + // 140: b9400268 ldr w8, [x19] + // 144: 37f80108 tbnz w8, #0x1f, 0x164 <_JIT_ENTRY+0x164> + // 148: 71000508 subs w8, w8, #0x1 + // 14c: b9000268 str w8, [x19] + // 150: 540000a1 b.ne 0x164 <_JIT_ENTRY+0x164> + // 154: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000154: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 158: aa1303e0 mov x0, x19 + // 15c: f9400108 ldr x8, [x8] + // 000000000000015c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 160: d63f0100 blr x8 + // 164: 52800608 mov w8, #0x30 // =48 + // 168: 9ba85728 umaddl x8, w25, w8, x21 + // 16c: f9402295 ldr x21, [x20, #0x40] + // 170: f900229f str xzr, [x20, #0x40] + // 174: 91404908 add x8, x8, #0x12, lsl #12 // =0x12000 + // 178: 910de108 add x8, x8, #0x378 + // 17c: f80086a8 str x8, [x21], #0x8 + // 180: a8c17bfd ldp x29, x30, [sp], #0x10 + // 184: 14000000 b 0x184 <_JIT_ENTRY+0x184> + // 0000000000000184: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[392] = { + 0xf8, 0x03, 0x15, 0xaa, 0x09, 0x00, 0x00, 0x90, + 0x13, 0x5f, 0xff, 0xa9, 0xe8, 0x06, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0xa1, 0x06, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x01, 0x06, 0x00, 0x54, + 0xe8, 0x0a, 0x40, 0xf9, 0x08, 0xf9, 0x7d, 0x92, + 0x1f, 0x25, 0x00, 0xf1, 0x82, 0x05, 0x00, 0x54, + 0xe8, 0x1a, 0x40, 0xb9, 0x69, 0x0a, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x0d, 0x05, 0x00, 0x54, + 0x69, 0x46, 0x40, 0x79, 0x2a, 0x09, 0x00, 0x12, + 0x5f, 0x09, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x54, + 0x5f, 0x05, 0x00, 0x71, 0x21, 0x01, 0x00, 0x54, + 0x69, 0x01, 0x18, 0x37, 0x69, 0x1e, 0x40, 0xf9, + 0x39, 0x69, 0x68, 0x38, 0x1c, 0x00, 0x00, 0x14, + 0xc9, 0x01, 0x18, 0x37, 0x69, 0x1e, 0x40, 0xf9, + 0x39, 0x79, 0x68, 0x78, 0x18, 0x00, 0x00, 0x14, + 0x29, 0x02, 0x18, 0x37, 0x69, 0x1e, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0x14, 0x3f, 0x01, 0x1c, 0x72, + 0x09, 0x05, 0x80, 0x52, 0x0a, 0x07, 0x80, 0x52, + 0x49, 0x01, 0x89, 0x9a, 0x69, 0x02, 0x09, 0x8b, + 0x39, 0x69, 0x68, 0x38, 0x0e, 0x00, 0x00, 0x14, + 0x3f, 0x01, 0x1c, 0x72, 0x09, 0x05, 0x80, 0x52, + 0x0a, 0x07, 0x80, 0x52, 0x49, 0x01, 0x89, 0x9a, + 0x69, 0x02, 0x09, 0x8b, 0x39, 0x79, 0x68, 0x78, + 0x07, 0x00, 0x00, 0x14, 0x3f, 0x01, 0x1c, 0x72, + 0x09, 0x05, 0x80, 0x52, 0x0a, 0x07, 0x80, 0x52, + 0x49, 0x01, 0x89, 0x9a, 0x69, 0x02, 0x09, 0x8b, + 0x39, 0x79, 0x68, 0xb8, 0x3f, 0x03, 0x02, 0x71, + 0x43, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x15, 0x00, 0x00, 0x90, + 0xe8, 0x02, 0x40, 0xb9, 0xfd, 0x03, 0x00, 0x91, + 0xb5, 0x02, 0x40, 0xf9, 0xc8, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0x61, 0x01, 0x00, 0x54, 0xa8, 0x4a, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0xa2, 0x4e, 0x54, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x06, 0x80, 0x52, + 0x28, 0x57, 0xa8, 0x9b, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x08, 0x49, 0x40, 0x91, + 0x08, 0xe1, 0x0d, 0x91, 0xa8, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyUnicode_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xec, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0xf4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x100, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x12c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x134, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x154, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x15c, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x184, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_TUPLE_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_TUPLE_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f8 mov x24, x21 + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: a9ff5f13 ldp x19, x23, [x24, #-0x10]! + // c: f94006e8 ldr x8, [x23, #0x8] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 14: eb09011f cmp x8, x9 + // 18: 540006c1 b.ne 0xf0 <_JIT_ENTRY+0xf0> + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE PyTuple_Type + // 20: f9400668 ldr x8, [x19, #0x8] + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC PyTuple_Type + // 28: eb09011f cmp x8, x9 + // 2c: 54000621 b.ne 0xf0 <_JIT_ENTRY+0xf0> + // 30: f9400ae8 ldr x8, [x23, #0x10] + // 34: 927df908 and x8, x8, #0xfffffffffffffffb + // 38: f100251f cmp x8, #0x9 + // 3c: 540005a2 b.hs 0xf0 <_JIT_ENTRY+0xf0> + // 40: b9401ae8 ldr w8, [x23, #0x18] + // 44: f9400a69 ldr x9, [x19, #0x10] + // 48: eb08013f cmp x9, x8 + // 4c: 5400052d b.le 0xf0 <_JIT_ENTRY+0xf0> + // 50: 8b080e68 add x8, x19, x8, lsl #3 + // 54: f9400d19 ldr x25, [x8, #0x18] + // 58: b9400328 ldr w8, [x25] + // 5c: 37f80068 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 60: 11000508 add w8, w8, #0x1 + // 64: b9000328 str w8, [x25] + // 68: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 6c: b94002e8 ldr w8, [x23] + // 70: 910003fd mov x29, sp + // 74: 37f80208 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b90002e8 str w8, [x23] + // 80: 540001a1 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // 84: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 8c: f9544928 ldr x8, [x9, #0x2890] + // 90: b40000a8 cbz x8, 0xa4 <_JIT_ENTRY+0xa4> + // 94: f9544d22 ldr x2, [x9, #0x2898] + // 98: aa1703e0 mov x0, x23 + // 9c: 52800021 mov w1, #0x1 // =1 + // a0: d63f0100 blr x8 + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // a8: aa1703e0 mov x0, x23 + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // b0: d63f0100 blr x8 + // b4: f9002298 str x24, [x20, #0x40] + // b8: b9400268 ldr w8, [x19] + // bc: 37f80108 tbnz w8, #0x1f, 0xdc <_JIT_ENTRY+0xdc> + // c0: 71000508 subs w8, w8, #0x1 + // c4: b9000268 str w8, [x19] + // c8: 540000a1 b.ne 0xdc <_JIT_ENTRY+0xdc> + // cc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d0: aa1303e0 mov x0, x19 + // d4: f9400108 ldr x8, [x8] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d8: d63f0100 blr x8 + // dc: f9402295 ldr x21, [x20, #0x40] + // e0: f900229f str xzr, [x20, #0x40] + // e4: f80086b9 str x25, [x21], #0x8 + // e8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ec: 14000000 b 0xec <_JIT_ENTRY+0xec> + // 00000000000000ec: R_AARCH64_JUMP26 _JIT_CONTINUE + // f0: 14000000 b 0xf0 <_JIT_ENTRY+0xf0> + // 00000000000000f0: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // f4: 00 00 00 00 + const unsigned char code_body[248] = { + 0xf8, 0x03, 0x15, 0xaa, 0x09, 0x00, 0x00, 0x90, + 0x13, 0x5f, 0xff, 0xa9, 0xe8, 0x06, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0xc1, 0x06, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x21, 0x06, 0x00, 0x54, + 0xe8, 0x0a, 0x40, 0xf9, 0x08, 0xf9, 0x7d, 0x92, + 0x1f, 0x25, 0x00, 0xf1, 0xa2, 0x05, 0x00, 0x54, + 0xe8, 0x1a, 0x40, 0xb9, 0x69, 0x0a, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x2d, 0x05, 0x00, 0x54, + 0x68, 0x0e, 0x08, 0x8b, 0x19, 0x0d, 0x40, 0xf9, + 0x28, 0x03, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x28, 0x03, 0x00, 0xb9, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe8, 0x02, 0x40, 0xb9, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x02, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb9, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyTuple_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xcc, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xd4, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0xec, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xf0, state->instruction_starts[instruction->jump_target]); +} + +void +emit__BINARY_OP_SUBTRACT_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8ea1 ldr x1, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e60 ldr x0, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyFloat_FromDouble_ConsumeInputs + // 14: fd400820 ldr d0, [x1, #0x10] + // 18: 910003fd mov x29, sp + // 1c: fd400801 ldr d1, [x0, #0x10] + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC _PyFloat_FromDouble_ConsumeInputs + // 24: 1e603820 fsub d0, d1, d0 + // 28: d63f0100 blr x8 + // 2c: b4000080 cbz x0, 0x3c <_JIT_ENTRY+0x3c> + // 30: f9000260 str x0, [x19] + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: aa1303f5 mov x21, x19 + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa1, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x60, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x20, 0x08, 0x40, 0xfd, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x08, 0x40, 0xfd, + 0x08, 0x01, 0x40, 0xf9, 0x20, 0x38, 0x60, 0x1e, + 0x00, 0x01, 0x3f, 0xd6, 0x80, 0x00, 0x00, 0xb4, + 0x60, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_OP_SUBTRACT_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8eb9 ldr x25, [x21, #-0x8]! + // 8: aa1503f3 mov x19, x21 + // c: f85f8e78 ldr x24, [x19, #-0x8]! + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyLong_Subtract + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyLong_Subtract + // 18: aa1903e1 mov x1, x25 + // 1c: 910003fd mov x29, sp + // 20: aa1803e0 mov x0, x24 + // 24: d63f0100 blr x8 + // 28: b9400328 ldr w8, [x25] + // 2c: aa0003f7 mov x23, x0 + // 30: 37f80208 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000328 str w8, [x25] + // 3c: 540001a1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 40: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 48: f9544928 ldr x8, [x9, #0x2890] + // 4c: b40000a8 cbz x8, 0x60 <_JIT_ENTRY+0x60> + // 50: f9544d22 ldr x2, [x9, #0x2898] + // 54: aa1903e0 mov x0, x25 + // 58: 52800021 mov w1, #0x1 // =1 + // 5c: d63f0100 blr x8 + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // 64: aa1903e0 mov x0, x25 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // 6c: d63f0100 blr x8 + // 70: b9400308 ldr w8, [x24] + // 74: 37f80088 tbnz w8, #0x1f, 0x84 <_JIT_ENTRY+0x84> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b9000308 str w8, [x24] + // 80: 540000a0 b.eq 0x94 <_JIT_ENTRY+0x94> + // 84: b4000237 cbz x23, 0xc8 <_JIT_ENTRY+0xc8> + // 88: f9000277 str x23, [x19] + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 98: f9400129 ldr x9, [x9] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 9c: f9544928 ldr x8, [x9, #0x2890] + // a0: b40000a8 cbz x8, 0xb4 <_JIT_ENTRY+0xb4> + // a4: f9544d22 ldr x2, [x9, #0x2898] + // a8: aa1803e0 mov x0, x24 + // ac: 52800021 mov w1, #0x1 // =1 + // b0: d63f0100 blr x8 + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // b8: aa1803e0 mov x0, x24 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // c0: d63f0100 blr x8 + // c4: b5fffe37 cbnz x23, 0x88 <_JIT_ENTRY+0x88> + // c8: aa1303f5 mov x21, x19 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // d4: 00 00 00 00 + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb9, 0x8e, 0x5f, 0xf8, + 0xf3, 0x03, 0x15, 0xaa, 0x78, 0x8e, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x19, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x18, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x28, 0x03, 0x40, 0xb9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x19, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x37, 0x02, 0x00, 0xb4, + 0x77, 0x02, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x37, 0xfe, 0xff, 0xb5, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Subtract+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Subtract); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BINARY_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_SLICE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f06a0 ldp x0, x1, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyBuildSlice_ConsumeRefs + // c: f85e82b3 ldur x19, [x21, #-0x18] + // 10: f9002295 str x21, [x20, #0x40] + // 14: 910003fd mov x29, sp + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _PyBuildSlice_ConsumeRefs + // 1c: d63f0100 blr x8 + // 20: f9402288 ldr x8, [x20, #0x40] + // 24: b4000340 cbz x0, 0x8c <_JIT_ENTRY+0x8c> + // 28: d1004108 sub x8, x8, #0x10 + // 2c: aa0003f7 mov x23, x0 + // 30: aa1303e0 mov x0, x19 + // 34: f9002288 str x8, [x20, #0x40] + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE PyObject_GetItem + // 3c: aa1703e1 mov x1, x23 + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC PyObject_GetItem + // 44: d63f0100 blr x8 + // 48: b94002e8 ldr w8, [x23] + // 4c: aa0003f8 mov x24, x0 + // 50: 37f80108 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 54: 71000508 subs w8, w8, #0x1 + // 58: b90002e8 str w8, [x23] + // 5c: 540000a1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 64: aa1703e0 mov x0, x23 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 6c: d63f0100 blr x8 + // 70: f9402288 ldr x8, [x20, #0x40] + // 74: 91004108 add x8, x8, #0x10 + // 78: d1006108 sub x8, x8, #0x18 + // 7c: f9002288 str x8, [x20, #0x40] + // 80: b9400268 ldr w8, [x19] + // 84: 36f800e8 tbz w8, #0x1f, 0xa0 <_JIT_ENTRY+0xa0> + // 88: 14000009 b 0xac <_JIT_ENTRY+0xac> + // 8c: aa1f03f8 mov x24, xzr + // 90: d1006108 sub x8, x8, #0x18 + // 94: f9002288 str x8, [x20, #0x40] + // 98: b9400268 ldr w8, [x19] + // 9c: 37f80088 tbnz w8, #0x1f, 0xac <_JIT_ENTRY+0xac> + // a0: 71000508 subs w8, w8, #0x1 + // a4: b9000268 str w8, [x19] + // a8: 540000e0 b.eq 0xc4 <_JIT_ENTRY+0xc4> + // ac: f9402295 ldr x21, [x20, #0x40] + // b0: f900229f str xzr, [x20, #0x40] + // b4: b4000178 cbz x24, 0xe0 <_JIT_ENTRY+0xe0> + // b8: f80086b8 str x24, [x21], #0x8 + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000c0: R_AARCH64_JUMP26 _JIT_CONTINUE + // c4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c8: aa1303e0 mov x0, x19 + // cc: f9400108 ldr x8, [x8] + // 00000000000000cc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d0: d63f0100 blr x8 + // d4: f9402295 ldr x21, [x20, #0x40] + // d8: f900229f str xzr, [x20, #0x40] + // dc: b5fffef8 cbnz x24, 0xb8 <_JIT_ENTRY+0xb8> + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[232] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa0, 0x06, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xb3, 0x82, 0x5e, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x40, 0x03, 0x00, 0xb4, + 0x08, 0x41, 0x00, 0xd1, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x88, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe1, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x02, 0x40, 0xb9, 0xf8, 0x03, 0x00, 0xaa, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x41, 0x00, 0x91, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x36, + 0x09, 0x00, 0x00, 0x14, 0xf8, 0x03, 0x1f, 0xaa, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x78, 0x01, 0x00, 0xb4, + 0xb8, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf8, 0xfe, 0xff, 0xb5, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyBuildSlice_ConsumeRefs+0x0 + // 8: &PyObject_GetItem+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xc0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xc4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xcc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xe4, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_LIST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyList_FromStackRefStealOnSuccess + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyList_FromStackRefStealOnSuccess + // 18: cb282eb3 sub x19, x21, w8, uxth #3 + // 1c: 92403d01 and x1, x8, #0xffff + // 20: aa1303e0 mov x0, x19 + // 24: d63f0120 blr x9 + // 28: b4000120 cbz x0, 0x4c <_JIT_ENTRY+0x4c> + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 30: 52800029 mov w9, #0x1 // =1 + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 38: f9000260 str x0, [x19] + // 3c: cb282128 sub x8, x9, w8, uxth + // 40: 8b080eb5 add x21, x21, x8, lsl #3 + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: 14000000 b 0x50 <_JIT_ENTRY+0x50> + // 0000000000000050: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 54: 00 00 00 00 + const unsigned char code_body[88] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb3, 0x2e, 0x28, 0xcb, 0x01, 0x3d, 0x40, 0x92, + 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x01, 0x3f, 0xd6, + 0x20, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x29, 0x00, 0x80, 0x52, 0x08, 0x01, 0x40, 0xf9, + 0x60, 0x02, 0x00, 0xf9, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyList_FromStackRefStealOnSuccess+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyList_FromStackRefStealOnSuccess); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_12x(code + 0x34, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x50, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_MAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_MAP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: aa1f03fa mov x26, xzr + // c: 52800041 mov w1, #0x2 // =2 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9002295 str x21, [x20, #0x40] + // 18: 52800043 mov w3, #0x2 // =2 + // 1c: 910003fd mov x29, sp + // 20: cb282758 sub x24, x26, w8, uxth #1 + // 24: cb2832a0 sub x0, x21, w8, uxth #4 + // 28: 12003d1b and w27, w8, #0xffff + // 2c: 92403d17 and x23, x8, #0xffff + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _PyDict_FromItems + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _PyDict_FromItems + // 38: 91002002 add x2, x0, #0x8 + // 3c: aa1703e4 mov x4, x23 + // 40: d63f0100 blr x8 + // 44: f9402299 ldr x25, [x20, #0x40] + // 48: aa0003f3 mov x19, x0 + // 4c: f900229f str xzr, [x20, #0x40] + // 50: 340002bb cbz w27, 0xa4 <_JIT_ENTRY+0xa4> + // 54: d37ceee8 lsl x8, x23, #4 + // 58: 52800029 mov w9, #0x1 // =1 + // 5c: aa170537 orr x23, x9, x23, lsl #1 + // 60: 8b180d08 add x8, x8, x24, lsl #3 + // 64: 8b150108 add x8, x8, x21 + // 68: 90000015 adrp x21, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 6c: f94002b5 ldr x21, [x21] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 70: d100211a sub x26, x8, #0x8 + // 74: 14000004 b 0x84 <_JIT_ENTRY+0x84> + // 78: d10006f7 sub x23, x23, #0x1 + // 7c: f10006ff cmp x23, #0x1 + // 80: 54000129 b.ls 0xa4 <_JIT_ENTRY+0xa4> + // 84: f85f8740 ldr x0, [x26], #-0x8 + // 88: b9400008 ldr w8, [x0] + // 8c: 37ffff68 tbnz w8, #0x1f, 0x78 <_JIT_ENTRY+0x78> + // 90: 71000508 subs w8, w8, #0x1 + // 94: b9000008 str w8, [x0] + // 98: 54ffff01 b.ne 0x78 <_JIT_ENTRY+0x78> + // 9c: d63f02a0 blr x21 + // a0: 17fffff6 b 0x78 <_JIT_ENTRY+0x78> + // a4: b4000133 cbz x19, 0xc8 <_JIT_ENTRY+0xc8> + // a8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a8: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // ac: 52800029 mov w9, #0x1 // =1 + // b0: f9400108 ldr x8, [x8] + // 00000000000000b0: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // b4: f8387b33 str x19, [x25, x24, lsl #3] + // b8: cb282528 sub x8, x9, w8, uxth #1 + // bc: 8b080f35 add x21, x25, x8, lsl #3 + // c0: a8c17bfd ldp x29, x30, [sp], #0x10 + // c4: 14000000 b 0xc4 <_JIT_ENTRY+0xc4> + // 00000000000000c4: R_AARCH64_JUMP26 _JIT_CONTINUE + // c8: 8b180f35 add x21, x25, x24, lsl #3 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // d4: 00 00 00 00 + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfa, 0x03, 0x1f, 0xaa, 0x41, 0x00, 0x80, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x43, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x58, 0x27, 0x28, 0xcb, 0xa0, 0x32, 0x28, 0xcb, + 0x1b, 0x3d, 0x00, 0x12, 0x17, 0x3d, 0x40, 0x92, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x02, 0x20, 0x00, 0x91, 0xe4, 0x03, 0x17, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x9f, 0x22, 0x00, 0xf9, + 0xbb, 0x02, 0x00, 0x34, 0xe8, 0xee, 0x7c, 0xd3, + 0x29, 0x00, 0x80, 0x52, 0x37, 0x05, 0x17, 0xaa, + 0x08, 0x0d, 0x18, 0x8b, 0x08, 0x01, 0x15, 0x8b, + 0x15, 0x00, 0x00, 0x90, 0xb5, 0x02, 0x40, 0xf9, + 0x1a, 0x21, 0x00, 0xd1, 0x04, 0x00, 0x00, 0x14, + 0xf7, 0x06, 0x00, 0xd1, 0xff, 0x06, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0x40, 0x87, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0xa0, 0x02, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0x33, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x00, 0x90, 0x29, 0x00, 0x80, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0x33, 0x7b, 0x38, 0xf8, + 0x28, 0x25, 0x28, 0xcb, 0x35, 0x0f, 0x08, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyDict_FromItems+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_FromItems); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xa8, (uintptr_t)data); + patch_aarch64_12x(code + 0xb0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xd0, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SET.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PySet_New + // c: aa1f03f7 mov x23, xzr + // 10: f940035a ldr x26, [x26] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9002295 str x21, [x20, #0x40] + // 18: aa1f03e0 mov x0, xzr + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PySet_New + // 20: 910003fd mov x29, sp + // 24: cb3a22f8 sub x24, x23, w26, uxth + // 28: d63f0100 blr x8 + // 2c: f9402299 ldr x25, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: b40007c0 cbz x0, 0x12c <_JIT_ENTRY+0x12c> + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 3c: aa0003f3 mov x19, x0 + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 44: 72003d1f tst w8, #0xffff + // 48: 54000640 b.eq 0x110 <_JIT_ENTRY+0x110> + // 4c: 9000001b adrp x27, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE PySet_Add + // 50: 2a1f03f7 mov w23, wzr + // 54: aa1803fc mov x28, x24 + // 58: f940037b ldr x27, [x27] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC PySet_Add + // 5c: 14000003 b 0x68 <_JIT_ENTRY+0x68> + // 60: b100079c adds x28, x28, #0x1 + // 64: 54000142 b.hs 0x8c <_JIT_ENTRY+0x8c> + // 68: 35ffffd7 cbnz w23, 0x60 <_JIT_ENTRY+0x60> + // 6c: f9002299 str x25, [x20, #0x40] + // 70: aa1303e0 mov x0, x19 + // 74: f87c7aa1 ldr x1, [x21, x28, lsl #3] + // 78: d63f0360 blr x27 + // 7c: f9402299 ldr x25, [x20, #0x40] + // 80: 2a0003f7 mov w23, w0 + // 84: f900229f str xzr, [x20, #0x40] + // 88: 17fffff6 b 0x60 <_JIT_ENTRY+0x60> + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 94: 72003d1f tst w8, #0xffff + // 98: 54000240 b.eq 0xe0 <_JIT_ENTRY+0xe0> + // 9c: 9000001b adrp x27, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a0: 92403d08 and x8, x8, #0xffff + // a4: d10022b5 sub x21, x21, #0x8 + // a8: f940037b ldr x27, [x27] + // 00000000000000a8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // ac: 9100051c add x28, x8, #0x1 + // b0: 14000004 b 0xc0 <_JIT_ENTRY+0xc0> + // b4: d100079c sub x28, x28, #0x1 + // b8: f100079f cmp x28, #0x1 + // bc: 54000129 b.ls 0xe0 <_JIT_ENTRY+0xe0> + // c0: f85f86a0 ldr x0, [x21], #-0x8 + // c4: b9400008 ldr w8, [x0] + // c8: 37ffff68 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // cc: 71000508 subs w8, w8, #0x1 + // d0: b9000008 str w8, [x0] + // d4: 54ffff01 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // d8: d63f0360 blr x27 + // dc: 17fffff6 b 0xb4 <_JIT_ENTRY+0xb4> + // e0: 34000197 cbz w23, 0x110 <_JIT_ENTRY+0x110> + // e4: 8b180f28 add x8, x25, x24, lsl #3 + // e8: f9002288 str x8, [x20, #0x40] + // ec: b9400268 ldr w8, [x19] + // f0: 37f80088 tbnz w8, #0x1f, 0x100 <_JIT_ENTRY+0x100> + // f4: 71000508 subs w8, w8, #0x1 + // f8: b9000268 str w8, [x19] + // fc: 54000480 b.eq 0x18c <_JIT_ENTRY+0x18c> + // 100: f9402295 ldr x21, [x20, #0x40] + // 104: f900229f str xzr, [x20, #0x40] + // 108: a8c17bfd ldp x29, x30, [sp], #0x10 + // 10c: 14000000 b 0x10c <_JIT_ENTRY+0x10c> + // 000000000000010c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 110: 12003f48 and w8, w26, #0xffff + // 114: 52800029 mov w9, #0x1 // =1 + // 118: f8387b33 str x19, [x25, x24, lsl #3] + // 11c: 4b080128 sub w8, w9, w8 + // 120: 8b28cf35 add x21, x25, w8, sxtw #3 + // 124: a8c17bfd ldp x29, x30, [sp], #0x10 + // 128: 14000000 b 0x128 <_JIT_ENTRY+0x128> + // 0000000000000128: R_AARCH64_JUMP26 _JIT_CONTINUE + // 12c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000012c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 130: f9400108 ldr x8, [x8] + // 0000000000000130: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 134: 72003d1f tst w8, #0xffff + // 138: 54000240 b.eq 0x180 <_JIT_ENTRY+0x180> + // 13c: 90000013 adrp x19, 0x0 <_JIT_ENTRY> + // 000000000000013c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 140: 92403d08 and x8, x8, #0xffff + // 144: d10022b5 sub x21, x21, #0x8 + // 148: f9400273 ldr x19, [x19] + // 0000000000000148: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 14c: 91000517 add x23, x8, #0x1 + // 150: 14000004 b 0x160 <_JIT_ENTRY+0x160> + // 154: d10006f7 sub x23, x23, #0x1 + // 158: f10006ff cmp x23, #0x1 + // 15c: 54000129 b.ls 0x180 <_JIT_ENTRY+0x180> + // 160: f85f86a0 ldr x0, [x21], #-0x8 + // 164: b9400008 ldr w8, [x0] + // 168: 37ffff68 tbnz w8, #0x1f, 0x154 <_JIT_ENTRY+0x154> + // 16c: 71000508 subs w8, w8, #0x1 + // 170: b9000008 str w8, [x0] + // 174: 54ffff01 b.ne 0x154 <_JIT_ENTRY+0x154> + // 178: d63f0260 blr x19 + // 17c: 17fffff6 b 0x154 <_JIT_ENTRY+0x154> + // 180: 8b180f35 add x21, x25, x24, lsl #3 + // 184: a8c17bfd ldp x29, x30, [sp], #0x10 + // 188: 14000000 b 0x188 <_JIT_ENTRY+0x188> + // 0000000000000188: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 18c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000018c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 190: aa1303e0 mov x0, x19 + // 194: f9400108 ldr x8, [x8] + // 0000000000000194: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 198: d63f0100 blr x8 + // 19c: f9402295 ldr x21, [x20, #0x40] + // 1a0: f900229f str xzr, [x20, #0x40] + // 1a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // 1a8: 14000000 b 0x1a8 <_JIT_ENTRY+0x1a8> + // 00000000000001a8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 1ac: 00 00 00 00 + const unsigned char code_body[432] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x1a, 0x00, 0x00, 0x90, + 0x08, 0x00, 0x00, 0x90, 0xf7, 0x03, 0x1f, 0xaa, + 0x5a, 0x03, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x1f, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0xf8, 0x22, 0x3a, 0xcb, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x07, 0x00, 0xb4, + 0x08, 0x00, 0x00, 0x90, 0xf3, 0x03, 0x00, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x06, 0x00, 0x54, 0x1b, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x1f, 0x2a, 0xfc, 0x03, 0x18, 0xaa, + 0x7b, 0x03, 0x40, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0x9c, 0x07, 0x00, 0xb1, 0x42, 0x01, 0x00, 0x54, + 0xd7, 0xff, 0xff, 0x35, 0x99, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xa1, 0x7a, 0x7c, 0xf8, + 0x60, 0x03, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0xf7, 0x03, 0x00, 0x2a, 0x9f, 0x22, 0x00, 0xf9, + 0xf6, 0xff, 0xff, 0x17, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x02, 0x00, 0x54, 0x1b, 0x00, 0x00, 0x90, + 0x08, 0x3d, 0x40, 0x92, 0xb5, 0x22, 0x00, 0xd1, + 0x7b, 0x03, 0x40, 0xf9, 0x1c, 0x05, 0x00, 0x91, + 0x04, 0x00, 0x00, 0x14, 0x9c, 0x07, 0x00, 0xd1, + 0x9f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x60, 0x03, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0x97, 0x01, 0x00, 0x34, 0x28, 0x0f, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x80, 0x04, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x48, 0x3f, 0x00, 0x12, 0x29, 0x00, 0x80, 0x52, + 0x33, 0x7b, 0x38, 0xf8, 0x28, 0x01, 0x08, 0x4b, + 0x35, 0xcf, 0x28, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x02, 0x00, 0x54, 0x13, 0x00, 0x00, 0x90, + 0x08, 0x3d, 0x40, 0x92, 0xb5, 0x22, 0x00, 0xd1, + 0x73, 0x02, 0x40, 0xf9, 0x17, 0x05, 0x00, 0x91, + 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0xd1, + 0xff, 0x06, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x60, 0x02, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0x35, 0x0f, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PySet_New+0x0 + // 10: &PySet_Add+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySet_New); + patch_64(data + 0x10, (uintptr_t)&PySet_Add); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x8c, (uintptr_t)data); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xa8, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x10c, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x128, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x12c, (uintptr_t)data); + patch_aarch64_21rx(code + 0x13c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x148, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x188, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x18c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x194, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x1a8, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SLICE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: cb282eb3 sub x19, x21, w8, uxth #3 + // c: 12003d08 and w8, w8, #0xffff + // 10: 71000d1f cmp w8, #0x3 + // 14: a9400660 ldp x0, x1, [x19] + // 18: 54000061 b.ne 0x24 <_JIT_ENTRY+0x24> + // 1c: f9400a62 ldr x2, [x19, #0x10] + // 20: 14000002 b 0x28 <_JIT_ENTRY+0x28> + // 24: aa1f03e2 mov x2, xzr + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PySlice_New + // 30: 910003fd mov x29, sp + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PySlice_New + // 38: d63f0100 blr x8 + // 3c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000003c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 40: aa0003f7 mov x23, x0 + // 44: f9400108 ldr x8, [x8] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 48: 72003d1f tst w8, #0xffff + // 4c: 54000240 b.eq 0x94 <_JIT_ENTRY+0x94> + // 50: 90000018 adrp x24, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 54: 92403d08 and x8, x8, #0xffff + // 58: d10022ba sub x26, x21, #0x8 + // 5c: f9400318 ldr x24, [x24] + // 000000000000005c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 60: 91000519 add x25, x8, #0x1 + // 64: 14000004 b 0x74 <_JIT_ENTRY+0x74> + // 68: d1000739 sub x25, x25, #0x1 + // 6c: f100073f cmp x25, #0x1 + // 70: 54000129 b.ls 0x94 <_JIT_ENTRY+0x94> + // 74: f85f8740 ldr x0, [x26], #-0x8 + // 78: b9400008 ldr w8, [x0] + // 7c: 37ffff68 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 80: 71000508 subs w8, w8, #0x1 + // 84: b9000008 str w8, [x0] + // 88: 54ffff01 b.ne 0x68 <_JIT_ENTRY+0x68> + // 8c: d63f0300 blr x24 + // 90: 17fffff6 b 0x68 <_JIT_ENTRY+0x68> + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: b4000117 cbz x23, 0xb8 <_JIT_ENTRY+0xb8> + // 9c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // a0: 52800029 mov w9, #0x1 // =1 + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // a8: f9000277 str x23, [x19] + // ac: cb282128 sub x8, x9, w8, uxth + // b0: 8b080eb5 add x21, x21, x8, lsl #3 + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + // b8: aa1303f5 mov x21, x19 + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[192] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x2e, 0x28, 0xcb, 0x08, 0x3d, 0x00, 0x12, + 0x1f, 0x0d, 0x00, 0x71, 0x60, 0x06, 0x40, 0xa9, + 0x61, 0x00, 0x00, 0x54, 0x62, 0x0a, 0x40, 0xf9, + 0x02, 0x00, 0x00, 0x14, 0xe2, 0x03, 0x1f, 0xaa, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x40, 0x02, 0x00, 0x54, + 0x18, 0x00, 0x00, 0x90, 0x08, 0x3d, 0x40, 0x92, + 0xba, 0x22, 0x00, 0xd1, 0x18, 0x03, 0x40, 0xf9, + 0x19, 0x05, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x39, 0x07, 0x00, 0xd1, 0x3f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0x40, 0x87, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x00, 0x03, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xc1, 0xa8, + 0x17, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x29, 0x00, 0x80, 0x52, 0x08, 0x01, 0x40, 0xf9, + 0x77, 0x02, 0x00, 0xf9, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PySlice_New+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySlice_New); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x3c, (uintptr_t)data); + patch_aarch64_12x(code + 0x44, (uintptr_t)data); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xbc, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_STRING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_STRING.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE _PyUnicode_JoinArray + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 18: f940014a ldr x10, [x10] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_JoinArray + // 1c: 910003fd mov x29, sp + // 20: cb282eb3 sub x19, x21, w8, uxth #3 + // 24: 12003d19 and w25, w8, #0xffff + // 28: 92403d18 and x24, x8, #0xffff + // 2c: 52914608 mov w8, #0x8a30 // =35376 + // 30: aa1803e2 mov x2, x24 + // 34: 8b080120 add x0, x9, x8 + // 38: aa1303e1 mov x1, x19 + // 3c: d63f0140 blr x10 + // 40: aa0003f7 mov x23, x0 + // 44: 34000239 cbz w25, 0x88 <_JIT_ENTRY+0x88> + // 48: 90000019 adrp x25, 0x0 <_JIT_ENTRY> + // 0000000000000048: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 4c: 91000718 add x24, x24, #0x1 + // 50: d10022ba sub x26, x21, #0x8 + // 54: f9400339 ldr x25, [x25] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: 14000004 b 0x68 <_JIT_ENTRY+0x68> + // 5c: d1000718 sub x24, x24, #0x1 + // 60: f100071f cmp x24, #0x1 + // 64: 54000129 b.ls 0x88 <_JIT_ENTRY+0x88> + // 68: f85f8740 ldr x0, [x26], #-0x8 + // 6c: b9400008 ldr w8, [x0] + // 70: 37ffff68 tbnz w8, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 74: 71000508 subs w8, w8, #0x1 + // 78: b9000008 str w8, [x0] + // 7c: 54ffff01 b.ne 0x5c <_JIT_ENTRY+0x5c> + // 80: d63f0320 blr x25 + // 84: 17fffff6 b 0x5c <_JIT_ENTRY+0x5c> + // 88: b4000137 cbz x23, 0xac <_JIT_ENTRY+0xac> + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 90: 52800029 mov w9, #0x1 // =1 + // 94: f9400108 ldr x8, [x8] + // 0000000000000094: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 98: f9000277 str x23, [x19] + // 9c: cb282128 sub x8, x9, w8, uxth + // a0: 8b080eb5 add x21, x21, x8, lsl #3 + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a8: R_AARCH64_JUMP26 _JIT_CONTINUE + // ac: aa1303f5 mov x21, x19 + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[184] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0xb3, 0x2e, 0x28, 0xcb, 0x19, 0x3d, 0x00, 0x12, + 0x18, 0x3d, 0x40, 0x92, 0x08, 0x46, 0x91, 0x52, + 0xe2, 0x03, 0x18, 0xaa, 0x20, 0x01, 0x08, 0x8b, + 0xe1, 0x03, 0x13, 0xaa, 0x40, 0x01, 0x3f, 0xd6, + 0xf7, 0x03, 0x00, 0xaa, 0x39, 0x02, 0x00, 0x34, + 0x19, 0x00, 0x00, 0x90, 0x18, 0x07, 0x00, 0x91, + 0xba, 0x22, 0x00, 0xd1, 0x39, 0x03, 0x40, 0xf9, + 0x04, 0x00, 0x00, 0x14, 0x18, 0x07, 0x00, 0xd1, + 0x1f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0x40, 0x87, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x20, 0x03, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0x37, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x29, 0x00, 0x80, 0x52, 0x08, 0x01, 0x40, 0xf9, + 0x77, 0x02, 0x00, 0xf9, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x13, 0xaa, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_JoinArray+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_JoinArray); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x18, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x48, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x8c, (uintptr_t)data); + patch_aarch64_12x(code + 0x94, (uintptr_t)data); + patch_aarch64_26r(code + 0xa8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xb4, state->instruction_starts[instruction->error_target]); +} + +void +emit__BUILD_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyTuple_FromStackRefStealOnSuccess + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyTuple_FromStackRefStealOnSuccess + // 18: cb282eb3 sub x19, x21, w8, uxth #3 + // 1c: 92403d01 and x1, x8, #0xffff + // 20: aa1303e0 mov x0, x19 + // 24: d63f0120 blr x9 + // 28: b4000120 cbz x0, 0x4c <_JIT_ENTRY+0x4c> + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 30: 52800029 mov w9, #0x1 // =1 + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 38: f9000260 str x0, [x19] + // 3c: cb282128 sub x8, x9, w8, uxth + // 40: 8b080eb5 add x21, x21, x8, lsl #3 + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: 14000000 b 0x50 <_JIT_ENTRY+0x50> + // 0000000000000050: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 54: 00 00 00 00 + const unsigned char code_body[88] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb3, 0x2e, 0x28, 0xcb, 0x01, 0x3d, 0x40, 0x92, + 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x01, 0x3f, 0xd6, + 0x20, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x29, 0x00, 0x80, 0x52, 0x08, 0x01, 0x40, 0xf9, + 0x60, 0x02, 0x00, 0xf9, 0x28, 0x21, 0x28, 0xcb, + 0xb5, 0x0e, 0x08, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyTuple_FromStackRefStealOnSuccess+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyTuple_FromStackRefStealOnSuccess); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_12x(code + 0x34, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x50, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_CLASS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800028 mov x8, #-0x2 // =-2 + // c: 910003fd mov x29, sp + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: cb292117 sub x23, x8, w9, uxth + // 18: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 1c: f9400408 ldr x8, [x0, #0x8] + // 20: 3942ad08 ldrb w8, [x8, #0xab] + // 24: 36380788 tbz w8, #0x7, 0x114 <_JIT_ENTRY+0x114> + // 28: f940c808 ldr x8, [x0, #0x190] + // 2c: b4000748 cbz x8, 0x114 <_JIT_ENTRY+0x114> + // 30: 12003d2a and w10, w9, #0xffff + // 34: cb292ea9 sub x9, x21, w9, uxth #3 + // 38: aa1f03e3 mov x3, xzr + // 3c: 2a2a03eb mvn w11, w10 + // 40: 93407d78 sxtw x24, w11 + // 44: f8787aab ldr x11, [x21, x24, lsl #3] + // 48: f9002295 str x21, [x20, #0x40] + // 4c: f100017f cmp x11, #0x0 + // 50: 928000eb mov x11, #-0x8 // =-8 + // 54: 1a8a0542 cinc w2, w10, ne + // 58: 9a9f116a csel x10, x11, xzr, ne + // 5c: 8b0a0121 add x1, x9, x10 + // 60: d63f0100 blr x8 + // 64: f9402299 ldr x25, [x20, #0x40] + // 68: f900229f str xzr, [x20, #0x40] + // 6c: aa0003f3 mov x19, x0 + // 70: f8777aa8 ldr x8, [x21, x23, lsl #3] + // 74: b9400109 ldr w9, [x8] + // 78: 37f80109 tbnz w9, #0x1f, 0x98 <_JIT_ENTRY+0x98> + // 7c: 71000529 subs w9, w9, #0x1 + // 80: b9000109 str w9, [x8] + // 84: 540000a1 b.ne 0x98 <_JIT_ENTRY+0x98> + // 88: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 8c: aa0803e0 mov x0, x8 + // 90: f9400129 ldr x9, [x9] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 94: d63f0120 blr x9 + // 98: f8787aa0 ldr x0, [x21, x24, lsl #3] + // 9c: b4000120 cbz x0, 0xc0 <_JIT_ENTRY+0xc0> + // a0: b9400008 ldr w8, [x0] + // a4: 37f800e8 tbnz w8, #0x1f, 0xc0 <_JIT_ENTRY+0xc0> + // a8: 71000508 subs w8, w8, #0x1 + // ac: b9000008 str w8, [x0] + // b0: 54000081 b.ne 0xc0 <_JIT_ENTRY+0xc0> + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // b8: f9400108 ldr x8, [x8] + // 00000000000000b8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // bc: d63f0100 blr x8 + // c0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c0: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c4: f9400108 ldr x8, [x8] + // 00000000000000c4: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c8: 72003d1f tst w8, #0xffff + // cc: 54000280 b.eq 0x11c <_JIT_ENTRY+0x11c> + // d0: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 00000000000000d0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d4: 92403d08 and x8, x8, #0xffff + // d8: d10022b5 sub x21, x21, #0x8 + // dc: f940035a ldr x26, [x26] + // 00000000000000dc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // e0: 9100051b add x27, x8, #0x1 + // e4: 14000004 b 0xf4 <_JIT_ENTRY+0xf4> + // e8: d100077b sub x27, x27, #0x1 + // ec: f100077f cmp x27, #0x1 + // f0: 54000169 b.ls 0x11c <_JIT_ENTRY+0x11c> + // f4: f85f86a0 ldr x0, [x21], #-0x8 + // f8: b9400008 ldr w8, [x0] + // fc: 37ffff68 tbnz w8, #0x1f, 0xe8 <_JIT_ENTRY+0xe8> + // 100: 71000508 subs w8, w8, #0x1 + // 104: b9000008 str w8, [x0] + // 108: 54ffff01 b.ne 0xe8 <_JIT_ENTRY+0xe8> + // 10c: d63f0340 blr x26 + // 110: 17fffff6 b 0xe8 <_JIT_ENTRY+0xe8> + // 114: a8c17bfd ldp x29, x30, [sp], #0x10 + // 118: 14000000 b 0x118 <_JIT_ENTRY+0x118> + // 0000000000000118: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 11c: b40000b3 cbz x19, 0x130 <_JIT_ENTRY+0x130> + // 120: 8b180f35 add x21, x25, x24, lsl #3 + // 124: f8377b33 str x19, [x25, x23, lsl #3] + // 128: a8c17bfd ldp x29, x30, [sp], #0x10 + // 12c: 14000000 b 0x12c <_JIT_ENTRY+0x12c> + // 000000000000012c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 130: 8b170f35 add x21, x25, x23, lsl #3 + // 134: a8c17bfd ldp x29, x30, [sp], #0x10 + // 138: 14000000 b 0x138 <_JIT_ENTRY+0x138> + // 0000000000000138: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 13c: 00 00 00 00 + const unsigned char code_body[320] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x28, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x29, 0x01, 0x40, 0xf9, 0x17, 0x21, 0x29, 0xcb, + 0xa0, 0x7a, 0x77, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0x88, 0x07, 0x38, 0x36, + 0x08, 0xc8, 0x40, 0xf9, 0x48, 0x07, 0x00, 0xb4, + 0x2a, 0x3d, 0x00, 0x12, 0xa9, 0x2e, 0x29, 0xcb, + 0xe3, 0x03, 0x1f, 0xaa, 0xeb, 0x03, 0x2a, 0x2a, + 0x78, 0x7d, 0x40, 0x93, 0xab, 0x7a, 0x78, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x7f, 0x01, 0x00, 0xf1, + 0xeb, 0x00, 0x80, 0x92, 0x42, 0x05, 0x8a, 0x1a, + 0x6a, 0x11, 0x9f, 0x9a, 0x21, 0x01, 0x0a, 0x8b, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xa8, 0x7a, 0x77, 0xf8, 0x09, 0x01, 0x40, 0xb9, + 0x09, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x08, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, + 0xa0, 0x7a, 0x78, 0xf8, 0x20, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x80, 0x02, 0x00, 0x54, + 0x1a, 0x00, 0x00, 0x90, 0x08, 0x3d, 0x40, 0x92, + 0xb5, 0x22, 0x00, 0xd1, 0x5a, 0x03, 0x40, 0xf9, + 0x1b, 0x05, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x7b, 0x07, 0x00, 0xd1, 0x7f, 0x07, 0x00, 0xf1, + 0x69, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x40, 0x03, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x00, 0x00, 0xb4, + 0x35, 0x0f, 0x18, 0x8b, 0x33, 0x7b, 0x37, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x88, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x90, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xb4, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xc0, (uintptr_t)data); + patch_aarch64_21rx(code + 0xd0, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xdc, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x118, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x12c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x138, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800028 mov x8, #-0x2 // =-2 + // c: 9000000e adrp x14, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyCFunction_Type + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 910003fd mov x29, sp + // 18: cb292117 sub x23, x8, w9, uxth + // 1c: 12003d2c and w12, w9, #0xffff + // 20: 2a2c03ea mvn w10, w12 + // 24: f8777aa8 ldr x8, [x21, x23, lsl #3] + // 28: f86adaab ldr x11, [x21, w10, sxtw #3] + // 2c: f940050d ldr x13, [x8, #0x8] + // 30: f94001ce ldr x14, [x14] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyCFunction_Type + // 34: f100017f cmp x11, #0x0 + // 38: 928000eb mov x11, #-0x8 // =-8 + // 3c: 1a8c0582 cinc w2, w12, ne + // 40: 9a9f116b csel x11, x11, xzr, ne + // 44: eb0e01bf cmp x13, x14 + // 48: 54000701 b.ne 0x128 <_JIT_ENTRY+0x128> + // 4c: f940090c ldr x12, [x8, #0x10] + // 50: b940118d ldr w13, [x12, #0x10] + // 54: 710201bf cmp w13, #0x80 + // 58: 54000681 b.ne 0x128 <_JIT_ENTRY+0x128> + // 5c: cb292ea9 sub x9, x21, w9, uxth #3 + // 60: 93407d58 sxtw x24, w10 + // 64: f940058a ldr x10, [x12, #0x8] + // 68: f9400d00 ldr x0, [x8, #0x18] + // 6c: f9002295 str x21, [x20, #0x40] + // 70: 8b0b0121 add x1, x9, x11 + // 74: d63f0140 blr x10 + // 78: f9402299 ldr x25, [x20, #0x40] + // 7c: f900229f str xzr, [x20, #0x40] + // 80: aa0003f3 mov x19, x0 + // 84: f8777aa8 ldr x8, [x21, x23, lsl #3] + // 88: b9400109 ldr w9, [x8] + // 8c: 37f80109 tbnz w9, #0x1f, 0xac <_JIT_ENTRY+0xac> + // 90: 71000529 subs w9, w9, #0x1 + // 94: b9000109 str w9, [x8] + // 98: 540000a1 b.ne 0xac <_JIT_ENTRY+0xac> + // 9c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a0: aa0803e0 mov x0, x8 + // a4: f9400129 ldr x9, [x9] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a8: d63f0120 blr x9 + // ac: f8787aa0 ldr x0, [x21, x24, lsl #3] + // b0: b4000120 cbz x0, 0xd4 <_JIT_ENTRY+0xd4> + // b4: b9400008 ldr w8, [x0] + // b8: 37f800e8 tbnz w8, #0x1f, 0xd4 <_JIT_ENTRY+0xd4> + // bc: 71000508 subs w8, w8, #0x1 + // c0: b9000008 str w8, [x0] + // c4: 54000081 b.ne 0xd4 <_JIT_ENTRY+0xd4> + // c8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: f9400108 ldr x8, [x8] + // 00000000000000cc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d0: d63f0100 blr x8 + // d4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d4: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // d8: f9400108 ldr x8, [x8] + // 00000000000000d8: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // dc: 72003d1f tst w8, #0xffff + // e0: 54000280 b.eq 0x130 <_JIT_ENTRY+0x130> + // e4: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 00000000000000e4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // e8: 92403d08 and x8, x8, #0xffff + // ec: d10022b5 sub x21, x21, #0x8 + // f0: f940035a ldr x26, [x26] + // 00000000000000f0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f4: 9100051b add x27, x8, #0x1 + // f8: 14000004 b 0x108 <_JIT_ENTRY+0x108> + // fc: d100077b sub x27, x27, #0x1 + // 100: f100077f cmp x27, #0x1 + // 104: 54000169 b.ls 0x130 <_JIT_ENTRY+0x130> + // 108: f85f86a0 ldr x0, [x21], #-0x8 + // 10c: b9400008 ldr w8, [x0] + // 110: 37ffff68 tbnz w8, #0x1f, 0xfc <_JIT_ENTRY+0xfc> + // 114: 71000508 subs w8, w8, #0x1 + // 118: b9000008 str w8, [x0] + // 11c: 54ffff01 b.ne 0xfc <_JIT_ENTRY+0xfc> + // 120: d63f0340 blr x26 + // 124: 17fffff6 b 0xfc <_JIT_ENTRY+0xfc> + // 128: a8c17bfd ldp x29, x30, [sp], #0x10 + // 12c: 14000000 b 0x12c <_JIT_ENTRY+0x12c> + // 000000000000012c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 130: b40000b3 cbz x19, 0x144 <_JIT_ENTRY+0x144> + // 134: 8b180f35 add x21, x25, x24, lsl #3 + // 138: f8377b33 str x19, [x25, x23, lsl #3] + // 13c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 140: 14000000 b 0x140 <_JIT_ENTRY+0x140> + // 0000000000000140: R_AARCH64_JUMP26 _JIT_CONTINUE + // 144: 8b170f35 add x21, x25, x23, lsl #3 + // 148: a8c17bfd ldp x29, x30, [sp], #0x10 + // 14c: 14000000 b 0x14c <_JIT_ENTRY+0x14c> + // 000000000000014c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[336] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x28, 0x00, 0x80, 0x92, 0x0e, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x17, 0x21, 0x29, 0xcb, 0x2c, 0x3d, 0x00, 0x12, + 0xea, 0x03, 0x2c, 0x2a, 0xa8, 0x7a, 0x77, 0xf8, + 0xab, 0xda, 0x6a, 0xf8, 0x0d, 0x05, 0x40, 0xf9, + 0xce, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x00, 0xf1, + 0xeb, 0x00, 0x80, 0x92, 0x82, 0x05, 0x8c, 0x1a, + 0x6b, 0x11, 0x9f, 0x9a, 0xbf, 0x01, 0x0e, 0xeb, + 0x01, 0x07, 0x00, 0x54, 0x0c, 0x09, 0x40, 0xf9, + 0x8d, 0x11, 0x40, 0xb9, 0xbf, 0x01, 0x02, 0x71, + 0x81, 0x06, 0x00, 0x54, 0xa9, 0x2e, 0x29, 0xcb, + 0x58, 0x7d, 0x40, 0x93, 0x8a, 0x05, 0x40, 0xf9, + 0x00, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x21, 0x01, 0x0b, 0x8b, 0x40, 0x01, 0x3f, 0xd6, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0xa8, 0x7a, 0x77, 0xf8, + 0x09, 0x01, 0x40, 0xb9, 0x09, 0x01, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x71, 0x09, 0x01, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x08, 0xaa, 0x29, 0x01, 0x40, 0xf9, + 0x20, 0x01, 0x3f, 0xd6, 0xa0, 0x7a, 0x78, 0xf8, + 0x20, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x80, 0x02, 0x00, 0x54, 0x1a, 0x00, 0x00, 0x90, + 0x08, 0x3d, 0x40, 0x92, 0xb5, 0x22, 0x00, 0xd1, + 0x5a, 0x03, 0x40, 0xf9, 0x1b, 0x05, 0x00, 0x91, + 0x04, 0x00, 0x00, 0x14, 0x7b, 0x07, 0x00, 0xd1, + 0x7f, 0x07, 0x00, 0xf1, 0x69, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x40, 0x03, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xb3, 0x00, 0x00, 0xb4, 0x35, 0x0f, 0x18, 0x8b, + 0x33, 0x7b, 0x37, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xd4, (uintptr_t)data); + patch_aarch64_21rx(code + 0xe4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xf0, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x12c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x140, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x14c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST_WITH_KEYWORDS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800028 mov x8, #-0x2 // =-2 + // c: 9000000e adrp x14, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyCFunction_Type + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 910003fd mov x29, sp + // 18: cb292117 sub x23, x8, w9, uxth + // 1c: 12003d2c and w12, w9, #0xffff + // 20: 2a2c03ea mvn w10, w12 + // 24: f8777aa8 ldr x8, [x21, x23, lsl #3] + // 28: f86adaab ldr x11, [x21, w10, sxtw #3] + // 2c: f940050d ldr x13, [x8, #0x8] + // 30: f94001ce ldr x14, [x14] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyCFunction_Type + // 34: f100017f cmp x11, #0x0 + // 38: 928000eb mov x11, #-0x8 // =-8 + // 3c: 1a8c0582 cinc w2, w12, ne + // 40: 9a9f116b csel x11, x11, xzr, ne + // 44: eb0e01bf cmp x13, x14 + // 48: 54000721 b.ne 0x12c <_JIT_ENTRY+0x12c> + // 4c: f940090c ldr x12, [x8, #0x10] + // 50: b940118d ldr w13, [x12, #0x10] + // 54: 710209bf cmp w13, #0x82 + // 58: 540006a1 b.ne 0x12c <_JIT_ENTRY+0x12c> + // 5c: cb292ea9 sub x9, x21, w9, uxth #3 + // 60: 93407d58 sxtw x24, w10 + // 64: f940058a ldr x10, [x12, #0x8] + // 68: f9400d00 ldr x0, [x8, #0x18] + // 6c: aa1f03e3 mov x3, xzr + // 70: f9002295 str x21, [x20, #0x40] + // 74: 8b0b0121 add x1, x9, x11 + // 78: d63f0140 blr x10 + // 7c: f9402299 ldr x25, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: aa0003f3 mov x19, x0 + // 88: f8777aa8 ldr x8, [x21, x23, lsl #3] + // 8c: b9400109 ldr w9, [x8] + // 90: 37f80109 tbnz w9, #0x1f, 0xb0 <_JIT_ENTRY+0xb0> + // 94: 71000529 subs w9, w9, #0x1 + // 98: b9000109 str w9, [x8] + // 9c: 540000a1 b.ne 0xb0 <_JIT_ENTRY+0xb0> + // a0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000a0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a4: aa0803e0 mov x0, x8 + // a8: f9400129 ldr x9, [x9] + // 00000000000000a8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // ac: d63f0120 blr x9 + // b0: f8787aa0 ldr x0, [x21, x24, lsl #3] + // b4: b4000120 cbz x0, 0xd8 <_JIT_ENTRY+0xd8> + // b8: b9400008 ldr w8, [x0] + // bc: 37f800e8 tbnz w8, #0x1f, 0xd8 <_JIT_ENTRY+0xd8> + // c0: 71000508 subs w8, w8, #0x1 + // c4: b9000008 str w8, [x0] + // c8: 54000081 b.ne 0xd8 <_JIT_ENTRY+0xd8> + // cc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d0: f9400108 ldr x8, [x8] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d4: d63f0100 blr x8 + // d8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d8: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // dc: f9400108 ldr x8, [x8] + // 00000000000000dc: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // e0: 72003d1f tst w8, #0xffff + // e4: 54000280 b.eq 0x134 <_JIT_ENTRY+0x134> + // e8: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // ec: 92403d08 and x8, x8, #0xffff + // f0: d10022b5 sub x21, x21, #0x8 + // f4: f940035a ldr x26, [x26] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f8: 9100051b add x27, x8, #0x1 + // fc: 14000004 b 0x10c <_JIT_ENTRY+0x10c> + // 100: d100077b sub x27, x27, #0x1 + // 104: f100077f cmp x27, #0x1 + // 108: 54000169 b.ls 0x134 <_JIT_ENTRY+0x134> + // 10c: f85f86a0 ldr x0, [x21], #-0x8 + // 110: b9400008 ldr w8, [x0] + // 114: 37ffff68 tbnz w8, #0x1f, 0x100 <_JIT_ENTRY+0x100> + // 118: 71000508 subs w8, w8, #0x1 + // 11c: b9000008 str w8, [x0] + // 120: 54ffff01 b.ne 0x100 <_JIT_ENTRY+0x100> + // 124: d63f0340 blr x26 + // 128: 17fffff6 b 0x100 <_JIT_ENTRY+0x100> + // 12c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 130: 14000000 b 0x130 <_JIT_ENTRY+0x130> + // 0000000000000130: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 134: b40000b3 cbz x19, 0x148 <_JIT_ENTRY+0x148> + // 138: 8b180f35 add x21, x25, x24, lsl #3 + // 13c: f8377b33 str x19, [x25, x23, lsl #3] + // 140: a8c17bfd ldp x29, x30, [sp], #0x10 + // 144: 14000000 b 0x144 <_JIT_ENTRY+0x144> + // 0000000000000144: R_AARCH64_JUMP26 _JIT_CONTINUE + // 148: 8b170f35 add x21, x25, x23, lsl #3 + // 14c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 150: 14000000 b 0x150 <_JIT_ENTRY+0x150> + // 0000000000000150: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 154: 00 00 00 00 + const unsigned char code_body[344] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x28, 0x00, 0x80, 0x92, 0x0e, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x17, 0x21, 0x29, 0xcb, 0x2c, 0x3d, 0x00, 0x12, + 0xea, 0x03, 0x2c, 0x2a, 0xa8, 0x7a, 0x77, 0xf8, + 0xab, 0xda, 0x6a, 0xf8, 0x0d, 0x05, 0x40, 0xf9, + 0xce, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x00, 0xf1, + 0xeb, 0x00, 0x80, 0x92, 0x82, 0x05, 0x8c, 0x1a, + 0x6b, 0x11, 0x9f, 0x9a, 0xbf, 0x01, 0x0e, 0xeb, + 0x21, 0x07, 0x00, 0x54, 0x0c, 0x09, 0x40, 0xf9, + 0x8d, 0x11, 0x40, 0xb9, 0xbf, 0x09, 0x02, 0x71, + 0xa1, 0x06, 0x00, 0x54, 0xa9, 0x2e, 0x29, 0xcb, + 0x58, 0x7d, 0x40, 0x93, 0x8a, 0x05, 0x40, 0xf9, + 0x00, 0x0d, 0x40, 0xf9, 0xe3, 0x03, 0x1f, 0xaa, + 0x95, 0x22, 0x00, 0xf9, 0x21, 0x01, 0x0b, 0x8b, + 0x40, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xa8, 0x7a, 0x77, 0xf8, 0x09, 0x01, 0x40, 0xb9, + 0x09, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x08, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, + 0xa0, 0x7a, 0x78, 0xf8, 0x20, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x80, 0x02, 0x00, 0x54, + 0x1a, 0x00, 0x00, 0x90, 0x08, 0x3d, 0x40, 0x92, + 0xb5, 0x22, 0x00, 0xd1, 0x5a, 0x03, 0x40, 0xf9, + 0x1b, 0x05, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x7b, 0x07, 0x00, 0xd1, 0x7f, 0x07, 0x00, 0xf1, + 0x69, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x40, 0x03, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x00, 0x00, 0xb4, + 0x35, 0x0f, 0x18, 0x8b, 0x33, 0x7b, 0x37, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xa0, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xa8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xcc, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xd8, (uintptr_t)data); + patch_aarch64_21rx(code + 0xe8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xf4, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x130, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x144, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x150, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_BUILTIN_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_O.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 928000e9 mov x9, #-0x8 // =-8 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 12003d0a and w10, w8, #0xffff + // 18: 2a2a03eb mvn w11, w10 + // 1c: f86bdaab ldr x11, [x21, w11, sxtw #3] + // 20: f100017f cmp x11, #0x0 + // 24: 1a8a054a cinc w10, w10, ne + // 28: 9a9f1129 csel x9, x9, xzr, ne + // 2c: 7100055f cmp w10, #0x1 + // 30: 54000701 b.ne 0x110 <_JIT_ENTRY+0x110> + // 34: 9280002a mov x10, #-0x2 // =-2 + // 38: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE PyCFunction_Type + // 3c: cb282158 sub x24, x10, w8, uxth + // 40: f8787aaa ldr x10, [x21, x24, lsl #3] + // 44: f940054b ldr x11, [x10, #0x8] + // 48: f940018c ldr x12, [x12] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC PyCFunction_Type + // 4c: eb0c017f cmp x11, x12 + // 50: 54000601 b.ne 0x110 <_JIT_ENTRY+0x110> + // 54: f940094b ldr x11, [x10, #0x10] + // 58: b940116c ldr w12, [x11, #0x10] + // 5c: 7100219f cmp w12, #0x8 + // 60: 54000581 b.ne 0x110 <_JIT_ENTRY+0x110> + // 64: b94036cc ldr w12, [x22, #0x34] + // 68: 7100019f cmp w12, #0x0 + // 6c: 5400052d b.le 0x110 <_JIT_ENTRY+0x110> + // 70: cb282ea8 sub x8, x21, w8, uxth #3 + // 74: f940056b ldr x11, [x11, #0x8] + // 78: f9400d40 ldr x0, [x10, #0x18] + // 7c: 5100058c sub w12, w12, #0x1 + // 80: f8696917 ldr x23, [x8, x9] + // 84: b90036cc str w12, [x22, #0x34] + // 88: f9002295 str x21, [x20, #0x40] + // 8c: aa1703e1 mov x1, x23 + // 90: d63f0160 blr x11 + // 94: b94036c8 ldr w8, [x22, #0x34] + // 98: aa0003f3 mov x19, x0 + // 9c: 11000508 add w8, w8, #0x1 + // a0: b90036c8 str w8, [x22, #0x34] + // a4: b94002e8 ldr w8, [x23] + // a8: 37f80108 tbnz w8, #0x1f, 0xc8 <_JIT_ENTRY+0xc8> + // ac: 71000508 subs w8, w8, #0x1 + // b0: b90002e8 str w8, [x23] + // b4: 540000a1 b.ne 0xc8 <_JIT_ENTRY+0xc8> + // b8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // bc: aa1703e0 mov x0, x23 + // c0: f9400108 ldr x8, [x8] + // 00000000000000c0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c4: d63f0100 blr x8 + // c8: f9402288 ldr x8, [x20, #0x40] + // cc: 8b180d08 add x8, x8, x24, lsl #3 + // d0: f9002288 str x8, [x20, #0x40] + // d4: f8787aa0 ldr x0, [x21, x24, lsl #3] + // d8: b9400008 ldr w8, [x0] + // dc: 37f800e8 tbnz w8, #0x1f, 0xf8 <_JIT_ENTRY+0xf8> + // e0: 71000508 subs w8, w8, #0x1 + // e4: b9000008 str w8, [x0] + // e8: 54000081 b.ne 0xf8 <_JIT_ENTRY+0xf8> + // ec: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000ec: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f0: f9400108 ldr x8, [x8] + // 00000000000000f0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f4: d63f0100 blr x8 + // f8: f9402295 ldr x21, [x20, #0x40] + // fc: f900229f str xzr, [x20, #0x40] + // 100: b40000d3 cbz x19, 0x118 <_JIT_ENTRY+0x118> + // 104: f80086b3 str x19, [x21], #0x8 + // 108: a8c17bfd ldp x29, x30, [sp], #0x10 + // 10c: 14000000 b 0x10c <_JIT_ENTRY+0x10c> + // 000000000000010c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 110: a8c17bfd ldp x29, x30, [sp], #0x10 + // 114: 14000000 b 0x114 <_JIT_ENTRY+0x114> + // 0000000000000114: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c <_JIT_ENTRY+0x11c> + // 000000000000011c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[288] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xe9, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x0a, 0x3d, 0x00, 0x12, + 0xeb, 0x03, 0x2a, 0x2a, 0xab, 0xda, 0x6b, 0xf8, + 0x7f, 0x01, 0x00, 0xf1, 0x4a, 0x05, 0x8a, 0x1a, + 0x29, 0x11, 0x9f, 0x9a, 0x5f, 0x05, 0x00, 0x71, + 0x01, 0x07, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x0c, 0x00, 0x00, 0x90, 0x58, 0x21, 0x28, 0xcb, + 0xaa, 0x7a, 0x78, 0xf8, 0x4b, 0x05, 0x40, 0xf9, + 0x8c, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0c, 0xeb, + 0x01, 0x06, 0x00, 0x54, 0x4b, 0x09, 0x40, 0xf9, + 0x6c, 0x11, 0x40, 0xb9, 0x9f, 0x21, 0x00, 0x71, + 0x81, 0x05, 0x00, 0x54, 0xcc, 0x36, 0x40, 0xb9, + 0x9f, 0x01, 0x00, 0x71, 0x2d, 0x05, 0x00, 0x54, + 0xa8, 0x2e, 0x28, 0xcb, 0x6b, 0x05, 0x40, 0xf9, + 0x40, 0x0d, 0x40, 0xf9, 0x8c, 0x05, 0x00, 0x51, + 0x17, 0x69, 0x69, 0xf8, 0xcc, 0x36, 0x00, 0xb9, + 0x95, 0x22, 0x00, 0xf9, 0xe1, 0x03, 0x17, 0xaa, + 0x60, 0x01, 0x3f, 0xd6, 0xc8, 0x36, 0x40, 0xb9, + 0xf3, 0x03, 0x00, 0xaa, 0x08, 0x05, 0x00, 0x11, + 0xc8, 0x36, 0x00, 0xb9, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x0d, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0xa0, 0x7a, 0x78, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xd3, 0x00, 0x00, 0xb4, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xb8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xc0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xec, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x10c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x114, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x11c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_INTRINSIC_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyIntrinsics_UnaryFunctions + // c: aa1603e0 mov x0, x22 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyIntrinsics_UnaryFunctions + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: 910003fd mov x29, sp + // 20: f9002295 str x21, [x20, #0x40] + // 24: 92403d08 and x8, x8, #0xffff + // 28: aa1303e1 mov x1, x19 + // 2c: d37ced08 lsl x8, x8, #4 + // 30: f8686928 ldr x8, [x9, x8] + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a0 b.eq 0x64 <_JIT_ENTRY+0x64> + // 54: b4000160 cbz x0, 0x80 <_JIT_ENTRY+0x80> + // 58: f81f82a0 stur x0, [x21, #-0x8] + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: aa0003f7 mov x23, x0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: aa1703e0 mov x0, x23 + // 7c: b5fffef7 cbnz x23, 0x58 <_JIT_ENTRY+0x58> + // 80: d10022b5 sub x21, x21, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0xfd, 0x03, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x3d, 0x40, 0x92, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0xed, 0x7c, 0xd3, + 0x28, 0x69, 0x68, 0xf8, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x60, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0xaa, 0xf7, 0xfe, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyIntrinsics_UnaryFunctions+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_UnaryFunctions); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_INTRINSIC_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_2.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyIntrinsics_BinaryFunctions + // c: aa1603e0 mov x0, x22 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyIntrinsics_BinaryFunctions + // 18: 910003fd mov x29, sp + // 1c: a97f4eb8 ldp x24, x19, [x21, #-0x10] + // 20: f9002295 str x21, [x20, #0x40] + // 24: 92403d08 and x8, x8, #0xffff + // 28: d37ced08 lsl x8, x8, #4 + // 2c: aa1803e1 mov x1, x24 + // 30: aa1303e2 mov x2, x19 + // 34: f8686928 ldr x8, [x9, x8] + // 38: d63f0100 blr x8 + // 3c: f9402299 ldr x25, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: aa0003f7 mov x23, x0 + // 48: b9400308 ldr w8, [x24] + // 4c: 37f80108 tbnz w8, #0x1f, 0x6c <_JIT_ENTRY+0x6c> + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000308 str w8, [x24] + // 58: 540000a1 b.ne 0x6c <_JIT_ENTRY+0x6c> + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 60: aa1803e0 mov x0, x24 + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 68: d63f0100 blr x8 + // 6c: b9400268 ldr w8, [x19] + // 70: 37f80088 tbnz w8, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 74: 71000508 subs w8, w8, #0x1 + // 78: b9000268 str w8, [x19] + // 7c: 540000c0 b.eq 0x94 <_JIT_ENTRY+0x94> + // 80: b4000157 cbz x23, 0xa8 <_JIT_ENTRY+0xa8> + // 84: d1002335 sub x21, x25, #0x8 + // 88: f81f0337 stur x23, [x25, #-0x10] + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 98: aa1303e0 mov x0, x19 + // 9c: f9400108 ldr x8, [x8] + // 000000000000009c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a0: d63f0100 blr x8 + // a4: b5ffff17 cbnz x23, 0x84 <_JIT_ENTRY+0x84> + // a8: d1004335 sub x21, x25, #0x10 + // ac: a8c17bfd ldp x29, x30, [sp], #0x10 + // b0: 14000000 b 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000b0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // b4: 00 00 00 00 + const unsigned char code_body[184] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0xb8, 0x4e, 0x7f, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x3d, 0x40, 0x92, + 0x08, 0xed, 0x7c, 0xd3, 0xe1, 0x03, 0x18, 0xaa, + 0xe2, 0x03, 0x13, 0xaa, 0x28, 0x69, 0x68, 0xf8, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x57, 0x01, 0x00, 0xb4, 0x35, 0x23, 0x00, 0xd1, + 0x37, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x17, 0xff, 0xff, 0xb5, + 0x35, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyIntrinsics_BinaryFunctions+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_BinaryFunctions); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x94, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x9c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xb0, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_ISINSTANCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_ISINSTANCE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 928000e9 mov x9, #-0x8 // =-8 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 12003d0a and w10, w8, #0xffff + // 18: 2a2a03f9 mvn w25, w10 + // 1c: f879daab ldr x11, [x21, w25, sxtw #3] + // 20: f100017f cmp x11, #0x0 + // 24: 1a8a054a cinc w10, w10, ne + // 28: 9a9f1129 csel x9, x9, xzr, ne + // 2c: 7100095f cmp w10, #0x2 + // 30: 54000141 b.ne 0x58 <_JIT_ENTRY+0x58> + // 34: 9280002a mov x10, #-0x2 // =-2 + // 38: 528ce00b mov w11, #0x6700 // =26368 + // 3c: cb282158 sub x24, x10, w8, uxth + // 40: f9400aca ldr x10, [x22, #0x10] + // 44: 72a0006b movk w11, #0x3, lsl #16 + // 48: f8787aac ldr x12, [x21, x24, lsl #3] + // 4c: f86b694a ldr x10, [x10, x11] + // 50: eb0c015f cmp x10, x12 + // 54: 54000060 b.eq 0x60 <_JIT_ENTRY+0x60> + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 60: cb282ea8 sub x8, x21, w8, uxth #3 + // 64: 8b090108 add x8, x8, x9 + // 68: a9400500 ldp x0, x1, [x8] + // 6c: f9002295 str x21, [x20, #0x40] + // 70: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE PyObject_IsInstance + // 74: f9400108 ldr x8, [x8] + // 0000000000000074: R_AARCH64_LD64_GOT_LO12_NC PyObject_IsInstance + // 78: d63f0100 blr x8 + // 7c: f9402293 ldr x19, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: 37f806a0 tbnz w0, #0x1f, 0x158 <_JIT_ENTRY+0x158> + // 88: 2a0003f7 mov w23, w0 + // 8c: f8787aa0 ldr x0, [x21, x24, lsl #3] + // 90: 93407f39 sxtw x25, w25 + // 94: b9400008 ldr w8, [x0] + // 98: 37f800e8 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000008 str w8, [x0] + // a4: 54000081 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // a8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // b0: d63f0100 blr x8 + // b4: f8797aa0 ldr x0, [x21, x25, lsl #3] + // b8: b4000120 cbz x0, 0xdc <_JIT_ENTRY+0xdc> + // bc: b9400008 ldr w8, [x0] + // c0: 37f800e8 tbnz w8, #0x1f, 0xdc <_JIT_ENTRY+0xdc> + // c4: 71000508 subs w8, w8, #0x1 + // c8: b9000008 str w8, [x0] + // cc: 54000081 b.ne 0xdc <_JIT_ENTRY+0xdc> + // d0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d4: f9400108 ldr x8, [x8] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d8: d63f0100 blr x8 + // dc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000dc: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // e0: f9400108 ldr x8, [x8] + // 00000000000000e0: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // e4: 72003d1f tst w8, #0xffff + // e8: 54000240 b.eq 0x130 <_JIT_ENTRY+0x130> + // ec: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 00000000000000ec: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f0: 92403d08 and x8, x8, #0xffff + // f4: d10022b5 sub x21, x21, #0x8 + // f8: f940035a ldr x26, [x26] + // 00000000000000f8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // fc: 9100051b add x27, x8, #0x1 + // 100: 14000004 b 0x110 <_JIT_ENTRY+0x110> + // 104: d100077b sub x27, x27, #0x1 + // 108: f100077f cmp x27, #0x1 + // 10c: 54000129 b.ls 0x130 <_JIT_ENTRY+0x130> + // 110: f85f86a0 ldr x0, [x21], #-0x8 + // 114: b9400008 ldr w8, [x0] + // 118: 37ffff68 tbnz w8, #0x1f, 0x104 <_JIT_ENTRY+0x104> + // 11c: 71000508 subs w8, w8, #0x1 + // 120: b9000008 str w8, [x0] + // 124: 54ffff01 b.ne 0x104 <_JIT_ENTRY+0x104> + // 128: d63f0340 blr x26 + // 12c: 17fffff6 b 0x104 <_JIT_ENTRY+0x104> + // 130: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000130: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 134: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000134: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 138: 710002ff cmp w23, #0x0 + // 13c: f9400108 ldr x8, [x8] + // 000000000000013c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 140: f9400129 ldr x9, [x9] + // 0000000000000140: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 144: 8b190e75 add x21, x19, x25, lsl #3 + // 148: 9a880128 csel x8, x9, x8, eq + // 14c: f8387a68 str x8, [x19, x24, lsl #3] + // 150: a8c17bfd ldp x29, x30, [sp], #0x10 + // 154: 14000000 b 0x154 <_JIT_ENTRY+0x154> + // 0000000000000154: R_AARCH64_JUMP26 _JIT_CONTINUE + // 158: aa1303f5 mov x21, x19 + // 15c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 160: 14000000 b 0x160 <_JIT_ENTRY+0x160> + // 0000000000000160: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 164: 00 00 00 00 + const unsigned char code_body[360] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xe9, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x0a, 0x3d, 0x00, 0x12, + 0xf9, 0x03, 0x2a, 0x2a, 0xab, 0xda, 0x79, 0xf8, + 0x7f, 0x01, 0x00, 0xf1, 0x4a, 0x05, 0x8a, 0x1a, + 0x29, 0x11, 0x9f, 0x9a, 0x5f, 0x09, 0x00, 0x71, + 0x41, 0x01, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x0b, 0xe0, 0x8c, 0x52, 0x58, 0x21, 0x28, 0xcb, + 0xca, 0x0a, 0x40, 0xf9, 0x6b, 0x00, 0xa0, 0x72, + 0xac, 0x7a, 0x78, 0xf8, 0x4a, 0x69, 0x6b, 0xf8, + 0x5f, 0x01, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xa8, 0x2e, 0x28, 0xcb, 0x08, 0x01, 0x09, 0x8b, + 0x00, 0x05, 0x40, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x93, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x06, 0xf8, 0x37, + 0xf7, 0x03, 0x00, 0x2a, 0xa0, 0x7a, 0x78, 0xf8, + 0x39, 0x7f, 0x40, 0x93, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xa0, 0x7a, 0x79, 0xf8, + 0x20, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x02, 0x00, 0x54, 0x1a, 0x00, 0x00, 0x90, + 0x08, 0x3d, 0x40, 0x92, 0xb5, 0x22, 0x00, 0xd1, + 0x5a, 0x03, 0x40, 0xf9, 0x1b, 0x05, 0x00, 0x91, + 0x04, 0x00, 0x00, 0x14, 0x7b, 0x07, 0x00, 0xd1, + 0x7f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x40, 0x03, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0xff, 0x02, 0x00, 0x71, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x75, 0x0e, 0x19, 0x8b, + 0x28, 0x01, 0x88, 0x9a, 0x68, 0x7a, 0x38, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x13, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_IsInstance+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_FalseStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_IsInstance); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x70, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xa8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xd0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xdc, (uintptr_t)data); + patch_aarch64_21rx(code + 0xec, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xf8, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x130, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x134, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x13c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x140, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x154, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x160, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_KW_NON_PY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_KW_NON_PY.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 9280002a mov x10, #-0x2 // =-2 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f85f82b7 ldur x23, [x21, #-0x8] + // 18: 92403d09 and x9, x8, #0xffff + // 1c: 12003d1a and w26, w8, #0xffff + // 20: b94012e8 ldr w8, [x23, #0x10] + // 24: cb090158 sub x24, x10, x9 + // 28: 2a3a03f9 mvn w25, w26 + // 2c: aa1703e3 mov x3, x23 + // 30: f8787aaa ldr x10, [x21, x24, lsl #3] + // 34: 8b39ceac add x12, x21, w25, sxtw #3 + // 38: f100015f cmp x10, #0x0 + // 3c: 9280004a mov x10, #-0x3 // =-3 + // 40: 1a9a074b cinc w11, w26, ne + // 44: cb09015b sub x27, x10, x9 + // 48: 928000e9 mov x9, #-0x8 // =-8 + // 4c: 4b080168 sub w8, w11, w8 + // 50: f87b7aa0 ldr x0, [x21, x27, lsl #3] + // 54: f9002295 str x21, [x20, #0x40] + // 58: 93407d08 sxtw x8, w8 + // 5c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE PyObject_Vectorcall + // 60: 9a9f1129 csel x9, x9, xzr, ne + // 64: f940014a ldr x10, [x10] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC PyObject_Vectorcall + // 68: 8b090181 add x1, x12, x9 + // 6c: b2410102 orr x2, x8, #0x8000000000000000 + // 70: d63f0140 blr x10 + // 74: f9402288 ldr x8, [x20, #0x40] + // 78: aa0003f3 mov x19, x0 + // 7c: d1002108 sub x8, x8, #0x8 + // 80: f9002288 str x8, [x20, #0x40] + // 84: b94002e8 ldr w8, [x23] + // 88: 37f80108 tbnz w8, #0x1f, 0xa8 <_JIT_ENTRY+0xa8> + // 8c: 71000508 subs w8, w8, #0x1 + // 90: b90002e8 str w8, [x23] + // 94: 540000a1 b.ne 0xa8 <_JIT_ENTRY+0xa8> + // 98: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000098: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 9c: aa1703e0 mov x0, x23 + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a4: d63f0100 blr x8 + // a8: f9402297 ldr x23, [x20, #0x40] + // ac: f900229f str xzr, [x20, #0x40] + // b0: f87b7aa0 ldr x0, [x21, x27, lsl #3] + // b4: b9400008 ldr w8, [x0] + // b8: 37f800e8 tbnz w8, #0x1f, 0xd4 <_JIT_ENTRY+0xd4> + // bc: 71000508 subs w8, w8, #0x1 + // c0: b9000008 str w8, [x0] + // c4: 54000081 b.ne 0xd4 <_JIT_ENTRY+0xd4> + // c8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: f9400108 ldr x8, [x8] + // 00000000000000cc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d0: d63f0100 blr x8 + // d4: f8787aa0 ldr x0, [x21, x24, lsl #3] + // d8: b4000120 cbz x0, 0xfc <_JIT_ENTRY+0xfc> + // dc: b9400008 ldr w8, [x0] + // e0: 37f800e8 tbnz w8, #0x1f, 0xfc <_JIT_ENTRY+0xfc> + // e4: 71000508 subs w8, w8, #0x1 + // e8: b9000008 str w8, [x0] + // ec: 54000081 b.ne 0xfc <_JIT_ENTRY+0xfc> + // f0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000f0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f4: f9400108 ldr x8, [x8] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f8: d63f0100 blr x8 + // fc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000fc: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 100: f9400108 ldr x8, [x8] + // 0000000000000100: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 104: 72003d1f tst w8, #0xffff + // 108: 540002c0 b.eq 0x160 <_JIT_ENTRY+0x160> + // 10c: 4b1a03e9 neg w9, w26 + // 110: 937d7d29 sbfiz x9, x9, #3, #32 + // 114: 8b282d29 add x9, x9, w8, uxth #3 + // 118: 92403d08 and x8, x8, #0xffff + // 11c: 9100051a add x26, x8, #0x1 + // 120: 8b150129 add x9, x9, x21 + // 124: 90000015 adrp x21, 0x0 <_JIT_ENTRY> + // 0000000000000124: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 128: f94002b5 ldr x21, [x21] + // 0000000000000128: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 12c: d100413b sub x27, x9, #0x10 + // 130: 14000004 b 0x140 <_JIT_ENTRY+0x140> + // 134: d100075a sub x26, x26, #0x1 + // 138: f100075f cmp x26, #0x1 + // 13c: 54000129 b.ls 0x160 <_JIT_ENTRY+0x160> + // 140: f85f8760 ldr x0, [x27], #-0x8 + // 144: b9400008 ldr w8, [x0] + // 148: 37ffff68 tbnz w8, #0x1f, 0x134 <_JIT_ENTRY+0x134> + // 14c: 71000508 subs w8, w8, #0x1 + // 150: b9000008 str w8, [x0] + // 154: 54ffff01 b.ne 0x134 <_JIT_ENTRY+0x134> + // 158: d63f02a0 blr x21 + // 15c: 17fffff6 b 0x134 <_JIT_ENTRY+0x134> + // 160: b40000d3 cbz x19, 0x178 <_JIT_ENTRY+0x178> + // 164: 93407f28 sxtw x8, w25 + // 168: f8387af3 str x19, [x23, x24, lsl #3] + // 16c: 8b080ef5 add x21, x23, x8, lsl #3 + // 170: a8c17bfd ldp x29, x30, [sp], #0x10 + // 174: 14000000 b 0x174 <_JIT_ENTRY+0x174> + // 0000000000000174: R_AARCH64_JUMP26 _JIT_CONTINUE + // 178: 8b180ef5 add x21, x23, x24, lsl #3 + // 17c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 180: 14000000 b 0x180 <_JIT_ENTRY+0x180> + // 0000000000000180: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 184: 00 00 00 00 + const unsigned char code_body[392] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x2a, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xb7, 0x82, 0x5f, 0xf8, + 0x09, 0x3d, 0x40, 0x92, 0x1a, 0x3d, 0x00, 0x12, + 0xe8, 0x12, 0x40, 0xb9, 0x58, 0x01, 0x09, 0xcb, + 0xf9, 0x03, 0x3a, 0x2a, 0xe3, 0x03, 0x17, 0xaa, + 0xaa, 0x7a, 0x78, 0xf8, 0xac, 0xce, 0x39, 0x8b, + 0x5f, 0x01, 0x00, 0xf1, 0x4a, 0x00, 0x80, 0x92, + 0x4b, 0x07, 0x9a, 0x1a, 0x5b, 0x01, 0x09, 0xcb, + 0xe9, 0x00, 0x80, 0x92, 0x68, 0x01, 0x08, 0x4b, + 0xa0, 0x7a, 0x7b, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x7d, 0x40, 0x93, 0x0a, 0x00, 0x00, 0x90, + 0x29, 0x11, 0x9f, 0x9a, 0x4a, 0x01, 0x40, 0xf9, + 0x81, 0x01, 0x09, 0x8b, 0x02, 0x01, 0x41, 0xb2, + 0x40, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x97, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x7a, 0x7b, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xa0, 0x7a, 0x78, 0xf8, + 0x20, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0xc0, 0x02, 0x00, 0x54, 0xe9, 0x03, 0x1a, 0x4b, + 0x29, 0x7d, 0x7d, 0x93, 0x29, 0x2d, 0x28, 0x8b, + 0x08, 0x3d, 0x40, 0x92, 0x1a, 0x05, 0x00, 0x91, + 0x29, 0x01, 0x15, 0x8b, 0x15, 0x00, 0x00, 0x90, + 0xb5, 0x02, 0x40, 0xf9, 0x3b, 0x41, 0x00, 0xd1, + 0x04, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0xd1, + 0x5f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0x60, 0x87, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0xa0, 0x02, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0xd3, 0x00, 0x00, 0xb4, 0x28, 0x7f, 0x40, 0x93, + 0xf3, 0x7a, 0x38, 0xf8, 0xf5, 0x0e, 0x08, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x0e, 0x18, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_Vectorcall+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x98, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xa0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xf0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xfc, (uintptr_t)data); + patch_aarch64_33rx(code + 0x124, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x174, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x180, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LEN.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 928000e9 mov x9, #-0x8 // =-8 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 12003d0a and w10, w8, #0xffff + // 18: 2a2a03eb mvn w11, w10 + // 1c: f86bdaab ldr x11, [x21, w11, sxtw #3] + // 20: f100017f cmp x11, #0x0 + // 24: 1a8a054a cinc w10, w10, ne + // 28: 9a9f1129 csel x9, x9, xzr, ne + // 2c: 7100055f cmp w10, #0x1 + // 30: 54000141 b.ne 0x58 <_JIT_ENTRY+0x58> + // 34: 9280002a mov x10, #-0x2 // =-2 + // 38: 528ce10b mov w11, #0x6708 // =26376 + // 3c: cb282158 sub x24, x10, w8, uxth + // 40: f9400aca ldr x10, [x22, #0x10] + // 44: 72a0006b movk w11, #0x3, lsl #16 + // 48: f8787aac ldr x12, [x21, x24, lsl #3] + // 4c: f86b694a ldr x10, [x10, x11] + // 50: eb0c015f cmp x10, x12 + // 54: 54000060 b.eq 0x60 <_JIT_ENTRY+0x60> + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 60: cb282ea8 sub x8, x21, w8, uxth #3 + // 64: f8696913 ldr x19, [x8, x9] + // 68: f9002295 str x21, [x20, #0x40] + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE PyObject_Size + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC PyObject_Size + // 74: aa1303e0 mov x0, x19 + // 78: d63f0100 blr x8 + // 7c: f9402297 ldr x23, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: b7f804a0 tbnz x0, #0x3f, 0x118 <_JIT_ENTRY+0x118> + // 88: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_GOT_PAGE PyLong_FromSsize_t + // 8c: f9400108 ldr x8, [x8] + // 000000000000008c: R_AARCH64_LD64_GOT_LO12_NC PyLong_FromSsize_t + // 90: d63f0100 blr x8 + // 94: b4000420 cbz x0, 0x118 <_JIT_ENTRY+0x118> + // 98: f9002297 str x23, [x20, #0x40] + // 9c: b9400268 ldr w8, [x19] + // a0: 37f80148 tbnz w8, #0x1f, 0xc8 <_JIT_ENTRY+0xc8> + // a4: 71000508 subs w8, w8, #0x1 + // a8: b9000268 str w8, [x19] + // ac: 540000e1 b.ne 0xc8 <_JIT_ENTRY+0xc8> + // b0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // b4: aa0003f7 mov x23, x0 + // b8: aa1303e0 mov x0, x19 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c0: d63f0100 blr x8 + // c4: aa1703e0 mov x0, x23 + // c8: f9402288 ldr x8, [x20, #0x40] + // cc: 8b180d08 add x8, x8, x24, lsl #3 + // d0: f9002288 str x8, [x20, #0x40] + // d4: f8787aa8 ldr x8, [x21, x24, lsl #3] + // d8: b9400109 ldr w9, [x8] + // dc: 37f80149 tbnz w9, #0x1f, 0x104 <_JIT_ENTRY+0x104> + // e0: 71000529 subs w9, w9, #0x1 + // e4: b9000109 str w9, [x8] + // e8: 540000e1 b.ne 0x104 <_JIT_ENTRY+0x104> + // ec: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000ec: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f0: aa0003f3 mov x19, x0 + // f4: aa0803e0 mov x0, x8 + // f8: f9400129 ldr x9, [x9] + // 00000000000000f8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // fc: d63f0120 blr x9 + // 100: aa1303e0 mov x0, x19 + // 104: f9402295 ldr x21, [x20, #0x40] + // 108: f900229f str xzr, [x20, #0x40] + // 10c: f80086a0 str x0, [x21], #0x8 + // 110: a8c17bfd ldp x29, x30, [sp], #0x10 + // 114: 14000000 b 0x114 <_JIT_ENTRY+0x114> + // 0000000000000114: R_AARCH64_JUMP26 _JIT_CONTINUE + // 118: aa1703f5 mov x21, x23 + // 11c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 120: 14000000 b 0x120 <_JIT_ENTRY+0x120> + // 0000000000000120: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 124: 00 00 00 00 + const unsigned char code_body[296] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xe9, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x0a, 0x3d, 0x00, 0x12, + 0xeb, 0x03, 0x2a, 0x2a, 0xab, 0xda, 0x6b, 0xf8, + 0x7f, 0x01, 0x00, 0xf1, 0x4a, 0x05, 0x8a, 0x1a, + 0x29, 0x11, 0x9f, 0x9a, 0x5f, 0x05, 0x00, 0x71, + 0x41, 0x01, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x0b, 0xe1, 0x8c, 0x52, 0x58, 0x21, 0x28, 0xcb, + 0xca, 0x0a, 0x40, 0xf9, 0x6b, 0x00, 0xa0, 0x72, + 0xac, 0x7a, 0x78, 0xf8, 0x4a, 0x69, 0x6b, 0xf8, + 0x5f, 0x01, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xa8, 0x2e, 0x28, 0xcb, 0x13, 0x69, 0x69, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x97, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x04, 0xf8, 0xb7, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x20, 0x04, 0x00, 0xb4, + 0x97, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x48, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x0d, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0xa8, 0x7a, 0x78, 0xf8, + 0x09, 0x01, 0x40, 0xb9, 0x49, 0x01, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x71, 0x09, 0x01, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0xf3, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x08, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x13, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x17, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_Size+0x0 + // 10: &PyLong_FromSsize_t+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Size); + patch_64(data + 0x10, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x88, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xb0, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xec, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xf8, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x114, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x120, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LIST_APPEND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 528ce208 mov w8, #0x6710 // =26384 + // 4: f9400ac9 ldr x9, [x22, #0x10] + // 8: aa1503f8 mov x24, x21 + // c: 72a00068 movk w8, #0x3, lsl #16 + // 10: f85f0f17 ldr x23, [x24, #-0x10]! + // 14: f85f8313 ldur x19, [x24, #-0x8] + // 18: f8686928 ldr x8, [x9, x8] + // 1c: eb13011f cmp x8, x19 + // 20: 54000081 b.ne 0x30 <_JIT_ENTRY+0x30> + // 24: f94006e8 ldr x8, [x23, #0x8] + // 28: 3942ad08 ldrb w8, [x8, #0xab] + // 2c: 37080048 tbnz w8, #0x1, 0x34 <_JIT_ENTRY+0x34> + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: f9400ae8 ldr x8, [x23, #0x10] + // 3c: f94012e9 ldr x9, [x23, #0x20] + // 40: 910003fd mov x29, sp + // 44: f9400701 ldr x1, [x24, #0x8] + // 48: eb08013f cmp x9, x8 + // 4c: 5400014d b.le 0x74 <_JIT_ENTRY+0x74> + // 50: f9400ee9 ldr x9, [x23, #0x18] + // 54: 9100050a add x10, x8, #0x1 + // 58: 52800039 mov w25, #0x1 // =1 + // 5c: f9000aea str x10, [x23, #0x10] + // 60: f8287921 str x1, [x9, x8, lsl #3] + // 64: f9002298 str x24, [x20, #0x40] + // 68: b94002e8 ldr w8, [x23] + // 6c: 36f80168 tbz w8, #0x1f, 0x98 <_JIT_ENTRY+0x98> + // 70: 14000011 b 0xb4 <_JIT_ENTRY+0xb4> + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _PyList_AppendTakeRefListResize + // 78: aa1703e0 mov x0, x23 + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _PyList_AppendTakeRefListResize + // 80: d63f0100 blr x8 + // 84: 7100001f cmp w0, #0x0 + // 88: 1a9f17f9 cset w25, eq + // 8c: f9002298 str x24, [x20, #0x40] + // 90: b94002e8 ldr w8, [x23] + // 94: 37f80108 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b90002e8 str w8, [x23] + // a0: 540000a1 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a8: aa1703e0 mov x0, x23 + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // b0: d63f0100 blr x8 + // b4: f9402288 ldr x8, [x20, #0x40] + // b8: d1002108 sub x8, x8, #0x8 + // bc: f9002288 str x8, [x20, #0x40] + // c0: b9400268 ldr w8, [x19] + // c4: 37f80088 tbnz w8, #0x1f, 0xd4 <_JIT_ENTRY+0xd4> + // c8: 71000508 subs w8, w8, #0x1 + // cc: b9000268 str w8, [x19] + // d0: 540000c0 b.eq 0xe8 <_JIT_ENTRY+0xe8> + // d4: f9402295 ldr x21, [x20, #0x40] + // d8: f900229f str xzr, [x20, #0x40] + // dc: a8c17bfd ldp x29, x30, [sp], #0x10 + // e0: 36000159 tbz w25, #0x0, 0x108 <_JIT_ENTRY+0x108> + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_CONTINUE + // e8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // ec: aa1303e0 mov x0, x19 + // f0: f9400108 ldr x8, [x8] + // 00000000000000f0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f4: d63f0100 blr x8 + // f8: f9402295 ldr x21, [x20, #0x40] + // fc: f900229f str xzr, [x20, #0x40] + // 100: a8c17bfd ldp x29, x30, [sp], #0x10 + // 104: 3707ff19 tbnz w25, #0x0, 0xe4 <_JIT_ENTRY+0xe4> + // 108: 14000000 b 0x108 <_JIT_ENTRY+0x108> + // 0000000000000108: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 10c: 00 00 00 00 + const unsigned char code_body[272] = { + 0x08, 0xe2, 0x8c, 0x52, 0xc9, 0x0a, 0x40, 0xf9, + 0xf8, 0x03, 0x15, 0xaa, 0x68, 0x00, 0xa0, 0x72, + 0x17, 0x0f, 0x5f, 0xf8, 0x13, 0x83, 0x5f, 0xf8, + 0x28, 0x69, 0x68, 0xf8, 0x1f, 0x01, 0x13, 0xeb, + 0x81, 0x00, 0x00, 0x54, 0xe8, 0x06, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0x48, 0x00, 0x08, 0x37, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xe8, 0x0a, 0x40, 0xf9, 0xe9, 0x12, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x07, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x4d, 0x01, 0x00, 0x54, + 0xe9, 0x0e, 0x40, 0xf9, 0x0a, 0x05, 0x00, 0x91, + 0x39, 0x00, 0x80, 0x52, 0xea, 0x0a, 0x00, 0xf9, + 0x21, 0x79, 0x28, 0xf8, 0x98, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0x68, 0x01, 0xf8, 0x36, + 0x11, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0xf9, 0x17, 0x9f, 0x1a, 0x98, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x21, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x59, 0x01, 0x00, 0x36, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x19, 0xff, 0x07, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyList_AppendTakeRefListResize+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyList_AppendTakeRefListResize); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xe4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xe8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xf0, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x108, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800028 mov x8, #-0x2 // =-2 + // c: 9000000f adrp x15, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyMethodDescr_Type + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 928000ee mov x14, #-0x8 // =-8 + // 18: 910003fd mov x29, sp + // 1c: cb2a2117 sub x23, x8, w10, uxth + // 20: 12003d49 and w9, w10, #0xffff + // 24: 2a2903e8 mvn w8, w9 + // 28: f8777aac ldr x12, [x21, x23, lsl #3] + // 2c: f868daab ldr x11, [x21, w8, sxtw #3] + // 30: f940058d ldr x13, [x12, #0x8] + // 34: f94001ef ldr x15, [x15] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PyMethodDescr_Type + // 38: f100017f cmp x11, #0x0 + // 3c: 1a9f07eb cset w11, ne + // 40: 9a9f11ce csel x14, x14, xzr, ne + // 44: eb0f01bf cmp x13, x15 + // 48: 54000181 b.ne 0x78 <_JIT_ENTRY+0x78> + // 4c: f940158d ldr x13, [x12, #0x28] + // 50: b94011af ldr w15, [x13, #0x10] + // 54: 710201ff cmp w15, #0x80 + // 58: 54000101 b.ne 0x78 <_JIT_ENTRY+0x78> + // 5c: cb2a2eaa sub x10, x21, w10, uxth #3 + // 60: f940098c ldr x12, [x12, #0x10] + // 64: 8b0e014a add x10, x10, x14 + // 68: f9400140 ldr x0, [x10] + // 6c: f940040e ldr x14, [x0, #0x8] + // 70: eb0c01df cmp x14, x12 + // 74: 54000060 b.eq 0x80 <_JIT_ENTRY+0x80> + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c <_JIT_ENTRY+0x7c> + // 000000000000007c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 80: 0b0b0129 add w9, w9, w11 + // 84: 93407d18 sxtw x24, w8 + // 88: f94005a8 ldr x8, [x13, #0x8] + // 8c: 51000529 sub w9, w9, #0x1 + // 90: 91002141 add x1, x10, #0x8 + // 94: f9002295 str x21, [x20, #0x40] + // 98: 93407d22 sxtw x2, w9 + // 9c: d63f0100 blr x8 + // a0: f9402299 ldr x25, [x20, #0x40] + // a4: f900229f str xzr, [x20, #0x40] + // a8: aa0003f3 mov x19, x0 + // ac: f8777aa8 ldr x8, [x21, x23, lsl #3] + // b0: b9400109 ldr w9, [x8] + // b4: 37f80109 tbnz w9, #0x1f, 0xd4 <_JIT_ENTRY+0xd4> + // b8: 71000529 subs w9, w9, #0x1 + // bc: b9000109 str w9, [x8] + // c0: 540000a1 b.ne 0xd4 <_JIT_ENTRY+0xd4> + // c4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c8: aa0803e0 mov x0, x8 + // cc: f9400129 ldr x9, [x9] + // 00000000000000cc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d0: d63f0120 blr x9 + // d4: f8787aa0 ldr x0, [x21, x24, lsl #3] + // d8: b4000120 cbz x0, 0xfc <_JIT_ENTRY+0xfc> + // dc: b9400008 ldr w8, [x0] + // e0: 37f800e8 tbnz w8, #0x1f, 0xfc <_JIT_ENTRY+0xfc> + // e4: 71000508 subs w8, w8, #0x1 + // e8: b9000008 str w8, [x0] + // ec: 54000081 b.ne 0xfc <_JIT_ENTRY+0xfc> + // f0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000f0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f4: f9400108 ldr x8, [x8] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f8: d63f0100 blr x8 + // fc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000fc: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 100: f9400108 ldr x8, [x8] + // 0000000000000100: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 104: 72003d1f tst w8, #0xffff + // 108: 54000240 b.eq 0x150 <_JIT_ENTRY+0x150> + // 10c: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 000000000000010c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 110: 92403d08 and x8, x8, #0xffff + // 114: d10022b5 sub x21, x21, #0x8 + // 118: f940035a ldr x26, [x26] + // 0000000000000118: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 11c: 9100051b add x27, x8, #0x1 + // 120: 14000004 b 0x130 <_JIT_ENTRY+0x130> + // 124: d100077b sub x27, x27, #0x1 + // 128: f100077f cmp x27, #0x1 + // 12c: 54000129 b.ls 0x150 <_JIT_ENTRY+0x150> + // 130: f85f86a0 ldr x0, [x21], #-0x8 + // 134: b9400008 ldr w8, [x0] + // 138: 37ffff68 tbnz w8, #0x1f, 0x124 <_JIT_ENTRY+0x124> + // 13c: 71000508 subs w8, w8, #0x1 + // 140: b9000008 str w8, [x0] + // 144: 54ffff01 b.ne 0x124 <_JIT_ENTRY+0x124> + // 148: d63f0340 blr x26 + // 14c: 17fffff6 b 0x124 <_JIT_ENTRY+0x124> + // 150: b40000b3 cbz x19, 0x164 <_JIT_ENTRY+0x164> + // 154: 8b180f35 add x21, x25, x24, lsl #3 + // 158: f8377b33 str x19, [x25, x23, lsl #3] + // 15c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 160: 14000000 b 0x160 <_JIT_ENTRY+0x160> + // 0000000000000160: R_AARCH64_JUMP26 _JIT_CONTINUE + // 164: 8b170f35 add x21, x25, x23, lsl #3 + // 168: a8c17bfd ldp x29, x30, [sp], #0x10 + // 16c: 14000000 b 0x16c <_JIT_ENTRY+0x16c> + // 000000000000016c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[368] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x0a, 0x00, 0x00, 0x90, + 0x28, 0x00, 0x80, 0x92, 0x0f, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0xee, 0x00, 0x80, 0x92, + 0xfd, 0x03, 0x00, 0x91, 0x17, 0x21, 0x2a, 0xcb, + 0x49, 0x3d, 0x00, 0x12, 0xe8, 0x03, 0x29, 0x2a, + 0xac, 0x7a, 0x77, 0xf8, 0xab, 0xda, 0x68, 0xf8, + 0x8d, 0x05, 0x40, 0xf9, 0xef, 0x01, 0x40, 0xf9, + 0x7f, 0x01, 0x00, 0xf1, 0xeb, 0x07, 0x9f, 0x1a, + 0xce, 0x11, 0x9f, 0x9a, 0xbf, 0x01, 0x0f, 0xeb, + 0x81, 0x01, 0x00, 0x54, 0x8d, 0x15, 0x40, 0xf9, + 0xaf, 0x11, 0x40, 0xb9, 0xff, 0x01, 0x02, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xaa, 0x2e, 0x2a, 0xcb, + 0x8c, 0x09, 0x40, 0xf9, 0x4a, 0x01, 0x0e, 0x8b, + 0x40, 0x01, 0x40, 0xf9, 0x0e, 0x04, 0x40, 0xf9, + 0xdf, 0x01, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x29, 0x01, 0x0b, 0x0b, 0x18, 0x7d, 0x40, 0x93, + 0xa8, 0x05, 0x40, 0xf9, 0x29, 0x05, 0x00, 0x51, + 0x41, 0x21, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x22, 0x7d, 0x40, 0x93, 0x00, 0x01, 0x3f, 0xd6, + 0x99, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0xa8, 0x7a, 0x77, 0xf8, + 0x09, 0x01, 0x40, 0xb9, 0x09, 0x01, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x71, 0x09, 0x01, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x08, 0xaa, 0x29, 0x01, 0x40, 0xf9, + 0x20, 0x01, 0x3f, 0xd6, 0xa0, 0x7a, 0x78, 0xf8, + 0x20, 0x01, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x3d, 0x00, 0x72, + 0x40, 0x02, 0x00, 0x54, 0x1a, 0x00, 0x00, 0x90, + 0x08, 0x3d, 0x40, 0x92, 0xb5, 0x22, 0x00, 0xd1, + 0x5a, 0x03, 0x40, 0xf9, 0x1b, 0x05, 0x00, 0x91, + 0x04, 0x00, 0x00, 0x14, 0x7b, 0x07, 0x00, 0xd1, + 0x7f, 0x07, 0x00, 0xf1, 0x29, 0x01, 0x00, 0x54, + 0xa0, 0x86, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0xff, 0xff, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x01, 0xff, 0xff, 0x54, + 0x40, 0x03, 0x3f, 0xd6, 0xf6, 0xff, 0xff, 0x17, + 0xb3, 0x00, 0x00, 0xb4, 0x35, 0x0f, 0x18, 0x8b, + 0x33, 0x7b, 0x37, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x35, 0x0f, 0x17, 0x8b, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0xc4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xcc, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xf0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xfc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x10c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x118, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x160, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x16c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800028 mov x8, #-0x2 // =-2 + // c: 9000000f adrp x15, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyMethodDescr_Type + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 928000ee mov x14, #-0x8 // =-8 + // 18: 910003fd mov x29, sp + // 1c: cb2a2117 sub x23, x8, w10, uxth + // 20: 12003d49 and w9, w10, #0xffff + // 24: 2a2903e8 mvn w8, w9 + // 28: f8777aac ldr x12, [x21, x23, lsl #3] + // 2c: f868daab ldr x11, [x21, w8, sxtw #3] + // 30: f940058d ldr x13, [x12, #0x8] + // 34: f94001ef ldr x15, [x15] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PyMethodDescr_Type + // 38: f100017f cmp x11, #0x0 + // 3c: 1a9f07eb cset w11, ne + // 40: 9a9f11ce csel x14, x14, xzr, ne + // 44: eb0f01bf cmp x13, x15 + // 48: 54000181 b.ne 0x78 <_JIT_ENTRY+0x78> + // 4c: f940158d ldr x13, [x12, #0x28] + // 50: b94011af ldr w15, [x13, #0x10] + // 54: 710209ff cmp w15, #0x82 + // 58: 54000101 b.ne 0x78 <_JIT_ENTRY+0x78> + // 5c: cb2a2eaa sub x10, x21, w10, uxth #3 + // 60: f940098c ldr x12, [x12, #0x10] + // 64: 8b0e014a add x10, x10, x14 + // 68: f9400140 ldr x0, [x10] + // 6c: f940040e ldr x14, [x0, #0x8] + // 70: eb0c01df cmp x14, x12 + // 74: 54000060 b.eq 0x80 <_JIT_ENTRY+0x80> + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c <_JIT_ENTRY+0x7c> + // 000000000000007c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 80: 0b0b0129 add w9, w9, w11 + // 84: 93407d18 sxtw x24, w8 + // 88: f94005a8 ldr x8, [x13, #0x8] + // 8c: 51000529 sub w9, w9, #0x1 + // 90: 91002141 add x1, x10, #0x8 + // 94: aa1f03e3 mov x3, xzr + // 98: 93407d22 sxtw x2, w9 + // 9c: f9002295 str x21, [x20, #0x40] + // a0: d63f0100 blr x8 + // a4: f9402299 ldr x25, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: aa0003f3 mov x19, x0 + // b0: f8777aa8 ldr x8, [x21, x23, lsl #3] + // b4: b9400109 ldr w9, [x8] + // b8: 37f80109 tbnz w9, #0x1f, 0xd8 <_JIT_ENTRY+0xd8> + // bc: 71000529 subs w9, w9, #0x1 + // c0: b9000109 str w9, [x8] + // c4: 540000a1 b.ne 0xd8 <_JIT_ENTRY+0xd8> + // c8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: aa0803e0 mov x0, x8 + // d0: f9400129 ldr x9, [x9] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d4: d63f0120 blr x9 + // d8: f8787aa0 ldr x0, [x21, x24, lsl #3] + // dc: b4000120 cbz x0, 0x100 <_JIT_ENTRY+0x100> + // e0: b9400008 ldr w8, [x0] + // e4: 37f800e8 tbnz w8, #0x1f, 0x100 <_JIT_ENTRY+0x100> + // e8: 71000508 subs w8, w8, #0x1 + // ec: b9000008 str w8, [x0] + // f0: 54000081 b.ne 0x100 <_JIT_ENTRY+0x100> + // f4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000f4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f8: f9400108 ldr x8, [x8] + // 00000000000000f8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // fc: d63f0100 blr x8 + // 100: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000100: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 104: f9400108 ldr x8, [x8] + // 0000000000000104: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 108: 72003d1f tst w8, #0xffff + // 10c: 54000240 b.eq 0x154 <_JIT_ENTRY+0x154> + // 110: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 0000000000000110: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 114: 92403d08 and x8, x8, #0xffff + // 118: d10022b5 sub x21, x21, #0x8 + // 11c: f940035a ldr x26, [x26] + // 000000000000011c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 120: 9100051b add x27, x8, #0x1 + // 124: 14000004 b 0x134 <_JIT_ENTRY+0x134> + // 128: d100077b sub x27, x27, #0x1 + // 12c: f100077f cmp x27, #0x1 + // 130: 54000129 b.ls 0x154 <_JIT_ENTRY+0x154> + // 134: f85f86a0 ldr x0, [x21], #-0x8 + // 138: b9400008 ldr w8, [x0] + // 13c: 37ffff68 tbnz w8, #0x1f, 0x128 <_JIT_ENTRY+0x128> + // 140: 71000508 subs w8, w8, #0x1 + // 144: b9000008 str w8, [x0] + // 148: 54ffff01 b.ne 0x128 <_JIT_ENTRY+0x128> + // 14c: d63f0340 blr x26 + // 150: 17fffff6 b 0x128 <_JIT_ENTRY+0x128> + // 154: b40000b3 cbz x19, 0x168 <_JIT_ENTRY+0x168> + // 158: 8b180f35 add x21, x25, x24, lsl #3 + // 15c: f8377b33 str x19, [x25, x23, lsl #3] + // 160: a8c17bfd ldp x29, x30, [sp], #0x10 + // 164: 14000000 b 0x164 <_JIT_ENTRY+0x164> + // 0000000000000164: R_AARCH64_JUMP26 _JIT_CONTINUE + // 168: 8b170f35 add x21, x25, x23, lsl #3 + // 16c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 170: 14000000 b 0x170 <_JIT_ENTRY+0x170> + // 0000000000000170: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 174: 00 00 00 00 + const unsigned char code_body[376] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x0a, 0x00, 0x00, 0x90, + 0x28, 0x00, 0x80, 0x92, 0x0f, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0xee, 0x00, 0x80, 0x92, + 0xfd, 0x03, 0x00, 0x91, 0x17, 0x21, 0x2a, 0xcb, + 0x49, 0x3d, 0x00, 0x12, 0xe8, 0x03, 0x29, 0x2a, + 0xac, 0x7a, 0x77, 0xf8, 0xab, 0xda, 0x68, 0xf8, + 0x8d, 0x05, 0x40, 0xf9, 0xef, 0x01, 0x40, 0xf9, + 0x7f, 0x01, 0x00, 0xf1, 0xeb, 0x07, 0x9f, 0x1a, + 0xce, 0x11, 0x9f, 0x9a, 0xbf, 0x01, 0x0f, 0xeb, + 0x81, 0x01, 0x00, 0x54, 0x8d, 0x15, 0x40, 0xf9, + 0xaf, 0x11, 0x40, 0xb9, 0xff, 0x09, 0x02, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xaa, 0x2e, 0x2a, 0xcb, + 0x8c, 0x09, 0x40, 0xf9, 0x4a, 0x01, 0x0e, 0x8b, + 0x40, 0x01, 0x40, 0xf9, 0x0e, 0x04, 0x40, 0xf9, + 0xdf, 0x01, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x29, 0x01, 0x0b, 0x0b, 0x18, 0x7d, 0x40, 0x93, + 0xa8, 0x05, 0x40, 0xf9, 0x29, 0x05, 0x00, 0x51, + 0x41, 0x21, 0x00, 0x91, 0xe3, 0x03, 0x1f, 0xaa, + 0x22, 0x7d, 0x40, 0x93, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xa8, 0x7a, 0x77, 0xf8, 0x09, 0x01, 0x40, 0xb9, + 0x09, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x08, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, + 0xa0, 0x7a, 0x78, 0xf8, 0x20, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x40, 0x02, 0x00, 0x54, + 0x1a, 0x00, 0x00, 0x90, 0x08, 0x3d, 0x40, 0x92, + 0xb5, 0x22, 0x00, 0xd1, 0x5a, 0x03, 0x40, 0xf9, + 0x1b, 0x05, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x7b, 0x07, 0x00, 0xd1, 0x7f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x40, 0x03, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0xb3, 0x00, 0x00, 0xb4, + 0x35, 0x0f, 0x18, 0x8b, 0x33, 0x7b, 0x37, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xd0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xf4, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x100, (uintptr_t)data); + patch_aarch64_21rx(code + 0x110, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x11c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x164, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x170, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_NOARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_NOARGS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 928000e9 mov x9, #-0x8 // =-8 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 12003d0a and w10, w8, #0xffff + // 18: 2a2a03eb mvn w11, w10 + // 1c: f86bdaab ldr x11, [x21, w11, sxtw #3] + // 20: f100017f cmp x11, #0x0 + // 24: 1a8a054a cinc w10, w10, ne + // 28: 9a9f1129 csel x9, x9, xzr, ne + // 2c: 7100055f cmp w10, #0x1 + // 30: 54000781 b.ne 0x120 <_JIT_ENTRY+0x120> + // 34: 9280002a mov x10, #-0x2 // =-2 + // 38: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE PyMethodDescr_Type + // 3c: cb282158 sub x24, x10, w8, uxth + // 40: f8787aaa ldr x10, [x21, x24, lsl #3] + // 44: f940054b ldr x11, [x10, #0x8] + // 48: f940018c ldr x12, [x12] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC PyMethodDescr_Type + // 4c: eb0c017f cmp x11, x12 + // 50: 54000681 b.ne 0x120 <_JIT_ENTRY+0x120> + // 54: cb282ea8 sub x8, x21, w8, uxth #3 + // 58: f8696913 ldr x19, [x8, x9] + // 5c: f9400948 ldr x8, [x10, #0x10] + // 60: f9400669 ldr x9, [x19, #0x8] + // 64: eb08013f cmp x9, x8 + // 68: 540005c1 b.ne 0x120 <_JIT_ENTRY+0x120> + // 6c: f9401548 ldr x8, [x10, #0x28] + // 70: b9401109 ldr w9, [x8, #0x10] + // 74: 7100113f cmp w9, #0x4 + // 78: 54000541 b.ne 0x120 <_JIT_ENTRY+0x120> + // 7c: b94036c9 ldr w9, [x22, #0x34] + // 80: 7100013f cmp w9, #0x0 + // 84: 540004ed b.le 0x120 <_JIT_ENTRY+0x120> + // 88: f9400508 ldr x8, [x8, #0x8] + // 8c: 51000529 sub w9, w9, #0x1 + // 90: aa1303e0 mov x0, x19 + // 94: aa1f03e1 mov x1, xzr + // 98: b90036c9 str w9, [x22, #0x34] + // 9c: f9002295 str x21, [x20, #0x40] + // a0: d63f0100 blr x8 + // a4: b94036c8 ldr w8, [x22, #0x34] + // a8: aa0003f7 mov x23, x0 + // ac: 11000508 add w8, w8, #0x1 + // b0: b90036c8 str w8, [x22, #0x34] + // b4: b9400268 ldr w8, [x19] + // b8: 37f80108 tbnz w8, #0x1f, 0xd8 <_JIT_ENTRY+0xd8> + // bc: 71000508 subs w8, w8, #0x1 + // c0: b9000268 str w8, [x19] + // c4: 540000a1 b.ne 0xd8 <_JIT_ENTRY+0xd8> + // c8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: aa1303e0 mov x0, x19 + // d0: f9400108 ldr x8, [x8] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d4: d63f0100 blr x8 + // d8: f9402288 ldr x8, [x20, #0x40] + // dc: 8b180d08 add x8, x8, x24, lsl #3 + // e0: f9002288 str x8, [x20, #0x40] + // e4: f8787aa0 ldr x0, [x21, x24, lsl #3] + // e8: b9400008 ldr w8, [x0] + // ec: 37f800e8 tbnz w8, #0x1f, 0x108 <_JIT_ENTRY+0x108> + // f0: 71000508 subs w8, w8, #0x1 + // f4: b9000008 str w8, [x0] + // f8: 54000081 b.ne 0x108 <_JIT_ENTRY+0x108> + // fc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000fc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 100: f9400108 ldr x8, [x8] + // 0000000000000100: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 104: d63f0100 blr x8 + // 108: f9402295 ldr x21, [x20, #0x40] + // 10c: f900229f str xzr, [x20, #0x40] + // 110: b40000d7 cbz x23, 0x128 <_JIT_ENTRY+0x128> + // 114: f80086b7 str x23, [x21], #0x8 + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c <_JIT_ENTRY+0x11c> + // 000000000000011c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 120: a8c17bfd ldp x29, x30, [sp], #0x10 + // 124: 14000000 b 0x124 <_JIT_ENTRY+0x124> + // 0000000000000124: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 128: a8c17bfd ldp x29, x30, [sp], #0x10 + // 12c: 14000000 b 0x12c <_JIT_ENTRY+0x12c> + // 000000000000012c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[304] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xe9, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x0a, 0x3d, 0x00, 0x12, + 0xeb, 0x03, 0x2a, 0x2a, 0xab, 0xda, 0x6b, 0xf8, + 0x7f, 0x01, 0x00, 0xf1, 0x4a, 0x05, 0x8a, 0x1a, + 0x29, 0x11, 0x9f, 0x9a, 0x5f, 0x05, 0x00, 0x71, + 0x81, 0x07, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x0c, 0x00, 0x00, 0x90, 0x58, 0x21, 0x28, 0xcb, + 0xaa, 0x7a, 0x78, 0xf8, 0x4b, 0x05, 0x40, 0xf9, + 0x8c, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0c, 0xeb, + 0x81, 0x06, 0x00, 0x54, 0xa8, 0x2e, 0x28, 0xcb, + 0x13, 0x69, 0x69, 0xf8, 0x48, 0x09, 0x40, 0xf9, + 0x69, 0x06, 0x40, 0xf9, 0x3f, 0x01, 0x08, 0xeb, + 0xc1, 0x05, 0x00, 0x54, 0x48, 0x15, 0x40, 0xf9, + 0x09, 0x11, 0x40, 0xb9, 0x3f, 0x11, 0x00, 0x71, + 0x41, 0x05, 0x00, 0x54, 0xc9, 0x36, 0x40, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xed, 0x04, 0x00, 0x54, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x05, 0x00, 0x51, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x1f, 0xaa, + 0xc9, 0x36, 0x00, 0xb9, 0x95, 0x22, 0x00, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xc8, 0x36, 0x40, 0xb9, + 0xf7, 0x03, 0x00, 0xaa, 0x08, 0x05, 0x00, 0x11, + 0xc8, 0x36, 0x00, 0xb9, 0x68, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x0d, 0x18, 0x8b, + 0x88, 0x22, 0x00, 0xf9, 0xa0, 0x7a, 0x78, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xd7, 0x00, 0x00, 0xb4, 0xb7, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xd0, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xfc, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x11c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x124, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x12c, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_METHOD_DESCRIPTOR_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_O.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 928000ea mov x10, #-0x8 // =-8 + // c: 910003fd mov x29, sp + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 12003d2b and w11, w9, #0xffff + // 18: 2a2b03e8 mvn w8, w11 + // 1c: f868daac ldr x12, [x21, w8, sxtw #3] + // 20: f100019f cmp x12, #0x0 + // 24: 1a8b056c cinc w12, w11, ne + // 28: 9a9f114b csel x11, x10, xzr, ne + // 2c: 7100099f cmp w12, #0x2 + // 30: 540002e1 b.ne 0x8c <_JIT_ENTRY+0x8c> + // 34: 9280002a mov x10, #-0x2 // =-2 + // 38: 9000000d adrp x13, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE PyMethodDescr_Type + // 3c: cb292157 sub x23, x10, w9, uxth + // 40: f8777aac ldr x12, [x21, x23, lsl #3] + // 44: f940058a ldr x10, [x12, #0x8] + // 48: f94001ad ldr x13, [x13] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC PyMethodDescr_Type + // 4c: eb0d015f cmp x10, x13 + // 50: 540001e1 b.ne 0x8c <_JIT_ENTRY+0x8c> + // 54: f940158a ldr x10, [x12, #0x28] + // 58: b940114d ldr w13, [x10, #0x10] + // 5c: 710021bf cmp w13, #0x8 + // 60: 54000161 b.ne 0x8c <_JIT_ENTRY+0x8c> + // 64: b94036cd ldr w13, [x22, #0x34] + // 68: 710001bf cmp w13, #0x0 + // 6c: 5400010d b.le 0x8c <_JIT_ENTRY+0x8c> + // 70: cb292ea9 sub x9, x21, w9, uxth #3 + // 74: 8b0b0129 add x9, x9, x11 + // 78: f940098b ldr x11, [x12, #0x10] + // 7c: f9400120 ldr x0, [x9] + // 80: f940040c ldr x12, [x0, #0x8] + // 84: eb0b019f cmp x12, x11 + // 88: 54000060 b.eq 0x94 <_JIT_ENTRY+0x94> + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 94: f9400521 ldr x1, [x9, #0x8] + // 98: f9400549 ldr x9, [x10, #0x8] + // 9c: 93407d18 sxtw x24, w8 + // a0: 510005a8 sub w8, w13, #0x1 + // a4: f9002295 str x21, [x20, #0x40] + // a8: b90036c8 str w8, [x22, #0x34] + // ac: d63f0120 blr x9 + // b0: b94036c8 ldr w8, [x22, #0x34] + // b4: f9402299 ldr x25, [x20, #0x40] + // b8: aa0003f3 mov x19, x0 + // bc: f900229f str xzr, [x20, #0x40] + // c0: 11000508 add w8, w8, #0x1 + // c4: b90036c8 str w8, [x22, #0x34] + // c8: f8777aa8 ldr x8, [x21, x23, lsl #3] + // cc: b9400109 ldr w9, [x8] + // d0: 37f80109 tbnz w9, #0x1f, 0xf0 <_JIT_ENTRY+0xf0> + // d4: 71000529 subs w9, w9, #0x1 + // d8: b9000109 str w9, [x8] + // dc: 540000a1 b.ne 0xf0 <_JIT_ENTRY+0xf0> + // e0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000e0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // e4: aa0803e0 mov x0, x8 + // e8: f9400129 ldr x9, [x9] + // 00000000000000e8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // ec: d63f0120 blr x9 + // f0: f8787aa0 ldr x0, [x21, x24, lsl #3] + // f4: b4000120 cbz x0, 0x118 <_JIT_ENTRY+0x118> + // f8: b9400008 ldr w8, [x0] + // fc: 37f800e8 tbnz w8, #0x1f, 0x118 <_JIT_ENTRY+0x118> + // 100: 71000508 subs w8, w8, #0x1 + // 104: b9000008 str w8, [x0] + // 108: 54000081 b.ne 0x118 <_JIT_ENTRY+0x118> + // 10c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000010c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 110: f9400108 ldr x8, [x8] + // 0000000000000110: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 114: d63f0100 blr x8 + // 118: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000118: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 11c: f9400108 ldr x8, [x8] + // 000000000000011c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 120: 72003d1f tst w8, #0xffff + // 124: 54000240 b.eq 0x16c <_JIT_ENTRY+0x16c> + // 128: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 0000000000000128: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 12c: 92403d08 and x8, x8, #0xffff + // 130: d10022b5 sub x21, x21, #0x8 + // 134: f940035a ldr x26, [x26] + // 0000000000000134: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 138: 9100051b add x27, x8, #0x1 + // 13c: 14000004 b 0x14c <_JIT_ENTRY+0x14c> + // 140: d100077b sub x27, x27, #0x1 + // 144: f100077f cmp x27, #0x1 + // 148: 54000129 b.ls 0x16c <_JIT_ENTRY+0x16c> + // 14c: f85f86a0 ldr x0, [x21], #-0x8 + // 150: b9400008 ldr w8, [x0] + // 154: 37ffff68 tbnz w8, #0x1f, 0x140 <_JIT_ENTRY+0x140> + // 158: 71000508 subs w8, w8, #0x1 + // 15c: b9000008 str w8, [x0] + // 160: 54ffff01 b.ne 0x140 <_JIT_ENTRY+0x140> + // 164: d63f0340 blr x26 + // 168: 17fffff6 b 0x140 <_JIT_ENTRY+0x140> + // 16c: b40000b3 cbz x19, 0x180 <_JIT_ENTRY+0x180> + // 170: 8b180f35 add x21, x25, x24, lsl #3 + // 174: f8377b33 str x19, [x25, x23, lsl #3] + // 178: a8c17bfd ldp x29, x30, [sp], #0x10 + // 17c: 14000000 b 0x17c <_JIT_ENTRY+0x17c> + // 000000000000017c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 180: 8b170f35 add x21, x25, x23, lsl #3 + // 184: a8c17bfd ldp x29, x30, [sp], #0x10 + // 188: 14000000 b 0x188 <_JIT_ENTRY+0x188> + // 0000000000000188: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 18c: 00 00 00 00 + const unsigned char code_body[400] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0xea, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x29, 0x01, 0x40, 0xf9, 0x2b, 0x3d, 0x00, 0x12, + 0xe8, 0x03, 0x2b, 0x2a, 0xac, 0xda, 0x68, 0xf8, + 0x9f, 0x01, 0x00, 0xf1, 0x6c, 0x05, 0x8b, 0x1a, + 0x4b, 0x11, 0x9f, 0x9a, 0x9f, 0x09, 0x00, 0x71, + 0xe1, 0x02, 0x00, 0x54, 0x2a, 0x00, 0x80, 0x92, + 0x0d, 0x00, 0x00, 0x90, 0x57, 0x21, 0x29, 0xcb, + 0xac, 0x7a, 0x77, 0xf8, 0x8a, 0x05, 0x40, 0xf9, + 0xad, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0d, 0xeb, + 0xe1, 0x01, 0x00, 0x54, 0x8a, 0x15, 0x40, 0xf9, + 0x4d, 0x11, 0x40, 0xb9, 0xbf, 0x21, 0x00, 0x71, + 0x61, 0x01, 0x00, 0x54, 0xcd, 0x36, 0x40, 0xb9, + 0xbf, 0x01, 0x00, 0x71, 0x0d, 0x01, 0x00, 0x54, + 0xa9, 0x2e, 0x29, 0xcb, 0x29, 0x01, 0x0b, 0x8b, + 0x8b, 0x09, 0x40, 0xf9, 0x20, 0x01, 0x40, 0xf9, + 0x0c, 0x04, 0x40, 0xf9, 0x9f, 0x01, 0x0b, 0xeb, + 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x21, 0x05, 0x40, 0xf9, + 0x49, 0x05, 0x40, 0xf9, 0x18, 0x7d, 0x40, 0x93, + 0xa8, 0x05, 0x00, 0x51, 0x95, 0x22, 0x00, 0xf9, + 0xc8, 0x36, 0x00, 0xb9, 0x20, 0x01, 0x3f, 0xd6, + 0xc8, 0x36, 0x40, 0xb9, 0x99, 0x22, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x9f, 0x22, 0x00, 0xf9, + 0x08, 0x05, 0x00, 0x11, 0xc8, 0x36, 0x00, 0xb9, + 0xa8, 0x7a, 0x77, 0xf8, 0x09, 0x01, 0x40, 0xb9, + 0x09, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x08, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, + 0xa0, 0x7a, 0x78, 0xf8, 0x20, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x40, 0x02, 0x00, 0x54, + 0x1a, 0x00, 0x00, 0x90, 0x08, 0x3d, 0x40, 0x92, + 0xb5, 0x22, 0x00, 0xd1, 0x5a, 0x03, 0x40, 0xf9, + 0x1b, 0x05, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x7b, 0x07, 0x00, 0xd1, 0x7f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x40, 0x03, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0xb3, 0x00, 0x00, 0xb4, + 0x35, 0x0f, 0x18, 0x8b, 0x33, 0x7b, 0x37, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0xe0, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xe8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x10c, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x118, (uintptr_t)data); + patch_aarch64_21rx(code + 0x128, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x134, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x17c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x188, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_NON_PY_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_NON_PY_GENERAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 9280002b mov x11, #-0x2 // =-2 + // c: aa1f03e3 mov x3, xzr + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 910003fd mov x29, sp + // 18: 12003d09 and w9, w8, #0xffff + // 1c: cb282177 sub x23, x11, w8, uxth + // 20: cb282ea8 sub x8, x21, w8, uxth #3 + // 24: 2a2903ea mvn w10, w9 + // 28: f86adaab ldr x11, [x21, w10, sxtw #3] + // 2c: 93407d58 sxtw x24, w10 + // 30: f8777aa0 ldr x0, [x21, x23, lsl #3] + // 34: 928000ea mov x10, #-0x8 // =-8 + // 38: f9002295 str x21, [x20, #0x40] + // 3c: f100017f cmp x11, #0x0 + // 40: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE PyObject_Vectorcall + // 44: 9a9f114a csel x10, x10, xzr, ne + // 48: 1a890529 cinc w9, w9, ne + // 4c: f940016b ldr x11, [x11] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC PyObject_Vectorcall + // 50: 8b0a0101 add x1, x8, x10 + // 54: b2410122 orr x2, x9, #0x8000000000000000 + // 58: d63f0160 blr x11 + // 5c: f9402299 ldr x25, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: aa0003f3 mov x19, x0 + // 68: f8777aa8 ldr x8, [x21, x23, lsl #3] + // 6c: b9400109 ldr w9, [x8] + // 70: 37f80109 tbnz w9, #0x1f, 0x90 <_JIT_ENTRY+0x90> + // 74: 71000529 subs w9, w9, #0x1 + // 78: b9000109 str w9, [x8] + // 7c: 540000a1 b.ne 0x90 <_JIT_ENTRY+0x90> + // 80: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000080: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 84: aa0803e0 mov x0, x8 + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 8c: d63f0120 blr x9 + // 90: f8787aa0 ldr x0, [x21, x24, lsl #3] + // 94: b4000120 cbz x0, 0xb8 <_JIT_ENTRY+0xb8> + // 98: b9400008 ldr w8, [x0] + // 9c: 37f800e8 tbnz w8, #0x1f, 0xb8 <_JIT_ENTRY+0xb8> + // a0: 71000508 subs w8, w8, #0x1 + // a4: b9000008 str w8, [x0] + // a8: 54000081 b.ne 0xb8 <_JIT_ENTRY+0xb8> + // ac: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000ac: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // b0: f9400108 ldr x8, [x8] + // 00000000000000b0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // b4: d63f0100 blr x8 + // b8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b8: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c0: 72003d1f tst w8, #0xffff + // c4: 54000240 b.eq 0x10c <_JIT_ENTRY+0x10c> + // c8: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: 92403d08 and x8, x8, #0xffff + // d0: d10022b5 sub x21, x21, #0x8 + // d4: f940035a ldr x26, [x26] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d8: 9100051b add x27, x8, #0x1 + // dc: 14000004 b 0xec <_JIT_ENTRY+0xec> + // e0: d100077b sub x27, x27, #0x1 + // e4: f100077f cmp x27, #0x1 + // e8: 54000129 b.ls 0x10c <_JIT_ENTRY+0x10c> + // ec: f85f86a0 ldr x0, [x21], #-0x8 + // f0: b9400008 ldr w8, [x0] + // f4: 37ffff68 tbnz w8, #0x1f, 0xe0 <_JIT_ENTRY+0xe0> + // f8: 71000508 subs w8, w8, #0x1 + // fc: b9000008 str w8, [x0] + // 100: 54ffff01 b.ne 0xe0 <_JIT_ENTRY+0xe0> + // 104: d63f0340 blr x26 + // 108: 17fffff6 b 0xe0 <_JIT_ENTRY+0xe0> + // 10c: b40000b3 cbz x19, 0x120 <_JIT_ENTRY+0x120> + // 110: 8b180f35 add x21, x25, x24, lsl #3 + // 114: f8377b33 str x19, [x25, x23, lsl #3] + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c <_JIT_ENTRY+0x11c> + // 000000000000011c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 120: 8b170f35 add x21, x25, x23, lsl #3 + // 124: a8c17bfd ldp x29, x30, [sp], #0x10 + // 128: 14000000 b 0x128 <_JIT_ENTRY+0x128> + // 0000000000000128: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 12c: 00 00 00 00 + const unsigned char code_body[304] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x2b, 0x00, 0x80, 0x92, 0xe3, 0x03, 0x1f, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x09, 0x3d, 0x00, 0x12, 0x77, 0x21, 0x28, 0xcb, + 0xa8, 0x2e, 0x28, 0xcb, 0xea, 0x03, 0x29, 0x2a, + 0xab, 0xda, 0x6a, 0xf8, 0x58, 0x7d, 0x40, 0x93, + 0xa0, 0x7a, 0x77, 0xf8, 0xea, 0x00, 0x80, 0x92, + 0x95, 0x22, 0x00, 0xf9, 0x7f, 0x01, 0x00, 0xf1, + 0x0b, 0x00, 0x00, 0x90, 0x4a, 0x11, 0x9f, 0x9a, + 0x29, 0x05, 0x89, 0x1a, 0x6b, 0x01, 0x40, 0xf9, + 0x01, 0x01, 0x0a, 0x8b, 0x22, 0x01, 0x41, 0xb2, + 0x60, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xa8, 0x7a, 0x77, 0xf8, 0x09, 0x01, 0x40, 0xb9, + 0x09, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x08, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x20, 0x01, 0x3f, 0xd6, + 0xa0, 0x7a, 0x78, 0xf8, 0x20, 0x01, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x40, 0x02, 0x00, 0x54, + 0x1a, 0x00, 0x00, 0x90, 0x08, 0x3d, 0x40, 0x92, + 0xb5, 0x22, 0x00, 0xd1, 0x5a, 0x03, 0x40, 0xf9, + 0x1b, 0x05, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x7b, 0x07, 0x00, 0xd1, 0x7f, 0x07, 0x00, 0xf1, + 0x29, 0x01, 0x00, 0x54, 0xa0, 0x86, 0x5f, 0xf8, + 0x08, 0x00, 0x40, 0xb9, 0x68, 0xff, 0xff, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x01, 0xff, 0xff, 0x54, 0x40, 0x03, 0x3f, 0xd6, + 0xf6, 0xff, 0xff, 0x17, 0xb3, 0x00, 0x00, 0xb4, + 0x35, 0x0f, 0x18, 0x8b, 0x33, 0x7b, 0x37, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x0f, 0x17, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_Vectorcall+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x88, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xac, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xb8, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xd4, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x11c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x128, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_STR_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_STR_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f02a8 ldur x8, [x21, #-0x10] + // 8: 910003fd mov x29, sp + // c: b50000c8 cbnz x8, 0x24 <_JIT_ENTRY+0x24> + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE PyUnicode_Type + // 14: f85e82a8 ldur x8, [x21, #-0x18] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Type + // 1c: eb09011f cmp x8, x9 + // 20: 54000060 b.eq 0x2c <_JIT_ENTRY+0x2c> + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: f85f82b3 ldur x19, [x21, #-0x8] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE PyObject_Str + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC PyObject_Str + // 3c: aa1303e0 mov x0, x19 + // 40: d63f0100 blr x8 + // 44: f9402288 ldr x8, [x20, #0x40] + // 48: d1006108 sub x8, x8, #0x18 + // 4c: f9002288 str x8, [x20, #0x40] + // 50: b9400268 ldr w8, [x19] + // 54: 37f80148 tbnz w8, #0x1f, 0x7c <_JIT_ENTRY+0x7c> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000268 str w8, [x19] + // 60: 540000e1 b.ne 0x7c <_JIT_ENTRY+0x7c> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: aa0003f5 mov x21, x0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: aa1503e0 mov x0, x21 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: b4000080 cbz x0, 0x94 <_JIT_ENTRY+0x94> + // 88: f80086a0 str x0, [x21], #0x8 + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 9c: 00 00 00 00 + const unsigned char code_body[160] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa8, 0x02, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0xc8, 0x00, 0x00, 0xb5, + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x82, 0x5e, 0xf8, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: &PyObject_Str+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, (uintptr_t)&PyObject_Str); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x98, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_TUPLE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TUPLE_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f02a8 ldur x8, [x21, #-0x10] + // 8: 910003fd mov x29, sp + // c: b50000c8 cbnz x8, 0x24 <_JIT_ENTRY+0x24> + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE PyTuple_Type + // 14: f85e82a8 ldur x8, [x21, #-0x18] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC PyTuple_Type + // 1c: eb09011f cmp x8, x9 + // 20: 54000060 b.eq 0x2c <_JIT_ENTRY+0x2c> + // 24: a8c17bfd ldp x29, x30, [sp], #0x10 + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: f85f82b3 ldur x19, [x21, #-0x8] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE PySequence_Tuple + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC PySequence_Tuple + // 3c: aa1303e0 mov x0, x19 + // 40: d63f0100 blr x8 + // 44: f9402288 ldr x8, [x20, #0x40] + // 48: d1006108 sub x8, x8, #0x18 + // 4c: f9002288 str x8, [x20, #0x40] + // 50: b9400268 ldr w8, [x19] + // 54: 37f80148 tbnz w8, #0x1f, 0x7c <_JIT_ENTRY+0x7c> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000268 str w8, [x19] + // 60: 540000e1 b.ne 0x7c <_JIT_ENTRY+0x7c> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: aa0003f5 mov x21, x0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: aa1503e0 mov x0, x21 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: b4000080 cbz x0, 0x94 <_JIT_ENTRY+0x94> + // 88: f80086a0 str x0, [x21], #0x8 + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 9c: 00 00 00 00 + const unsigned char code_body[160] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa8, 0x02, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0xc8, 0x00, 0x00, 0xb5, + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x82, 0x5e, 0xf8, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x61, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: &PySequence_Tuple+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x98, state->instruction_starts[instruction->error_target]); +} + +void +emit__CALL_TYPE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TYPE_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85f0d09 ldr x9, [x8, #-0x10]! + // 8: b50000c9 cbnz x9, 0x20 <_JIT_ENTRY+0x20> + // c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyType_Type + // 10: f85e82a9 ldur x9, [x21, #-0x18] + // 14: f940014a ldr x10, [x10] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyType_Type + // 18: eb0a013f cmp x9, x10 + // 1c: 54000040 b.eq 0x24 <_JIT_ENTRY+0x24> + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: f9400500 ldr x0, [x8, #0x8] + // 28: f9400409 ldr x9, [x0, #0x8] + // 2c: b940012a ldr w10, [x9] + // 30: 37f8006a tbnz w10, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 34: 1100054a add w10, w10, #0x1 + // 38: b900012a str w10, [x9] + // 3c: f81e82a9 stur x9, [x21, #-0x18] + // 40: f9002288 str x8, [x20, #0x40] + // 44: b9400008 ldr w8, [x0] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000008 str w8, [x0] + // 54: 54000080 b.eq 0x64 <_JIT_ENTRY+0x64> + // 58: f9402295 ldr x21, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 6c: 910003fd mov x29, sp + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: 14000000 b 0x84 <_JIT_ENTRY+0x84> + // 0000000000000084: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xe8, 0x03, 0x15, 0xaa, 0x09, 0x0d, 0x5f, 0xf8, + 0xc9, 0x00, 0x00, 0xb5, 0x0a, 0x00, 0x00, 0x90, + 0xa9, 0x82, 0x5e, 0xf8, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x05, 0x40, 0xf9, + 0x09, 0x04, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0x82, 0x1e, 0xf8, + 0x88, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyType_Type+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyType_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x68, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_AND_ALLOCATE_OBJECT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_AND_ALLOCATE_OBJECT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 12003d08 and w8, w8, #0xffff + // 14: 2a2803f7 mvn w23, w8 + // 18: f877daa9 ldr x9, [x21, w23, sxtw #3] + // 1c: b50006a9 cbnz x9, 0xf0 <_JIT_ENTRY+0xf0> + // 20: 12800029 mov w9, #-0x2 // =-2 + // 24: 4b080133 sub w19, w9, w8 + // 28: f873daa0 ldr x0, [x21, w19, sxtw #3] + // 2c: f9400408 ldr x8, [x0, #0x8] + // 30: 3942ad08 ldrb w8, [x8, #0xab] + // 34: 363805e8 tbz w8, #0x7, 0xf0 <_JIT_ENTRY+0xf0> + // 38: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 3c: b9418008 ldr w8, [x0, #0x180] + // 40: f9400129 ldr x9, [x9] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 44: 6b09011f cmp w8, w9 + // 48: 54000541 b.ne 0xf0 <_JIT_ENTRY+0xf0> + // 4c: f9407ac8 ldr x8, [x22, #0xf0] + // 50: b4000508 cbz x8, 0xf0 <_JIT_ENTRY+0xf0> + // 54: f941d018 ldr x24, [x0, #0x3a0] + // 58: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000058: R_AARCH64_ADR_GOT_PAGE _Py_InitCleanup + // 5c: f9401b09 ldr x9, [x24, #0x30] + // 60: f940014a ldr x10, [x10] + // 0000000000000060: R_AARCH64_LD64_GOT_LO12_NC _Py_InitCleanup + // 64: f9407ecb ldr x11, [x22, #0xf8] + // 68: b9804d29 ldrsw x9, [x9, #0x4c] + // 6c: b9804d4a ldrsw x10, [x10, #0x4c] + // 70: cb080168 sub x8, x11, x8 + // 74: 8b090149 add x9, x10, x9 + // 78: eb880d3f cmp x9, x8, asr #3 + // 7c: 540003aa b.ge 0xf0 <_JIT_ENTRY+0xf0> + // 80: f9002295 str x21, [x20, #0x40] + // 84: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE PyType_GenericAlloc + // 88: aa1f03e1 mov x1, xzr + // 8c: f9400108 ldr x8, [x8] + // 000000000000008c: R_AARCH64_LD64_GOT_LO12_NC PyType_GenericAlloc + // 90: d63f0100 blr x8 + // 94: f9402288 ldr x8, [x20, #0x40] + // 98: f900229f str xzr, [x20, #0x40] + // 9c: b40002e0 cbz x0, 0xf8 <_JIT_ENTRY+0xf8> + // a0: f837daa0 str x0, [x21, w23, sxtw #3] + // a4: b9400309 ldr w9, [x24] + // a8: f873daa0 ldr x0, [x21, w19, sxtw #3] + // ac: 37f80069 tbnz w9, #0x1f, 0xb8 <_JIT_ENTRY+0xb8> + // b0: 11000529 add w9, w9, #0x1 + // b4: b9000309 str w9, [x24] + // b8: f833dab8 str x24, [x21, w19, sxtw #3] + // bc: f9002288 str x8, [x20, #0x40] + // c0: b9400008 ldr w8, [x0] + // c4: 37f800e8 tbnz w8, #0x1f, 0xe0 <_JIT_ENTRY+0xe0> + // c8: 71000508 subs w8, w8, #0x1 + // cc: b9000008 str w8, [x0] + // d0: 54000081 b.ne 0xe0 <_JIT_ENTRY+0xe0> + // d4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d8: f9400108 ldr x8, [x8] + // 00000000000000d8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // dc: d63f0100 blr x8 + // e0: f9402295 ldr x21, [x20, #0x40] + // e4: f900229f str xzr, [x20, #0x40] + // e8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ec: 14000000 b 0xec <_JIT_ENTRY+0xec> + // 00000000000000ec: R_AARCH64_JUMP26 _JIT_CONTINUE + // f0: a8c17bfd ldp x29, x30, [sp], #0x10 + // f4: 14000000 b 0xf4 <_JIT_ENTRY+0xf4> + // 00000000000000f4: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // f8: aa0803f5 mov x21, x8 + // fc: a8c17bfd ldp x29, x30, [sp], #0x10 + // 100: 14000000 b 0x100 <_JIT_ENTRY+0x100> + // 0000000000000100: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 104: 00 00 00 00 + const unsigned char code_body[264] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xf7, 0x03, 0x28, 0x2a, + 0xa9, 0xda, 0x77, 0xf8, 0xa9, 0x06, 0x00, 0xb5, + 0x29, 0x00, 0x80, 0x12, 0x33, 0x01, 0x08, 0x4b, + 0xa0, 0xda, 0x73, 0xf8, 0x08, 0x04, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0xe8, 0x05, 0x38, 0x36, + 0x09, 0x00, 0x00, 0x90, 0x08, 0x80, 0x41, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x05, 0x00, 0x54, 0xc8, 0x7a, 0x40, 0xf9, + 0x08, 0x05, 0x00, 0xb4, 0x18, 0xd0, 0x41, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x09, 0x1b, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0xcb, 0x7e, 0x40, 0xf9, + 0x29, 0x4d, 0x80, 0xb9, 0x4a, 0x4d, 0x80, 0xb9, + 0x68, 0x01, 0x08, 0xcb, 0x49, 0x01, 0x09, 0x8b, + 0x3f, 0x0d, 0x88, 0xeb, 0xaa, 0x03, 0x00, 0x54, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe1, 0x03, 0x1f, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe0, 0x02, 0x00, 0xb4, + 0xa0, 0xda, 0x37, 0xf8, 0x09, 0x03, 0x40, 0xb9, + 0xa0, 0xda, 0x73, 0xf8, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x03, 0x00, 0xb9, + 0xb8, 0xda, 0x33, 0xf8, 0x88, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xf5, 0x03, 0x08, 0xaa, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: OPERAND0 + // 10: &_Py_InitCleanup+0x0 + // 18: &PyType_GenericAlloc+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x18, (uintptr_t)&PyType_GenericAlloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x58, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x84, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x8c, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0xd4, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0xec, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xf4, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x100, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_CLASS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 3942ad29 ldrb w9, [x9, #0xab] + // c: 363800e9 tbz w9, #0x7, 0x28 <_JIT_ENTRY+0x28> + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 14: b9418108 ldr w8, [x8, #0x180] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: 6b09011f cmp w8, w9 + // 20: 54000041 b.ne 0x28 <_JIT_ENTRY+0x28> + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0xad, 0x42, 0x39, 0xe9, 0x00, 0x38, 0x36, + 0x09, 0x00, 0x00, 0x90, 0x08, 0x81, 0x41, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_METHOD_LAZY_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f85f82a8 ldur x8, [x21, #-0x8] + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // c: 8b292108 add x8, x8, w9, uxth + // 10: f85e8108 ldur x8, [x8, #-0x18] + // 14: b4000048 cbz x8, 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x82, 0x5f, 0xf8, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x21, 0x29, 0x8b, + 0x08, 0x81, 0x5e, 0xf8, 0x48, 0x00, 0x00, 0xb4, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_ATTR_MODULE_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_MODULE_PUSH_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyModule_Type + // 8: f9400509 ldr x9, [x8, #0x8] + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyModule_Type + // 10: f9404929 ldr x9, [x9, #0x90] + // 14: f940494a ldr x10, [x10, #0x90] + // 18: eb0a013f cmp x9, x10 + // 1c: 54000141 b.ne 0x44 <_JIT_ENTRY+0x44> + // 20: f9400908 ldr x8, [x8, #0x10] + // 24: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 28: f9401108 ldr x8, [x8, #0x20] + // 2c: b9400d09 ldr w9, [x8, #0xc] + // 30: f940014a ldr x10, [x10] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 34: 6b0a013f cmp w9, w10 + // 38: 54000061 b.ne 0x44 <_JIT_ENTRY+0x44> + // 3c: f80086a8 str x8, [x21], #0x8 + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x29, 0x49, 0x40, 0xf9, 0x4a, 0x49, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x41, 0x01, 0x00, 0x54, + 0x08, 0x09, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x0d, 0x40, 0xb9, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0x6b, + 0x61, 0x00, 0x00, 0x54, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyModule_Type+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyModule_Type); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_WITH_HINT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f85e8108 ldur x8, [x8, #-0x18] + // 8: b4000068 cbz x8, 0x14 <_JIT_ENTRY+0x14> + // c: f80086a8 str x8, [x21], #0x8 + // 10: 14000000 b 0x10 <_JIT_ENTRY+0x10> + // 0000000000000010: R_AARCH64_JUMP26 _JIT_CONTINUE + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[24] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x81, 0x5e, 0xf8, + 0x68, 0x00, 0x00, 0xb4, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_CALL_BOUND_METHOD_EXACT_ARGS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 12003d08 and w8, w8, #0xffff + // c: 2a2803e9 mvn w9, w8 + // 10: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 14: b5000129 cbnz x9, 0x38 <_JIT_ENTRY+0x38> + // 18: 12800029 mov w9, #-0x2 // =-2 + // 1c: 4b080128 sub w8, w9, w8 + // 20: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000020: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // 24: f868daa8 ldr x8, [x21, w8, sxtw #3] + // 28: f9400508 ldr x8, [x8, #0x8] + // 2c: f9400129 ldr x9, [x9] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 30: eb09011f cmp x8, x9 + // 34: 54000040 b.eq 0x3c <_JIT_ENTRY+0x3c> + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[64] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0xe9, 0x03, 0x28, 0x2a, + 0xa9, 0xda, 0x69, 0xf8, 0x29, 0x01, 0x00, 0xb5, + 0x29, 0x00, 0x80, 0x12, 0x28, 0x01, 0x08, 0x4b, + 0x09, 0x00, 0x00, 0x90, 0xa8, 0xda, 0x68, 0xf8, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_EG_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EG_MATCH.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyEval_CheckExceptStarTypeValid + // c: a9017bfd stp x29, x30, [sp, #0x10] + // 10: aa1603e0 mov x0, x22 + // 14: 910043fd add x29, sp, #0x10 + // 18: f9002295 str x21, [x20, #0x40] + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_CheckExceptStarTypeValid + // 20: aa1303e1 mov x1, x19 + // 24: d63f0100 blr x8 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 37f80620 tbnz w0, #0x1f, 0xf4 <_JIT_ENTRY+0xf4> + // 34: a9007fff stp xzr, xzr, [sp] + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _PyEval_ExceptionGroupMatch + // 3c: 910023e3 add x3, sp, #0x8 + // 40: f9002295 str x21, [x20, #0x40] + // 44: 910003e4 mov x4, sp + // 48: aa1403e0 mov x0, x20 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_ExceptionGroupMatch + // 50: aa1703e1 mov x1, x23 + // 54: aa1303e2 mov x2, x19 + // 58: d63f0100 blr x8 + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: 2a0003f8 mov w24, w0 + // 68: b94002e8 ldr w8, [x23] + // 6c: 37f80108 tbnz w8, #0x1f, 0x8c <_JIT_ENTRY+0x8c> + // 70: 71000508 subs w8, w8, #0x1 + // 74: b90002e8 str w8, [x23] + // 78: 540000a1 b.ne 0x8c <_JIT_ENTRY+0x8c> + // 7c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000007c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 80: aa1703e0 mov x0, x23 + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 88: d63f0100 blr x8 + // 8c: b9400268 ldr w8, [x19] + // 90: 37f80088 tbnz w8, #0x1f, 0xa0 <_JIT_ENTRY+0xa0> + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000268 str w8, [x19] + // 9c: 54000500 b.eq 0x13c <_JIT_ENTRY+0x13c> + // a0: 37f80478 tbnz w24, #0x1f, 0x12c <_JIT_ENTRY+0x12c> + // a4: f94007e0 ldr x0, [sp, #0x8] + // a8: b4000420 cbz x0, 0x12c <_JIT_ENTRY+0x12c> + // ac: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000ac: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // b0: f9400108 ldr x8, [x8] + // 00000000000000b0: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // b4: eb08001f cmp x0, x8 + // b8: 54000140 b.eq 0xe0 <_JIT_ENTRY+0xe0> + // bc: d10042a8 sub x8, x21, #0x10 + // c0: f9002288 str x8, [x20, #0x40] + // c4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE PyErr_SetHandledException + // c8: f9400108 ldr x8, [x8] + // 00000000000000c8: R_AARCH64_LD64_GOT_LO12_NC PyErr_SetHandledException + // cc: d63f0100 blr x8 + // d0: f9402289 ldr x9, [x20, #0x40] + // d4: f94007e8 ldr x8, [sp, #0x8] + // d8: f900229f str xzr, [x20, #0x40] + // dc: 91004135 add x21, x9, #0x10 + // e0: f94003e9 ldr x9, [sp] + // e4: a9417bfd ldp x29, x30, [sp, #0x10] + // e8: a93f22a9 stp x9, x8, [x21, #-0x10] + // ec: 910083ff add sp, sp, #0x20 + // f0: 14000000 b 0xf0 <_JIT_ENTRY+0xf0> + // 00000000000000f0: R_AARCH64_JUMP26 _JIT_CONTINUE + // f4: b94002e8 ldr w8, [x23] + // f8: 37f80108 tbnz w8, #0x1f, 0x118 <_JIT_ENTRY+0x118> + // fc: 71000508 subs w8, w8, #0x1 + // 100: b90002e8 str w8, [x23] + // 104: 540000a1 b.ne 0x118 <_JIT_ENTRY+0x118> + // 108: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000108: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 10c: aa1703e0 mov x0, x23 + // 110: f9400108 ldr x8, [x8] + // 0000000000000110: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 114: d63f0100 blr x8 + // 118: b9400268 ldr w8, [x19] + // 11c: 37f80088 tbnz w8, #0x1f, 0x12c <_JIT_ENTRY+0x12c> + // 120: 71000508 subs w8, w8, #0x1 + // 124: b9000268 str w8, [x19] + // 128: 54000160 b.eq 0x154 <_JIT_ENTRY+0x154> + // 12c: a9417bfd ldp x29, x30, [sp, #0x10] + // 130: d10042b5 sub x21, x21, #0x10 + // 134: 910083ff add sp, sp, #0x20 + // 138: 14000000 b 0x138 <_JIT_ENTRY+0x138> + // 0000000000000138: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 13c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000013c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 140: aa1303e0 mov x0, x19 + // 144: f9400108 ldr x8, [x8] + // 0000000000000144: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 148: d63f0100 blr x8 + // 14c: 36fffad8 tbz w24, #0x1f, 0xa4 <_JIT_ENTRY+0xa4> + // 150: 17fffff7 b 0x12c <_JIT_ENTRY+0x12c> + // 154: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000154: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 158: aa1303e0 mov x0, x19 + // 15c: f9400108 ldr x8, [x8] + // 000000000000015c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 160: d63f0100 blr x8 + // 164: a9417bfd ldp x29, x30, [sp, #0x10] + // 168: d10042b5 sub x21, x21, #0x10 + // 16c: 910083ff add sp, sp, #0x20 + // 170: 14000000 b 0x170 <_JIT_ENTRY+0x170> + // 0000000000000170: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 174: 00 00 00 00 + const unsigned char code_body[376] = { + 0xff, 0x83, 0x00, 0xd1, 0xb7, 0x4e, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x7b, 0x01, 0xa9, + 0xe0, 0x03, 0x16, 0xaa, 0xfd, 0x43, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x20, 0x06, 0xf8, 0x37, 0xff, 0x7f, 0x00, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xe3, 0x23, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0xe4, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf8, 0x03, 0x00, 0x2a, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x00, 0x05, 0x00, 0x54, + 0x78, 0x04, 0xf8, 0x37, 0xe0, 0x07, 0x40, 0xf9, + 0x20, 0x04, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0xa8, 0x42, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x89, 0x22, 0x40, 0xf9, 0xe8, 0x07, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x35, 0x41, 0x00, 0x91, + 0xe9, 0x03, 0x40, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xa9, 0x22, 0x3f, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x01, 0x00, 0x54, 0xfd, 0x7b, 0x41, 0xa9, + 0xb5, 0x42, 0x00, 0xd1, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xd8, 0xfa, 0xff, 0x36, + 0xf7, 0xff, 0xff, 0x17, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0x41, 0xa9, + 0xb5, 0x42, 0x00, 0xd1, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_CheckExceptStarTypeValid+0x0 + // 8: &_PyEval_ExceptionGroupMatch+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_Py_NoneStruct+0x0 + // 20: &PyErr_SetHandledException+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_CheckExceptStarTypeValid); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ExceptionGroupMatch); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x20, (uintptr_t)&PyErr_SetHandledException); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x84, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xac, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0xc4, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0xf0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x108, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x110, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x138, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x13c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x144, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x154, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x15c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x170, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_EXC_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EXC_MATCH.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyEval_CheckExceptTypeValid + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1603e0 mov x0, x22 + // 14: 910003fd mov x29, sp + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _PyEval_CheckExceptTypeValid + // 1c: aa1303e1 mov x1, x19 + // 20: d63f0100 blr x8 + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: 37f803a0 tbnz w0, #0x1f, 0xa0 <_JIT_ENTRY+0xa0> + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE PyErr_GivenExceptionMatches + // 38: aa1703e0 mov x0, x23 + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC PyErr_GivenExceptionMatches + // 40: aa1303e1 mov x1, x19 + // 44: d63f0100 blr x8 + // 48: f9402295 ldr x21, [x20, #0x40] + // 4c: f900229f str xzr, [x20, #0x40] + // 50: b9400268 ldr w8, [x19] + // 54: 37f80148 tbnz w8, #0x1f, 0x7c <_JIT_ENTRY+0x7c> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000268 str w8, [x19] + // 60: 540000e1 b.ne 0x7c <_JIT_ENTRY+0x7c> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 2a0003f7 mov w23, w0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: 2a1703e0 mov w0, w23 + // 7c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000007c: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 80: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000080: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 84: 7100001f cmp w0, #0x0 + // 88: f9400108 ldr x8, [x8] + // 0000000000000088: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 8c: f9400129 ldr x9, [x9] + // 000000000000008c: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 90: 9a880128 csel x8, x9, x8, eq + // 94: f81f82a8 stur x8, [x21, #-0x8] + // 98: a8c17bfd ldp x29, x30, [sp], #0x10 + // 9c: 14000000 b 0x9c <_JIT_ENTRY+0x9c> + // 000000000000009c: R_AARCH64_JUMP26 _JIT_CONTINUE + // a0: b9400268 ldr w8, [x19] + // a4: 37f80088 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // a8: 71000508 subs w8, w8, #0x1 + // ac: b9000268 str w8, [x19] + // b0: 54000080 b.eq 0xc0 <_JIT_ENTRY+0xc0> + // b4: d10022b5 sub x21, x21, #0x8 + // b8: a8c17bfd ldp x29, x30, [sp], #0x10 + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // c0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c4: aa1303e0 mov x0, x19 + // c8: f9400108 ldr x8, [x8] + // 00000000000000c8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // cc: d63f0100 blr x8 + // d0: d10022b5 sub x21, x21, #0x8 + // d4: a8c17bfd ldp x29, x30, [sp], #0x10 + // d8: 14000000 b 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // dc: 00 00 00 00 + const unsigned char code_body[224] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb7, 0x4e, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x03, 0xf8, 0x37, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0x2a, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0x1f, 0x00, 0x00, 0x71, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x01, 0x88, 0x9a, 0xa8, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_CheckExceptTypeValid+0x0 + // 8: &PyErr_GivenExceptionMatches+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_FalseStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_CheckExceptTypeValid); + patch_64(data + 0x8, (uintptr_t)&PyErr_GivenExceptionMatches); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x7c, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x80, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x88, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x8c, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x9c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xbc, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0xc0, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd8, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400a88 ldr x8, [x20, #0x10] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: b9409108 ldr w8, [x8, #0x90] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 10: 6b09011f cmp w8, w9 + // 14: 54000041 b.ne 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[32] = { + 0x88, 0x0a, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x91, 0x40, 0xb9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_EXACT_ARGS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 12800028 mov w8, #-0x2 // =-2 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: 12003d29 and w9, w9, #0xffff + // 10: 4b090108 sub w8, w8, w9 + // 14: 2a2903ea mvn w10, w9 + // 18: f868daa8 ldr x8, [x21, w8, sxtw #3] + // 1c: f86adaaa ldr x10, [x21, w10, sxtw #3] + // 20: f9401908 ldr x8, [x8, #0x30] + // 24: f100015f cmp x10, #0x0 + // 28: 1a890529 cinc w9, w9, ne + // 2c: b9403508 ldr w8, [x8, #0x34] + // 30: 6b09011f cmp w8, w9 + // 34: 54000041 b.ne 0x3c <_JIT_ENTRY+0x3c> + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x09, 0x00, 0x00, 0x90, 0x28, 0x00, 0x80, 0x12, + 0x29, 0x01, 0x40, 0xf9, 0x29, 0x3d, 0x00, 0x12, + 0x08, 0x01, 0x09, 0x4b, 0xea, 0x03, 0x29, 0x2a, + 0xa8, 0xda, 0x68, 0xf8, 0xaa, 0xda, 0x6a, 0xf8, + 0x08, 0x19, 0x40, 0xf9, 0x5f, 0x01, 0x00, 0xf1, + 0x29, 0x05, 0x89, 0x1a, 0x08, 0x35, 0x40, 0xb9, + 0x1f, 0x01, 0x09, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 92800028 mov x8, #-0x2 // =-2 + // 8: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyFunction_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: cb292108 sub x8, x8, w9, uxth + // 14: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 18: f9400509 ldr x9, [x8, #0x8] + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PyFunction_Type + // 20: eb0a013f cmp x9, x10 + // 24: 540000e1 b.ne 0x40 <_JIT_ENTRY+0x40> + // 28: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 2c: b9409108 ldr w8, [x8, #0x90] + // 30: f9400129 ldr x9, [x9] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 34: 6b09011f cmp w8, w9 + // 38: 54000041 b.ne 0x40 <_JIT_ENTRY+0x40> + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0x09, 0x00, 0x00, 0x90, 0x28, 0x00, 0x80, 0x92, + 0x0a, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x21, 0x29, 0xcb, 0xa8, 0x7a, 0x68, 0xf8, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0xe1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x08, 0x91, 0x40, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: OPERAND0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x40, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_VERSION_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_INLINE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND1 + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND1 + // c: b9409108 ldr w8, [x8, #0x90] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 14: 6b09011f cmp w8, w9 + // 18: 54000041 b.ne 0x20 <_JIT_ENTRY+0x20> + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x91, 0x40, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND1 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand1); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_FUNCTION_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_KW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 92800048 mov x8, #-0x3 // =-3 + // 8: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyFunction_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: cb292108 sub x8, x8, w9, uxth + // 14: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 18: f9400509 ldr x9, [x8, #0x8] + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PyFunction_Type + // 20: eb0a013f cmp x9, x10 + // 24: 540000e1 b.ne 0x40 <_JIT_ENTRY+0x40> + // 28: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 2c: b9409108 ldr w8, [x8, #0x90] + // 30: f9400129 ldr x9, [x9] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 34: 6b09011f cmp w8, w9 + // 38: 54000041 b.ne 0x40 <_JIT_ENTRY+0x40> + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 44: 00 00 00 00 + const unsigned char code_body[72] = { + 0x09, 0x00, 0x00, 0x90, 0x48, 0x00, 0x80, 0x92, + 0x0a, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x21, 0x29, 0xcb, 0xa8, 0x7a, 0x68, 0xf8, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0xe1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x08, 0x91, 0x40, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: OPERAND0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x40, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 92800028 mov x8, #-0x2 // =-2 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: cb292108 sub x8, x8, w9, uxth + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE PyFunction_Type + // 14: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 18: f9400508 ldr x8, [x8, #0x8] + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PyFunction_Type + // 20: eb09011f cmp x8, x9 + // 24: 540000c0 b.eq 0x3c <_JIT_ENTRY+0x3c> + // 28: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // 2c: f9400129 ldr x9, [x9] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 30: eb09011f cmp x8, x9 + // 34: 54000040 b.eq 0x3c <_JIT_ENTRY+0x3c> + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x09, 0x00, 0x00, 0x90, 0x28, 0x00, 0x80, 0x92, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x21, 0x29, 0xcb, + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x7a, 0x68, 0xf8, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xc0, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE_KW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 92800048 mov x8, #-0x3 // =-3 + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: cb292108 sub x8, x8, w9, uxth + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE PyFunction_Type + // 14: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 18: f9400508 ldr x8, [x8, #0x8] + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PyFunction_Type + // 20: eb09011f cmp x8, x9 + // 24: 540000c0 b.eq 0x3c <_JIT_ENTRY+0x3c> + // 28: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // 2c: f9400129 ldr x9, [x9] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 30: eb09011f cmp x8, x9 + // 34: 54000040 b.eq 0x3c <_JIT_ENTRY+0x3c> + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x09, 0x00, 0x00, 0x90, 0x48, 0x00, 0x80, 0x92, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x21, 0x29, 0xcb, + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x7a, 0x68, 0xf8, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xc0, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_MANAGED_OBJECT_HAS_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_MANAGED_OBJECT_HAS_VALUES.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: f9401129 ldr x9, [x9, #0x20] + // c: 8b090108 add x8, x8, x9 + // 10: 39400d08 ldrb w8, [x8, #0x3] + // 14: 34000048 cbz w8, 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0x11, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0x08, 0x0d, 0x40, 0x39, 0x48, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_METHOD_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 12800029 mov w9, #-0x2 // =-2 + // 8: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 12003d08 and w8, w8, #0xffff + // 14: 4b080129 sub w9, w9, w8 + // 18: f869daa9 ldr x9, [x21, w9, sxtw #3] + // 1c: f940052a ldr x10, [x9, #0x8] + // 20: f940016b ldr x11, [x11] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 24: eb0b015f cmp x10, x11 + // 28: 540001e1 b.ne 0x64 <_JIT_ENTRY+0x64> + // 2c: f9400929 ldr x9, [x9, #0x10] + // 30: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE PyFunction_Type + // 34: f940052a ldr x10, [x9, #0x8] + // 38: f940016b ldr x11, [x11] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC PyFunction_Type + // 3c: eb0b015f cmp x10, x11 + // 40: 54000121 b.ne 0x64 <_JIT_ENTRY+0x64> + // 44: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 48: b9409129 ldr w9, [x9, #0x90] + // 4c: f940014a ldr x10, [x10] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 50: 6b0a013f cmp w9, w10 + // 54: 54000081 b.ne 0x64 <_JIT_ENTRY+0x64> + // 58: 2a2803e8 mvn w8, w8 + // 5c: f868daa8 ldr x8, [x21, w8, sxtw #3] + // 60: b4000048 cbz x8, 0x68 <_JIT_ENTRY+0x68> + // 64: 14000000 b 0x64 <_JIT_ENTRY+0x64> + // 0000000000000064: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[104] = { + 0x08, 0x00, 0x00, 0x90, 0x29, 0x00, 0x80, 0x12, + 0x0b, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x00, 0x12, 0x29, 0x01, 0x08, 0x4b, + 0xa9, 0xda, 0x69, 0xf8, 0x2a, 0x05, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0xe1, 0x01, 0x00, 0x54, 0x29, 0x09, 0x40, 0xf9, + 0x0b, 0x00, 0x00, 0x90, 0x2a, 0x05, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0x21, 0x01, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x90, + 0x29, 0x91, 0x40, 0xb9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0x6b, 0x81, 0x00, 0x00, 0x54, + 0xe8, 0x03, 0x28, 0x2a, 0xa8, 0xda, 0x68, 0xf8, + 0x48, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &PyFunction_Type+0x0 + // 18: OPERAND0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x18, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x30, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x38, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x64, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_METHOD_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION_KW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 92800049 mov x9, #-0x3 // =-3 + // 8: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 92403d08 and x8, x8, #0xffff + // 14: cb080129 sub x9, x9, x8 + // 18: f8697aa9 ldr x9, [x21, x9, lsl #3] + // 1c: f940052a ldr x10, [x9, #0x8] + // 20: f940016b ldr x11, [x11] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 24: eb0b015f cmp x10, x11 + // 28: 54000201 b.ne 0x68 <_JIT_ENTRY+0x68> + // 2c: f9400929 ldr x9, [x9, #0x10] + // 30: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE PyFunction_Type + // 34: f940052a ldr x10, [x9, #0x8] + // 38: f940016b ldr x11, [x11] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC PyFunction_Type + // 3c: eb0b015f cmp x10, x11 + // 40: 54000141 b.ne 0x68 <_JIT_ENTRY+0x68> + // 44: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 48: b9409129 ldr w9, [x9, #0x90] + // 4c: f940014a ldr x10, [x10] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 50: 6b0a013f cmp w9, w10 + // 54: 540000a1 b.ne 0x68 <_JIT_ENTRY+0x68> + // 58: 92800029 mov x9, #-0x2 // =-2 + // 5c: cb080128 sub x8, x9, x8 + // 60: f8687aa8 ldr x8, [x21, x8, lsl #3] + // 64: b4000048 cbz x8, 0x6c <_JIT_ENTRY+0x6c> + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[112] = { + 0x08, 0x00, 0x00, 0x90, 0x49, 0x00, 0x80, 0x92, + 0x0b, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x29, 0x01, 0x08, 0xcb, + 0xa9, 0x7a, 0x69, 0xf8, 0x2a, 0x05, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0x01, 0x02, 0x00, 0x54, 0x29, 0x09, 0x40, 0xf9, + 0x0b, 0x00, 0x00, 0x90, 0x2a, 0x05, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x01, 0x0b, 0xeb, + 0x41, 0x01, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x90, + 0x29, 0x91, 0x40, 0xb9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0x6b, 0xa1, 0x00, 0x00, 0x54, + 0x29, 0x00, 0x80, 0x92, 0x28, 0x01, 0x08, 0xcb, + 0xa8, 0x7a, 0x68, 0xf8, 0x48, 0x00, 0x00, 0xb4, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &PyFunction_Type+0x0 + // 18: OPERAND0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x18, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x30, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x38, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_PEP_523( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PEP_523.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400ac8 ldr x8, [x22, #0x10] + // 4: f9509508 ldr x8, [x8, #0x2128] + // 8: b4000048 cbz x8, 0x10 <_JIT_ENTRY+0x10> + // c: 14000000 b 0xc <_JIT_ENTRY+0xc> + // 000000000000000c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 10: 14000000 b 0x10 <_JIT_ENTRY+0x10> + // 0000000000000010: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[16] = { + 0xc8, 0x0a, 0x40, 0xf9, 0x08, 0x95, 0x50, 0xf9, + 0x48, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc, state->instruction_starts[instruction->jump_target]); +} + +void +emit__CHECK_PERIODIC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400ec8 ldr x8, [x22, #0x18] + // 4: f2401d1f tst x8, #0xff + // 8: 540001a0 b.eq 0x3c <_JIT_ENTRY+0x3c> + // c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 10: f9002295 str x21, [x20, #0x40] + // 14: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _Py_HandlePending + // 18: aa1603e0 mov x0, x22 + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _Py_HandlePending + // 20: 910003fd mov x29, sp + // 24: d63f0100 blr x8 + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: a8c17bfd ldp x29, x30, [sp], #0x10 + // 34: 34000040 cbz w0, 0x3c <_JIT_ENTRY+0x3c> + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[64] = { + 0xc8, 0x0e, 0x40, 0xf9, 0x1f, 0x1d, 0x40, 0xf2, + 0xa0, 0x01, 0x00, 0x54, 0xfd, 0x7b, 0xbf, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x40, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_HandlePending+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_HandlePending); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x14, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC_IF_NOT_YIELD_FROM.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 37080208 tbnz w8, #0x1, 0x48 <_JIT_ENTRY+0x48> + // c: f9400ec8 ldr x8, [x22, #0x18] + // 10: f2401d1f tst x8, #0xff + // 14: 540001a0 b.eq 0x48 <_JIT_ENTRY+0x48> + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: f9002295 str x21, [x20, #0x40] + // 20: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000020: R_AARCH64_ADR_GOT_PAGE _Py_HandlePending + // 24: aa1603e0 mov x0, x22 + // 28: f9400108 ldr x8, [x8] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC _Py_HandlePending + // 2c: 910003fd mov x29, sp + // 30: d63f0100 blr x8 + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 34000040 cbz w0, 0x48 <_JIT_ENTRY+0x48> + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[72] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x02, 0x08, 0x37, 0xc8, 0x0e, 0x40, 0xf9, + 0x1f, 0x1d, 0x40, 0xf2, 0xa0, 0x01, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x40, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_Py_HandlePending+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_HandlePending); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->error_target]); +} + +void +emit__CHECK_STACK_SPACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9407ac8 ldr x8, [x22, #0xf0] + // 4: b40001e8 cbz x8, 0x40 <_JIT_ENTRY+0x40> + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 9280002a mov x10, #-0x2 // =-2 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: cb292149 sub x9, x10, w9, uxth + // 18: f9407eca ldr x10, [x22, #0xf8] + // 1c: f8697aa9 ldr x9, [x21, x9, lsl #3] + // 20: cb080148 sub x8, x10, x8 + // 24: f9401929 ldr x9, [x9, #0x30] + // 28: b9804d29 ldrsw x9, [x9, #0x4c] + // 2c: eb880d3f cmp x9, x8, asr #3 + // 30: 5400008a b.ge 0x40 <_JIT_ENTRY+0x40> + // 34: b9402ec8 ldr w8, [x22, #0x2c] + // 38: 7100051f cmp w8, #0x1 + // 3c: 5400004c b.gt 0x44 <_JIT_ENTRY+0x44> + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[72] = { + 0xc8, 0x7a, 0x40, 0xf9, 0xe8, 0x01, 0x00, 0xb4, + 0x09, 0x00, 0x00, 0x90, 0x2a, 0x00, 0x80, 0x92, + 0x29, 0x01, 0x40, 0xf9, 0x49, 0x21, 0x29, 0xcb, + 0xca, 0x7e, 0x40, 0xf9, 0xa9, 0x7a, 0x69, 0xf8, + 0x48, 0x01, 0x08, 0xcb, 0x29, 0x19, 0x40, 0xf9, + 0x29, 0x4d, 0x80, 0xb9, 0x3f, 0x0d, 0x88, 0xeb, + 0x8a, 0x00, 0x00, 0x54, 0xc8, 0x2e, 0x40, 0xb9, + 0x1f, 0x05, 0x00, 0x71, 0x4c, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_STACK_SPACE_OPERAND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE_OPERAND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9407ac8 ldr x8, [x22, #0xf0] + // 4: b4000168 cbz x8, 0x30 <_JIT_ENTRY+0x30> + // 8: f9407ec9 ldr x9, [x22, #0xf8] + // c: cb080128 sub x8, x9, x8 + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 18: 9343fd08 asr x8, x8, #3 + // 1c: eb29c11f cmp x8, w9, sxtw + // 20: 5400008d b.le 0x30 <_JIT_ENTRY+0x30> + // 24: b9402ec8 ldr w8, [x22, #0x2c] + // 28: 7100051f cmp w8, #0x1 + // 2c: 5400004c b.gt 0x34 <_JIT_ENTRY+0x34> + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[56] = { + 0xc8, 0x7a, 0x40, 0xf9, 0x68, 0x01, 0x00, 0xb4, + 0xc9, 0x7e, 0x40, 0xf9, 0x28, 0x01, 0x08, 0xcb, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0xfd, 0x43, 0x93, 0x1f, 0xc1, 0x29, 0xeb, + 0x8d, 0x00, 0x00, 0x54, 0xc8, 0x2e, 0x40, 0xb9, + 0x1f, 0x05, 0x00, 0x71, 0x4c, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_VALIDITY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // 8: 39408908 ldrb w8, [x8, #0x22] + // c: 37000048 tbnz w8, #0x0, 0x14 <_JIT_ENTRY+0x14> + // 10: 14000000 b 0x10 <_JIT_ENTRY+0x10> + // 0000000000000010: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x89, 0x40, 0x39, 0x48, 0x00, 0x00, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: EXECUTOR + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x10, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CHECK_VALIDITY_AND_SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY_AND_SET_IP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // 8: 39408908 ldrb w8, [x8, #0x22] + // c: 37000048 tbnz w8, #0x0, 0x14 <_JIT_ENTRY+0x14> + // 10: 14000000 b 0x10 <_JIT_ENTRY+0x10> + // 0000000000000010: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 14: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: f9001e88 str x8, [x20, #0x38] + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x89, 0x40, 0x39, 0x48, 0x00, 0x00, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x88, 0x1e, 0x00, 0xf9, + }; + // 0: EXECUTOR + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x10, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data + 0x8); +} + +void +emit__COMPARE_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000019 adrp x25, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyObject_RichCompare + // c: 910003fd mov x29, sp + // 10: f9400339 ldr x25, [x25] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: a97f62b7 ldp x23, x24, [x21, #-0x10] + // 18: f9002295 str x21, [x20, #0x40] + // 1c: 53053f22 ubfx w2, w25, #5, #11 + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC PyObject_RichCompare + // 24: aa1703e0 mov x0, x23 + // 28: aa1803e1 mov x1, x24 + // 2c: d63f0100 blr x8 + // 30: f9402295 ldr x21, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: aa0003f3 mov x19, x0 + // 3c: b94002e8 ldr w8, [x23] + // 40: 37f80108 tbnz w8, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 44: 71000508 subs w8, w8, #0x1 + // 48: b90002e8 str w8, [x23] + // 4c: 540000a1 b.ne 0x60 <_JIT_ENTRY+0x60> + // 50: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 54: aa1703e0 mov x0, x23 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 5c: d63f0100 blr x8 + // 60: b9400308 ldr w8, [x24] + // 64: 37f80088 tbnz w8, #0x1f, 0x74 <_JIT_ENTRY+0x74> + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b9000308 str w8, [x24] + // 70: 540003e0 b.eq 0xec <_JIT_ENTRY+0xec> + // 74: b4000473 cbz x19, 0x100 <_JIT_ENTRY+0x100> + // 78: 12003f28 and w8, w25, #0xffff + // 7c: 372000a8 tbnz w8, #0x4, 0x90 <_JIT_ENTRY+0x90> + // 80: d10042b5 sub x21, x21, #0x10 + // 84: f80086b3 str x19, [x21], #0x8 + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: 14000000 b 0x8c <_JIT_ENTRY+0x8c> + // 000000000000008c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 90: d10042a8 sub x8, x21, #0x10 + // 94: aa1303e0 mov x0, x19 + // 98: f9002288 str x8, [x20, #0x40] + // 9c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE PyObject_IsTrue + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC PyObject_IsTrue + // a4: d63f0100 blr x8 + // a8: b9400268 ldr w8, [x19] + // ac: 37f80088 tbnz w8, #0x1f, 0xbc <_JIT_ENTRY+0xbc> + // b0: 71000508 subs w8, w8, #0x1 + // b4: b9000268 str w8, [x19] + // b8: 540002a0 b.eq 0x10c <_JIT_ENTRY+0x10c> + // bc: f9402295 ldr x21, [x20, #0x40] + // c0: f900229f str xzr, [x20, #0x40] + // c4: 37f80200 tbnz w0, #0x1f, 0x104 <_JIT_ENTRY+0x104> + // c8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // cc: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // d0: 7100001f cmp w0, #0x0 + // d4: f9400108 ldr x8, [x8] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // d8: f9400129 ldr x9, [x9] + // 00000000000000d8: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // dc: 9a880133 csel x19, x9, x8, eq + // e0: f80086b3 str x19, [x21], #0x8 + // e4: a8c17bfd ldp x29, x30, [sp], #0x10 + // e8: 14000000 b 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e8: R_AARCH64_JUMP26 _JIT_CONTINUE + // ec: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000ec: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f0: aa1803e0 mov x0, x24 + // f4: f9400108 ldr x8, [x8] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f8: d63f0100 blr x8 + // fc: b5fffbf3 cbnz x19, 0x78 <_JIT_ENTRY+0x78> + // 100: d10042b5 sub x21, x21, #0x10 + // 104: a8c17bfd ldp x29, x30, [sp], #0x10 + // 108: 14000000 b 0x108 <_JIT_ENTRY+0x108> + // 0000000000000108: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 10c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000010c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 110: 2a0003f5 mov w21, w0 + // 114: aa1303e0 mov x0, x19 + // 118: f9400108 ldr x8, [x8] + // 0000000000000118: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 11c: d63f0100 blr x8 + // 120: 2a1503e0 mov w0, w21 + // 124: f9402295 ldr x21, [x20, #0x40] + // 128: f900229f str xzr, [x20, #0x40] + // 12c: 36fffce0 tbz w0, #0x1f, 0xc8 <_JIT_ENTRY+0xc8> + // 130: 17fffff5 b 0x104 <_JIT_ENTRY+0x104> + // 134: 00 00 00 00 + const unsigned char code_body[312] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x19, 0x00, 0x00, 0x90, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x39, 0x03, 0x40, 0xf9, 0xb7, 0x62, 0x7f, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0x22, 0x3f, 0x05, 0x53, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x18, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xe0, 0x03, 0x00, 0x54, 0x73, 0x04, 0x00, 0xb4, + 0x28, 0x3f, 0x00, 0x12, 0xa8, 0x00, 0x20, 0x37, + 0xb5, 0x42, 0x00, 0xd1, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xa8, 0x42, 0x00, 0xd1, 0xe0, 0x03, 0x13, 0xaa, + 0x88, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x02, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x02, 0xf8, 0x37, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x1f, 0x00, 0x00, 0x71, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x33, 0x01, 0x88, 0x9a, + 0xb3, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xf3, 0xfb, 0xff, 0xb5, + 0xb5, 0x42, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0x2a, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe0, 0xfc, 0xff, 0x36, + 0xf5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_RichCompare+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &PyObject_IsTrue+0x0 + // 20: &_Py_TrueStruct+0x0 + // 28: &_Py_FalseStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_RichCompare); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x9c, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xc8, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0xcc, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0xd4, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xd8, (uintptr_t)data + 0x28); + patch_aarch64_26r(code + 0xe8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xec, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xf4, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x108, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x10c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x118, (uintptr_t)data + 0x10); +} + +void +emit__COMPARE_OP_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: aa1503f3 mov x19, x21 + // 8: f85f8eb7 ldr x23, [x21, #-0x8]! + // c: f85f82b8 ldur x24, [x21, #-0x8] + // 10: 910003fd mov x29, sp + // 14: fd400ae9 ldr d9, [x23, #0x10] + // 18: b9400308 ldr w8, [x24] + // 1c: fd400b08 ldr d8, [x24, #0x10] + // 20: 37f80208 tbnz w8, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 24: 71000508 subs w8, w8, #0x1 + // 28: b9000308 str w8, [x24] + // 2c: 540001a1 b.ne 0x60 <_JIT_ENTRY+0x60> + // 30: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 34: f9400129 ldr x9, [x9] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 38: f9544928 ldr x8, [x9, #0x2890] + // 3c: b40000a8 cbz x8, 0x50 <_JIT_ENTRY+0x50> + // 40: f9544d22 ldr x2, [x9, #0x2898] + // 44: aa1803e0 mov x0, x24 + // 48: 52800021 mov w1, #0x1 // =1 + // 4c: d63f0100 blr x8 + // 50: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _PyFloat_ExactDealloc + // 54: aa1803e0 mov x0, x24 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _PyFloat_ExactDealloc + // 5c: d63f0100 blr x8 + // 60: b94002e8 ldr w8, [x23] + // 64: 37f80208 tbnz w8, #0x1f, 0xa4 <_JIT_ENTRY+0xa4> + // 68: 71000508 subs w8, w8, #0x1 + // 6c: b90002e8 str w8, [x23] + // 70: 540001a1 b.ne 0xa4 <_JIT_ENTRY+0xa4> + // 74: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 78: f9400129 ldr x9, [x9] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 7c: f9544928 ldr x8, [x9, #0x2890] + // 80: b40000a8 cbz x8, 0x94 <_JIT_ENTRY+0x94> + // 84: f9544d22 ldr x2, [x9, #0x2898] + // 88: aa1703e0 mov x0, x23 + // 8c: 52800021 mov w1, #0x1 // =1 + // 90: d63f0100 blr x8 + // 94: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyFloat_ExactDealloc + // 98: aa1703e0 mov x0, x23 + // 9c: f9400108 ldr x8, [x8] + // 000000000000009c: R_AARCH64_LD64_GOT_LO12_NC _PyFloat_ExactDealloc + // a0: d63f0100 blr x8 + // a4: 1e692100 fcmp d8, d9 + // a8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a8: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // b0: 1a9fb7e9 cset w9, ge + // b4: 1a9f87ea cset w10, ls + // b8: 12003d08 and w8, w8, #0xffff + // bc: 2a090549 orr w9, w10, w9, lsl #1 + // c0: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 00000000000000c0: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // c4: f940014a ldr x10, [x10] + // 00000000000000c4: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // c8: 1ac92508 lsr w8, w8, w9 + // cc: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // d0: f9400129 ldr x9, [x9] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // d4: 7200011f tst w8, #0x1 + // d8: 9a8a0128 csel x8, x9, x10, eq + // dc: f81f0268 stur x8, [x19, #-0x10] + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[232] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xf3, 0x03, 0x15, 0xaa, + 0xb7, 0x8e, 0x5f, 0xf8, 0xb8, 0x82, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0xe9, 0x0a, 0x40, 0xfd, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x0b, 0x40, 0xfd, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x02, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x00, 0x21, 0x69, 0x1e, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe9, 0xb7, 0x9f, 0x1a, 0xea, 0x87, 0x9f, 0x1a, + 0x08, 0x3d, 0x00, 0x12, 0x49, 0x05, 0x09, 0x2a, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x08, 0x25, 0xc9, 0x1a, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x00, 0x72, + 0x28, 0x01, 0x8a, 0x9a, 0x68, 0x02, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + // 8: &_PyFloat_ExactDealloc+0x0 + // 10: OPARG + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_FalseStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&_PyFloat_ExactDealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x74, (uintptr_t)data); + patch_aarch64_21rx(code + 0x94, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x9c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0xa8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xc0, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0xcc, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0xe4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COMPARE_OP_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f7 mov x23, x21 + // 4: f85f8eb3 ldr x19, [x21, #-0x8]! + // 8: f85f82b8 ldur x24, [x21, #-0x8] + // c: f9400b19 ldr x25, [x24, #0x10] + // 10: f100433f cmp x25, #0x10 + // 14: 54000082 b.hs 0x24 <_JIT_ENTRY+0x24> + // 18: f9400a7a ldr x26, [x19, #0x10] + // 1c: f100435f cmp x26, #0x10 + // 20: 54000063 b.lo 0x2c <_JIT_ENTRY+0x2c> + // 24: aa1703f5 mov x21, x23 + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 30: b9400308 ldr w8, [x24] + // 34: b9401b1c ldr w28, [x24, #0x18] + // 38: 910003fd mov x29, sp + // 3c: b9401a7b ldr w27, [x19, #0x18] + // 40: 37f80208 tbnz w8, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000308 str w8, [x24] + // 4c: 540001a1 b.ne 0x80 <_JIT_ENTRY+0x80> + // 50: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 54: f9400129 ldr x9, [x9] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 58: f9544928 ldr x8, [x9, #0x2890] + // 5c: b40000a8 cbz x8, 0x70 <_JIT_ENTRY+0x70> + // 60: f9544d22 ldr x2, [x9, #0x2898] + // 64: aa1803e0 mov x0, x24 + // 68: 52800021 mov w1, #0x1 // =1 + // 6c: d63f0100 blr x8 + // 70: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // 74: aa1803e0 mov x0, x24 + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // 7c: d63f0100 blr x8 + // 80: b9400268 ldr w8, [x19] + // 84: 37f80208 tbnz w8, #0x1f, 0xc4 <_JIT_ENTRY+0xc4> + // 88: 71000508 subs w8, w8, #0x1 + // 8c: b9000268 str w8, [x19] + // 90: 540001a1 b.ne 0xc4 <_JIT_ENTRY+0xc4> + // 94: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 98: f9400129 ldr x9, [x9] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 9c: f9544928 ldr x8, [x9, #0x2890] + // a0: b40000a8 cbz x8, 0xb4 <_JIT_ENTRY+0xb4> + // a4: f9544d22 ldr x2, [x9, #0x2898] + // a8: aa1303e0 mov x0, x19 + // ac: 52800021 mov w1, #0x1 // =1 + // b0: d63f0100 blr x8 + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // b8: aa1303e0 mov x0, x19 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // c0: d63f0100 blr x8 + // c4: 92400728 and x8, x25, #0x3 + // c8: 92400749 and x9, x26, #0x3 + // cc: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // d0: 9ba8f388 umsubl x8, w28, w8, x28 + // d4: f940014a ldr x10, [x10] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // d8: 9ba9ef69 umsubl x9, w27, w9, x27 + // dc: eb09011f cmp x8, x9 + // e0: 1a9fb7e8 cset w8, ge + // e4: 1a9fc7e9 cset w9, le + // e8: 2a080528 orr w8, w9, w8, lsl #1 + // ec: 12003d49 and w9, w10, #0xffff + // f0: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 00000000000000f0: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // f4: f940014a ldr x10, [x10] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // f8: 1ac82528 lsr w8, w9, w8 + // fc: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000fc: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 100: f9400129 ldr x9, [x9] + // 0000000000000100: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 104: 7200011f tst w8, #0x1 + // 108: 9a8a0128 csel x8, x9, x10, eq + // 10c: f81f02e8 stur x8, [x23, #-0x10] + // 110: a8c17bfd ldp x29, x30, [sp], #0x10 + // 114: 14000000 b 0x114 <_JIT_ENTRY+0x114> + // 0000000000000114: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[280] = { + 0xf7, 0x03, 0x15, 0xaa, 0xb3, 0x8e, 0x5f, 0xf8, + 0xb8, 0x82, 0x5f, 0xf8, 0x19, 0x0b, 0x40, 0xf9, + 0x3f, 0x43, 0x00, 0xf1, 0x82, 0x00, 0x00, 0x54, + 0x7a, 0x0a, 0x40, 0xf9, 0x5f, 0x43, 0x00, 0xf1, + 0x63, 0x00, 0x00, 0x54, 0xf5, 0x03, 0x17, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x03, 0x40, 0xb9, 0x1c, 0x1b, 0x40, 0xb9, + 0xfd, 0x03, 0x00, 0x91, 0x7b, 0x1a, 0x40, 0xb9, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x02, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x28, 0x07, 0x40, 0x92, + 0x49, 0x07, 0x40, 0x92, 0x0a, 0x00, 0x00, 0x90, + 0x88, 0xf3, 0xa8, 0x9b, 0x4a, 0x01, 0x40, 0xf9, + 0x69, 0xef, 0xa9, 0x9b, 0x1f, 0x01, 0x09, 0xeb, + 0xe8, 0xb7, 0x9f, 0x1a, 0xe9, 0xc7, 0x9f, 0x1a, + 0x28, 0x05, 0x08, 0x2a, 0x49, 0x3d, 0x00, 0x12, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x28, 0x25, 0xc8, 0x1a, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x00, 0x72, + 0x28, 0x01, 0x8a, 0x9a, 0xe8, 0x02, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + // 8: &_PyLong_ExactDealloc+0x0 + // 10: OPARG + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_FalseStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x50, (uintptr_t)data); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xcc, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xd4, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0xf0, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0xfc, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x114, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COMPARE_OP_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_STR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: aa1503f3 mov x19, x21 + // 8: f85f8eb7 ldr x23, [x21, #-0x8]! + // c: f85f82b9 ldur x25, [x21, #-0x8] + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _PyUnicode_Equal + // 14: 910003fd mov x29, sp + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_Equal + // 1c: aa1703e1 mov x1, x23 + // 20: aa1903e0 mov x0, x25 + // 24: d63f0100 blr x8 + // 28: b9400328 ldr w8, [x25] + // 2c: 2a0003f8 mov w24, w0 + // 30: 37f80208 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 34: 71000508 subs w8, w8, #0x1 + // 38: b9000328 str w8, [x25] + // 3c: 540001a1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 40: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 48: f9544928 ldr x8, [x9, #0x2890] + // 4c: b40000a8 cbz x8, 0x60 <_JIT_ENTRY+0x60> + // 50: f9544d22 ldr x2, [x9, #0x2898] + // 54: aa1903e0 mov x0, x25 + // 58: 52800021 mov w1, #0x1 // =1 + // 5c: d63f0100 blr x8 + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _PyUnicode_ExactDealloc + // 64: aa1903e0 mov x0, x25 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_ExactDealloc + // 6c: d63f0100 blr x8 + // 70: b94002e8 ldr w8, [x23] + // 74: 37f80208 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b90002e8 str w8, [x23] + // 80: 540001a1 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // 84: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 88: f9400129 ldr x9, [x9] + // 0000000000000088: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 8c: f9544928 ldr x8, [x9, #0x2890] + // 90: b40000a8 cbz x8, 0xa4 <_JIT_ENTRY+0xa4> + // 94: f9544d22 ldr x2, [x9, #0x2898] + // 98: aa1703e0 mov x0, x23 + // 9c: 52800021 mov w1, #0x1 // =1 + // a0: d63f0100 blr x8 + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _PyUnicode_ExactDealloc + // a8: aa1703e0 mov x0, x23 + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _PyUnicode_ExactDealloc + // b0: d63f0100 blr x8 + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // b8: 11001f09 add w9, w24, #0x7 + // bc: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 00000000000000bc: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // c0: f9400108 ldr x8, [x8] + // 00000000000000c0: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c4: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // c8: f940014a ldr x10, [x10] + // 00000000000000c8: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // cc: f940016b ldr x11, [x11] + // 00000000000000cc: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // d0: 0a090108 and w8, w8, w9 + // d4: 72003d1f tst w8, #0xffff + // d8: 9a8a0168 csel x8, x11, x10, eq + // dc: f81f0268 stur x8, [x19, #-0x10] + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[232] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xf3, 0x03, 0x15, 0xaa, + 0xb7, 0x8e, 0x5f, 0xf8, 0xb9, 0x82, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xe1, 0x03, 0x17, 0xaa, + 0xe0, 0x03, 0x19, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x28, 0x03, 0x40, 0xb9, 0xf8, 0x03, 0x00, 0x2a, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x19, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x19, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x02, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x01, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x49, 0x54, 0xf9, + 0xa8, 0x00, 0x00, 0xb4, 0x22, 0x4d, 0x54, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x1f, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x6b, 0x01, 0x40, 0xf9, + 0x08, 0x01, 0x09, 0x0a, 0x1f, 0x3d, 0x00, 0x72, + 0x68, 0x01, 0x8a, 0x9a, 0x68, 0x02, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyUnicode_Equal+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + // 18: OPARG + // 20: &_Py_TrueStruct+0x0 + // 28: &_Py_FalseStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyUnicode_Equal); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x84, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xbc, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xc0, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xc4, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0xc8, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xcc, (uintptr_t)data + 0x28); + patch_aarch64_26r(code + 0xe4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__CONTAINS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PySequence_Contains + // c: f9002295 str x21, [x20, #0x40] + // 10: 910003fd mov x29, sp + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PySequence_Contains + // 18: aa1303e0 mov x0, x19 + // 1c: aa1703e1 mov x1, x23 + // 20: d63f0100 blr x8 + // 24: f9402298 ldr x24, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: 2a0003f5 mov w21, w0 + // 30: b94002e8 ldr w8, [x23] + // 34: 37f80108 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b90002e8 str w8, [x23] + // 40: 540000a1 b.ne 0x54 <_JIT_ENTRY+0x54> + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 48: aa1703e0 mov x0, x23 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 50: d63f0100 blr x8 + // 54: b9400268 ldr w8, [x19] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000268 str w8, [x19] + // 64: 540001c0 b.eq 0x9c <_JIT_ENTRY+0x9c> + // 68: 37f80255 tbnz w21, #0x1f, 0xb0 <_JIT_ENTRY+0xb0> + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 70: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 74: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 7c: f9400129 ldr x9, [x9] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 80: f940014a ldr x10, [x10] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 84: 6b2822bf cmp w21, w8, uxth + // 88: d1002315 sub x21, x24, #0x8 + // 8c: 9a890148 csel x8, x10, x9, eq + // 90: f81f0308 stur x8, [x24, #-0x10] + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_CONTINUE + // 9c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a0: aa1303e0 mov x0, x19 + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a8: d63f0100 blr x8 + // ac: 36fffe15 tbz w21, #0x1f, 0x6c <_JIT_ENTRY+0x6c> + // b0: d1004315 sub x21, x24, #0x10 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb7, 0x4e, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x00, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf5, 0x03, 0x00, 0x2a, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x01, 0x00, 0x54, + 0x55, 0x02, 0xf8, 0x37, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0xbf, 0x22, 0x28, 0x6b, + 0x15, 0x23, 0x00, 0xd1, 0x48, 0x01, 0x89, 0x9a, + 0x08, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x15, 0xfe, 0xff, 0x36, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySequence_Contains+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: OPARG + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_FalseStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySequence_Contains); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x6c, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x78, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x98, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__CONTAINS_OP_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // c: 910003fd mov x29, sp + // 10: f9400668 ldr x8, [x19, #0x8] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 18: eb09011f cmp x8, x9 + // 1c: 54000060 b.eq 0x28 <_JIT_ENTRY+0x28> + // 20: a8c17bfd ldp x29, x30, [sp], #0x10 + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 28: f85f02b7 ldur x23, [x21, #-0x10] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE PyDict_Contains + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PyDict_Contains + // 38: aa1303e0 mov x0, x19 + // 3c: aa1703e1 mov x1, x23 + // 40: d63f0100 blr x8 + // 44: f9402298 ldr x24, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 2a0003f5 mov w21, w0 + // 50: b94002e8 ldr w8, [x23] + // 54: 37f80108 tbnz w8, #0x1f, 0x74 <_JIT_ENTRY+0x74> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b90002e8 str w8, [x23] + // 60: 540000a1 b.ne 0x74 <_JIT_ENTRY+0x74> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: aa1703e0 mov x0, x23 + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 70: d63f0100 blr x8 + // 74: b9400268 ldr w8, [x19] + // 78: 37f80088 tbnz w8, #0x1f, 0x88 <_JIT_ENTRY+0x88> + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000268 str w8, [x19] + // 84: 540001c0 b.eq 0xbc <_JIT_ENTRY+0xbc> + // 88: 37f80255 tbnz w21, #0x1f, 0xd0 <_JIT_ENTRY+0xd0> + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 90: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 94: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 9c: f9400129 ldr x9, [x9] + // 000000000000009c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // a0: f940014a ldr x10, [x10] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // a4: 6b2822bf cmp w21, w8, uxth + // a8: d1002315 sub x21, x24, #0x8 + // ac: 9a890148 csel x8, x10, x9, eq + // b0: f81f0308 stur x8, [x24, #-0x10] + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b8: R_AARCH64_JUMP26 _JIT_CONTINUE + // bc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000bc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c0: aa1303e0 mov x0, x19 + // c4: f9400108 ldr x8, [x8] + // 00000000000000c4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c8: d63f0100 blr x8 + // cc: 36fffe15 tbz w21, #0x1f, 0x8c <_JIT_ENTRY+0x8c> + // d0: d1004315 sub x21, x24, #0x10 + // d4: a8c17bfd ldp x29, x30, [sp], #0x10 + // d8: 14000000 b 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // dc: 00 00 00 00 + const unsigned char code_body[224] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x60, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xb7, 0x02, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x17, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf5, 0x03, 0x00, 0x2a, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x01, 0x00, 0x54, + 0x55, 0x02, 0xf8, 0x37, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0xbf, 0x22, 0x28, 0x6b, + 0x15, 0x23, 0x00, 0xd1, 0x48, 0x01, 0x89, 0x9a, + 0x08, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x15, 0xfe, 0xff, 0x36, + 0x15, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: &PyDict_Contains+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: OPARG + // 20: &_Py_TrueStruct+0x0 + // 28: &_Py_FalseStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, (uintptr_t)&PyDict_Contains); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x8c, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x90, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0x94, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0x98, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x9c, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xa0, (uintptr_t)data + 0x28); + patch_aarch64_26r(code + 0xb8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xbc, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xc4, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd8, state->instruction_starts[instruction->error_target]); +} + +void +emit__CONTAINS_OP_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_SET.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PySet_Type + // c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyFrozenSet_Type + // 10: 910003fd mov x29, sp + // 14: f9400668 ldr x8, [x19, #0x8] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC PySet_Type + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PyFrozenSet_Type + // 20: eb09011f cmp x8, x9 + // 24: fa4a1104 ccmp x8, x10, #0x4, ne + // 28: 540004c1 b.ne 0xc0 <_JIT_ENTRY+0xc0> + // 2c: f85f02b7 ldur x23, [x21, #-0x10] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _PySet_Contains + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC _PySet_Contains + // 3c: aa1303e0 mov x0, x19 + // 40: aa1703e1 mov x1, x23 + // 44: d63f0100 blr x8 + // 48: f9402298 ldr x24, [x20, #0x40] + // 4c: f900229f str xzr, [x20, #0x40] + // 50: 2a0003f5 mov w21, w0 + // 54: b94002e8 ldr w8, [x23] + // 58: 37f80108 tbnz w8, #0x1f, 0x78 <_JIT_ENTRY+0x78> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b90002e8 str w8, [x23] + // 64: 540000a1 b.ne 0x78 <_JIT_ENTRY+0x78> + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 6c: aa1703e0 mov x0, x23 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: b9400268 ldr w8, [x19] + // 7c: 37f80088 tbnz w8, #0x1f, 0x8c <_JIT_ENTRY+0x8c> + // 80: 71000508 subs w8, w8, #0x1 + // 84: b9000268 str w8, [x19] + // 88: 54000200 b.eq 0xc8 <_JIT_ENTRY+0xc8> + // 8c: 37f80295 tbnz w21, #0x1f, 0xdc <_JIT_ENTRY+0xdc> + // 90: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 94: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 98: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000098: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 9c: f9400108 ldr x8, [x8] + // 000000000000009c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // a0: f9400129 ldr x9, [x9] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // a4: f940014a ldr x10, [x10] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // a8: 6b2822bf cmp w21, w8, uxth + // ac: d1002315 sub x21, x24, #0x8 + // b0: 9a890148 csel x8, x10, x9, eq + // b4: f81f0308 stur x8, [x24, #-0x10] + // b8: a8c17bfd ldp x29, x30, [sp], #0x10 + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_CONTINUE + // c0: a8c17bfd ldp x29, x30, [sp], #0x10 + // c4: 14000000 b 0xc4 <_JIT_ENTRY+0xc4> + // 00000000000000c4: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // c8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: aa1303e0 mov x0, x19 + // d0: f9400108 ldr x8, [x8] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d4: d63f0100 blr x8 + // d8: 36fffdd5 tbz w21, #0x1f, 0x90 <_JIT_ENTRY+0x90> + // dc: d1004315 sub x21, x24, #0x10 + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[232] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x09, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x68, 0x06, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x04, 0x11, 0x4a, 0xfa, + 0xc1, 0x04, 0x00, 0x54, 0xb7, 0x02, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xf5, 0x03, 0x00, 0x2a, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x00, 0x02, 0x00, 0x54, 0x95, 0x02, 0xf8, 0x37, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x0a, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0xbf, 0x22, 0x28, 0x6b, 0x15, 0x23, 0x00, 0xd1, + 0x48, 0x01, 0x89, 0x9a, 0x08, 0x03, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xd5, 0xfd, 0xff, 0x36, 0x15, 0x43, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PySet_Type+0x0 + // 8: &PyFrozenSet_Type+0x0 + // 10: &_PySet_Contains+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: OPARG + // 28: &_Py_TrueStruct+0x0 + // 30: &_Py_FalseStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySet_Type); + patch_64(data + 0x8, (uintptr_t)&PyFrozenSet_Type); + patch_64(data + 0x10, (uintptr_t)&_PySet_Contains); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x30, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x68, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x90, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0x94, (uintptr_t)data + 0x28); + patch_aarch64_21rx(code + 0x98, (uintptr_t)data + 0x30); + patch_aarch64_12x(code + 0x9c, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xa0, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data + 0x30); + patch_aarch64_26r(code + 0xbc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xc4, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0xc8, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xd0, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xe4, state->instruction_starts[instruction->error_target]); +} + +void +emit__CONVERT_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONVERT_VALUE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyEval_ConversionFuncs + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _PyEval_ConversionFuncs + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: 92403d08 and x8, x8, #0xffff + // 20: aa1303e0 mov x0, x19 + // 24: f8687928 ldr x8, [x9, x8, lsl #3] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: d63f0100 blr x8 + // 30: f9402288 ldr x8, [x20, #0x40] + // 34: d1002108 sub x8, x8, #0x8 + // 38: f9002288 str x8, [x20, #0x40] + // 3c: b9400268 ldr w8, [x19] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 <_JIT_ENTRY+0x50> + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000268 str w8, [x19] + // 4c: 540000e0 b.eq 0x68 <_JIT_ENTRY+0x68> + // 50: f9402295 ldr x21, [x20, #0x40] + // 54: f900229f str xzr, [x20, #0x40] + // 58: b40001a0 cbz x0, 0x8c <_JIT_ENTRY+0x8c> + // 5c: f80086a0 str x0, [x21], #0x8 + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 <_JIT_ENTRY+0x64> + // 0000000000000064: R_AARCH64_JUMP26 _JIT_CONTINUE + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 6c: aa0003f5 mov x21, x0 + // 70: aa1303e0 mov x0, x19 + // 74: f9400108 ldr x8, [x8] + // 0000000000000074: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 78: d63f0100 blr x8 + // 7c: aa1503e0 mov x0, x21 + // 80: f9402295 ldr x21, [x20, #0x40] + // 84: f900229f str xzr, [x20, #0x40] + // 88: b5fffea0 cbnz x0, 0x5c <_JIT_ENTRY+0x5c> + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 94: 00 00 00 00 + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x3d, 0x40, 0x92, + 0xe0, 0x03, 0x13, 0xaa, 0x28, 0x79, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x01, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0xfe, 0xff, 0xb5, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ConversionFuncs+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ConversionFuncs); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->error_target]); +} + +void +emit__COPY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: cb282ea8 sub x8, x21, w8, uxth #3 + // c: f9400108 ldr x8, [x8] + // 10: b9400109 ldr w9, [x8] + // 14: 37f80069 tbnz w9, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 18: 11000529 add w9, w9, #0x1 + // 1c: b9000109 str w9, [x8] + // 20: f80086a8 str x8, [x21], #0x8 + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x2e, 0x28, 0xcb, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__COPY_FREE_VARS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY_FREE_VARS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400129 ldr x9, [x9] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 72003d3f tst w9, #0xffff + // c: 540002a0 b.eq 0x60 <_JIT_ENTRY+0x60> + // 10: f9400288 ldr x8, [x20] + // 14: f9400a8a ldr x10, [x20, #0x10] + // 18: b9404908 ldr w8, [x8, #0x48] + // 1c: f940254a ldr x10, [x10, #0x48] + // 20: 4b292108 sub w8, w8, w9, uxth + // 24: 92403d29 and x9, x9, #0xffff + // 28: 8b28ce8b add x11, x20, w8, sxtw #3 + // 2c: 91006148 add x8, x10, #0x18 + // 30: 9101416a add x10, x11, #0x50 + // 34: 14000005 b 0x48 <_JIT_ENTRY+0x48> + // 38: f1000529 subs x9, x9, #0x1 + // 3c: 91002108 add x8, x8, #0x8 + // 40: f800854b str x11, [x10], #0x8 + // 44: 540000e0 b.eq 0x60 <_JIT_ENTRY+0x60> + // 48: f940010b ldr x11, [x8] + // 4c: b940016c ldr w12, [x11] + // 50: 37ffff4c tbnz w12, #0x1f, 0x38 <_JIT_ENTRY+0x38> + // 54: 1100058c add w12, w12, #0x1 + // 58: b900016c str w12, [x11] + // 5c: 17fffff7 b 0x38 <_JIT_ENTRY+0x38> + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[96] = { + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x3f, 0x3d, 0x00, 0x72, 0xa0, 0x02, 0x00, 0x54, + 0x88, 0x02, 0x40, 0xf9, 0x8a, 0x0a, 0x40, 0xf9, + 0x08, 0x49, 0x40, 0xb9, 0x4a, 0x25, 0x40, 0xf9, + 0x08, 0x21, 0x29, 0x4b, 0x29, 0x3d, 0x40, 0x92, + 0x8b, 0xce, 0x28, 0x8b, 0x48, 0x61, 0x00, 0x91, + 0x6a, 0x41, 0x01, 0x91, 0x05, 0x00, 0x00, 0x14, + 0x29, 0x05, 0x00, 0xf1, 0x08, 0x21, 0x00, 0x91, + 0x4b, 0x85, 0x00, 0xf8, 0xe0, 0x00, 0x00, 0x54, + 0x0b, 0x01, 0x40, 0xf9, 0x6c, 0x01, 0x40, 0xb9, + 0x4c, 0xff, 0xff, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x6c, 0x01, 0x00, 0xb9, 0xf7, 0xff, 0xff, 0x17, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); +} + +void +emit__CREATE_INIT_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CREATE_INIT_FRAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_InitCleanup + // 8: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _Py_InitCleanup + // 14: f9407ad3 ldr x19, [x22, #0xf0] + // 18: f940016b ldr x11, [x11] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 1c: f9002295 str x21, [x20, #0x40] + // 20: 6949250a ldpsw x10, x9, [x8, #0x48] + // 24: 8b090e69 add x9, x19, x9, lsl #3 + // 28: f9007ac9 str x9, [x22, #0xf0] + // 2c: 8b0a0e69 add x9, x19, x10, lsl #3 + // 30: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 34: a900ae74 stp x20, x11, [x19, #0x8] + // 38: f9000268 str x8, [x19] + // 3c: 91016129 add x9, x9, #0x58 + // 40: 91034108 add x8, x8, #0xd0 + // 44: f940014a ldr x10, [x10] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 48: a902fe7f stp xzr, xzr, [x19, #0x28] + // 4c: a903a668 stp x8, x9, [x19, #0x38] + // 50: 12003d48 and w8, w10, #0xffff + // 54: b9004a7f str wzr, [x19, #0x48] + // 58: 2a2803eb mvn w11, w8 + // 5c: f9402289 ldr x9, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: f86bdaac ldr x12, [x21, w11, sxtw #3] + // 68: 9280002b mov x11, #-0x2 // =-2 + // 6c: cb2a216b sub x11, x11, w10, uxth + // 70: cb2a2eaa sub x10, x21, w10, uxth #3 + // 74: b940018d ldr w13, [x12] + // 78: 37f8006d tbnz w13, #0x1f, 0x84 <_JIT_ENTRY+0x84> + // 7c: 110005ad add w13, w13, #0x1 + // 80: b900018d str w13, [x12] + // 84: d37df177 lsl x23, x11, #3 + // 88: f9002a6c str x12, [x19, #0x50] + // 8c: 11000504 add w4, w8, #0x1 + // 90: f9002289 str x9, [x20, #0x40] + // 94: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _PyEvalFramePushAndInit + // 98: d1002143 sub x3, x10, #0x8 + // 9c: f8776aa1 ldr x1, [x21, x23] + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC _PyEvalFramePushAndInit + // a4: aa1603e0 mov x0, x22 + // a8: aa1f03e2 mov x2, xzr + // ac: aa1f03e5 mov x5, xzr + // b0: aa1303e6 mov x6, x19 + // b4: d63f0100 blr x8 + // b8: f9402288 ldr x8, [x20, #0x40] + // bc: f900229f str xzr, [x20, #0x40] + // c0: 8b170115 add x21, x8, x23 + // c4: b4000120 cbz x0, 0xe8 <_JIT_ENTRY+0xe8> + // c8: b9402ec8 ldr w8, [x22, #0x2c] + // cc: 52800089 mov w9, #0x4 // =4 + // d0: 79009289 strh w9, [x20, #0x48] + // d4: 51000508 sub w8, w8, #0x1 + // d8: b9002ec8 str w8, [x22, #0x2c] + // dc: f80086a0 str x0, [x21], #0x8 + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_CONTINUE + // e8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _PyEval_FrameClearAndPop + // ec: aa1603e0 mov x0, x22 + // f0: aa1303e1 mov x1, x19 + // f4: f9400108 ldr x8, [x8] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FrameClearAndPop + // f8: d63f0100 blr x8 + // fc: a8c17bfd ldp x29, x30, [sp], #0x10 + // 100: 14000000 b 0x100 <_JIT_ENTRY+0x100> + // 0000000000000100: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 104: 00 00 00 00 + const unsigned char code_body[264] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x0b, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xd3, 0x7a, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x0a, 0x25, 0x49, 0x69, 0x69, 0x0e, 0x09, 0x8b, + 0xc9, 0x7a, 0x00, 0xf9, 0x69, 0x0e, 0x0a, 0x8b, + 0x0a, 0x00, 0x00, 0x90, 0x74, 0xae, 0x00, 0xa9, + 0x68, 0x02, 0x00, 0xf9, 0x29, 0x61, 0x01, 0x91, + 0x08, 0x41, 0x03, 0x91, 0x4a, 0x01, 0x40, 0xf9, + 0x7f, 0xfe, 0x02, 0xa9, 0x68, 0xa6, 0x03, 0xa9, + 0x48, 0x3d, 0x00, 0x12, 0x7f, 0x4a, 0x00, 0xb9, + 0xeb, 0x03, 0x28, 0x2a, 0x89, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xac, 0xda, 0x6b, 0xf8, + 0x2b, 0x00, 0x80, 0x92, 0x6b, 0x21, 0x2a, 0xcb, + 0xaa, 0x2e, 0x2a, 0xcb, 0x8d, 0x01, 0x40, 0xb9, + 0x6d, 0x00, 0xf8, 0x37, 0xad, 0x05, 0x00, 0x11, + 0x8d, 0x01, 0x00, 0xb9, 0x77, 0xf1, 0x7d, 0xd3, + 0x6c, 0x2a, 0x00, 0xf9, 0x04, 0x05, 0x00, 0x11, + 0x89, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x43, 0x21, 0x00, 0xd1, 0xa1, 0x6a, 0x77, 0xf8, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe2, 0x03, 0x1f, 0xaa, 0xe5, 0x03, 0x1f, 0xaa, + 0xe6, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x01, 0x17, 0x8b, 0x20, 0x01, 0x00, 0xb4, + 0xc8, 0x2e, 0x40, 0xb9, 0x89, 0x00, 0x80, 0x52, + 0x89, 0x92, 0x00, 0x79, 0x08, 0x05, 0x00, 0x51, + 0xc8, 0x2e, 0x00, 0xb9, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_InitCleanup+0x0 + // 8: &_Py_NoneStruct+0x0 + // 10: OPARG + // 18: &_PyEvalFramePushAndInit+0x0 + // 20: &_PyEval_FrameClearAndPop+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x20, (uintptr_t)&_PyEval_FrameClearAndPop); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x30, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x44, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x94, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xa0, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xe4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xe8, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xf4, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x100, state->instruction_starts[instruction->error_target]); +} + +void +emit__DELETE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_ATTR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 910003fd mov x29, sp + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: aa1303e0 mov x0, x19 + // 24: f9400d01 ldr x1, [x8, #0x18] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PyObject_DelAttr + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyObject_DelAttr + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a0 b.eq 0x64 <_JIT_ENTRY+0x64> + // 54: d10022b5 sub x21, x21, #0x8 + // 58: 34000140 cbz w0, 0x80 <_JIT_ENTRY+0x80> + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 2a0003f7 mov w23, w0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: d10022b5 sub x21, x21, #0x8 + // 7c: 35ffff17 cbnz w23, 0x5c <_JIT_ENTRY+0x5c> + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 <_JIT_ENTRY+0x84> + // 0000000000000084: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x2d, 0x29, 0x8b, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0x40, 0x01, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0x17, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyObject_DelAttr+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_DelAttr); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DELETE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_DEREF.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 8b282e88 add x8, x20, w8, uxth #3 + // 14: f9402908 ldr x8, [x8, #0x50] + // 18: f9400900 ldr x0, [x8, #0x10] + // 1c: f900091f str xzr, [x8, #0x10] + // 20: b4000160 cbz x0, 0x4c <_JIT_ENTRY+0x4c> + // 24: f9002295 str x21, [x20, #0x40] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 54000240 b.eq 0x80 <_JIT_ENTRY+0x80> + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 50: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcUnbound + // 54: aa1603e0 mov x0, x22 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 5c: f9002295 str x21, [x20, #0x40] + // 60: f9400281 ldr x1, [x20] + // 64: f9400129 ldr x9, [x9] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcUnbound + // 68: 12003d02 and w2, w8, #0xffff + // 6c: d63f0120 blr x9 + // 70: f9402295 ldr x21, [x20, #0x40] + // 74: f900229f str xzr, [x20, #0x40] + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c <_JIT_ENTRY+0x7c> + // 000000000000007c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 80: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000080: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 88: d63f0100 blr x8 + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x00, 0x09, 0x40, 0xf9, 0x1f, 0x09, 0x00, 0xf9, + 0x60, 0x01, 0x00, 0xb4, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x40, 0x02, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x81, 0x02, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x02, 0x3d, 0x00, 0x12, 0x20, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: OPARG + // 8: &_PyEval_FormatExcUnbound+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x58, (uintptr_t)data); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0x80, (uintptr_t)data + 0x10); +} + +void +emit__DELETE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_FAST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 91014288 add x8, x20, #0x50 + // c: 910003fd mov x29, sp + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 92403d21 and x1, x9, #0xffff + // 18: f8617900 ldr x0, [x8, x1, lsl #3] + // 1c: b4000180 cbz x0, 0x4c <_JIT_ENTRY+0x4c> + // 20: f821791f str xzr, [x8, x1, lsl #3] + // 24: f9002295 str x21, [x20, #0x40] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 54000340 b.eq 0xa0 <_JIT_ENTRY+0xa0> + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE PyExc_UnboundLocalError + // 50: f9400108 ldr x8, [x8] + // 0000000000000050: R_AARCH64_LD64_GOT_LO12_NC PyExc_UnboundLocalError + // 54: f9400289 ldr x9, [x20] + // 58: f9002295 str x21, [x20, #0x40] + // 5c: f9400113 ldr x19, [x8] + // 60: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE PyTuple_GetItem + // 64: f9403120 ldr x0, [x9, #0x60] + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC PyTuple_GetItem + // 6c: d63f0100 blr x8 + // 70: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcCheckArg + // 74: aa0003e3 mov x3, x0 + // 78: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 7c: 91000042 add x2, x2, #0x0 + // 000000000000007c: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcCheckArg + // 84: aa1603e0 mov x0, x22 + // 88: aa1303e1 mov x1, x19 + // 8c: d63f0100 blr x8 + // 90: f9402295 ldr x21, [x20, #0x40] + // 94: f900229f str xzr, [x20, #0x40] + // 98: a8c17bfd ldp x29, x30, [sp], #0x10 + // 9c: 14000000 b 0x9c <_JIT_ENTRY+0x9c> + // 000000000000009c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // a0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a8: d63f0100 blr x8 + // ac: f9402295 ldr x21, [x20, #0x40] + // b0: f900229f str xzr, [x20, #0x40] + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b8: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[184] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x88, 0x42, 0x01, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0x29, 0x01, 0x40, 0xf9, 0x21, 0x3d, 0x40, 0x92, + 0x00, 0x79, 0x61, 0xf8, 0x80, 0x01, 0x00, 0xb4, + 0x1f, 0x79, 0x21, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x40, 0x03, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x89, 0x02, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x13, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x20, 0x31, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe3, 0x03, 0x00, 0xaa, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: OPARG + // 58: &PyExc_UnboundLocalError+0x0 + // 60: &PyTuple_GetItem+0x0 + // 68: &_PyEval_FormatExcCheckArg+0x0 + // 70: &_Py_Dealloc+0x0 + const unsigned char data_body[120] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, instruction->oparg); + patch_64(data + 0x58, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x60, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x68, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x70, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x50); + patch_aarch64_12x(code + 0x10, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x4c, (uintptr_t)data + 0x58); + patch_aarch64_21rx(code + 0x60, (uintptr_t)data + 0x60); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x60); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0x68); + patch_aarch64_21r(code + 0x78, (uintptr_t)data); + patch_aarch64_12(code + 0x7c, (uintptr_t)data); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x68); + patch_aarch64_26r(code + 0x9c, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0xa0, (uintptr_t)data + 0x70); +} + +void +emit__DELETE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_GLOBAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: aa1f03e2 mov x2, xzr + // 10: 910003fd mov x29, sp + // 14: f9401108 ldr x8, [x8, #0x20] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 1c: f9400e80 ldr x0, [x20, #0x18] + // 20: 8b292d08 add x8, x8, w9, uxth #3 + // 24: f9400d13 ldr x19, [x8, #0x18] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PyDict_Pop + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyDict_Pop + // 34: aa1303e1 mov x1, x19 + // 38: d63f0100 blr x8 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: 37f80080 tbnz w0, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 340000a0 cbz w0, 0x5c <_JIT_ENTRY+0x5c> + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: 14000000 b 0x50 <_JIT_ENTRY+0x50> + // 0000000000000050: R_AARCH64_JUMP26 _JIT_CONTINUE + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 <_JIT_ENTRY+0x58> + // 0000000000000058: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE PyExc_NameError + // 60: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 64: 91000042 add x2, x2, #0x0 + // 0000000000000064: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC PyExc_NameError + // 6c: f9002295 str x21, [x20, #0x40] + // 70: aa1603e0 mov x0, x22 + // 74: aa1303e3 mov x3, x19 + // 78: f9400101 ldr x1, [x8] + // 7c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000007c: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcCheckArg + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcCheckArg + // 84: d63f0100 blr x8 + // 88: f9402295 ldr x21, [x20, #0x40] + // 8c: f900229f str xzr, [x20, #0x40] + // 90: a8c17bfd ldp x29, x30, [sp], #0x10 + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xe2, 0x03, 0x1f, 0xaa, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x11, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x80, 0x0e, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x13, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0xf8, 0x37, + 0xa0, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe3, 0x03, 0x13, 0xaa, + 0x01, 0x01, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "name '%.200s' is not defined\x00" + // 1d: 00 00 00 + // 20: OPARG + // 28: &PyDict_Pop+0x0 + // 30: &PyExc_NameError+0x0 + // 38: &_PyEval_FormatExcCheckArg+0x0 + const unsigned char data_body[64] = { + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 0x2e, + 0x32, 0x30, 0x30, 0x73, 0x27, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&PyDict_Pop); + patch_64(data + 0x30, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x38, (uintptr_t)&_PyEval_FormatExcCheckArg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x18, (uintptr_t)data + 0x20); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x28); + patch_aarch64_26r(code + 0x50, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x58, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x30); + patch_aarch64_21r(code + 0x60, (uintptr_t)data); + patch_aarch64_12(code + 0x64, (uintptr_t)data); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x30); + patch_aarch64_33rx(code + 0x7c, (uintptr_t)data + 0x38); + patch_aarch64_26r(code + 0x94, state->instruction_starts[instruction->error_target]); +} + +void +emit__DELETE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_NAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 910003fd mov x29, sp + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 18: f9401680 ldr x0, [x20, #0x28] + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d13 ldr x19, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: b40002e0 cbz x0, 0x84 <_JIT_ENTRY+0x84> + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PyObject_DelItem + // 30: aa1303e1 mov x1, x19 + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PyObject_DelItem + // 38: d63f0100 blr x8 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: 340003c0 cbz w0, 0xbc <_JIT_ENTRY+0xbc> + // 48: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000048: R_AARCH64_ADR_GOT_PAGE PyExc_NameError + // 4c: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1+0x1b + // 50: 91000042 add x2, x2, #0x0 + // 0000000000000050: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1+0x1b + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC PyExc_NameError + // 58: f9002295 str x21, [x20, #0x40] + // 5c: aa1603e0 mov x0, x22 + // 60: aa1303e3 mov x3, x19 + // 64: f9400101 ldr x1, [x8] + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcCheckArg + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcCheckArg + // 70: d63f0100 blr x8 + // 74: f9402295 ldr x21, [x20, #0x40] + // 78: f900229f str xzr, [x20, #0x40] + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: 14000000 b 0x80 <_JIT_ENTRY+0x80> + // 0000000000000080: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 84: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE PyExc_SystemError + // 88: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 8c: 91000042 add x2, x2, #0x0 + // 000000000000008c: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC PyExc_SystemError + // 94: aa1603e0 mov x0, x22 + // 98: aa1303e3 mov x3, x19 + // 9c: f9400101 ldr x1, [x8] + // a0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a0: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // a8: d63f0100 blr x8 + // ac: f9402295 ldr x21, [x20, #0x40] + // b0: f900229f str xzr, [x20, #0x40] + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000c0: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x80, 0x16, 0x40, 0xf9, 0x08, 0x2d, 0x29, 0x8b, + 0x13, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x02, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x03, 0x00, 0x34, + 0x08, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe3, 0x03, 0x13, 0xaa, 0x01, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xe3, 0x03, 0x13, 0xaa, 0x01, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: "no locals when deleting %R\x00name '%.200s' is not defined\x00" + // 38: OPARG + // 40: &PyObject_DelItem+0x0 + // 48: &PyExc_NameError+0x0 + // 50: &_PyEval_FormatExcCheckArg+0x0 + // 58: &PyExc_SystemError+0x0 + // 60: &_PyErr_Format+0x0 + const unsigned char data_body[104] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x52, 0x00, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x38, instruction->oparg); + patch_64(data + 0x40, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x48, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x50, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x58, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x60, (uintptr_t)&_PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x38); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x38); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data + 0x40); + patch_aarch64_12x(code + 0x34, (uintptr_t)data + 0x40); + patch_aarch64_21rx(code + 0x48, (uintptr_t)data + 0x48); + patch_aarch64_21r(code + 0x4c, (uintptr_t)data + 0x1b); + patch_aarch64_12(code + 0x50, (uintptr_t)data + 0x1b); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x48); + patch_aarch64_33rx(code + 0x68, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0x80, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x84, (uintptr_t)data + 0x58); + patch_aarch64_21r(code + 0x88, (uintptr_t)data); + patch_aarch64_12(code + 0x8c, (uintptr_t)data); + patch_aarch64_12x(code + 0x90, (uintptr_t)data + 0x58); + patch_aarch64_33rx(code + 0xa0, (uintptr_t)data + 0x60); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__DELETE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_SUBSCR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyObject_DelItem + // c: f9002295 str x21, [x20, #0x40] + // 10: 910003fd mov x29, sp + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyObject_DelItem + // 18: aa1703e0 mov x0, x23 + // 1c: aa1303e1 mov x1, x19 + // 20: d63f0100 blr x8 + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: 2a0003f8 mov w24, w0 + // 30: b94002e8 ldr w8, [x23] + // 34: 37f80108 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b90002e8 str w8, [x23] + // 40: 540000a1 b.ne 0x54 <_JIT_ENTRY+0x54> + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 48: aa1703e0 mov x0, x23 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 50: d63f0100 blr x8 + // 54: b9400268 ldr w8, [x19] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000268 str w8, [x19] + // 64: 540000a0 b.eq 0x78 <_JIT_ENTRY+0x78> + // 68: d10042b5 sub x21, x21, #0x10 + // 6c: 34000138 cbz w24, 0x90 <_JIT_ENTRY+0x90> + // 70: a8c17bfd ldp x29, x30, [sp], #0x10 + // 74: 14000000 b 0x74 <_JIT_ENTRY+0x74> + // 0000000000000074: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 7c: aa1303e0 mov x0, x19 + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: d10042b5 sub x21, x21, #0x10 + // 8c: 35ffff38 cbnz w24, 0x70 <_JIT_ENTRY+0x70> + // 90: a8c17bfd ldp x29, x30, [sp], #0x10 + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb7, 0x4e, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x00, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf8, 0x03, 0x00, 0x2a, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x42, 0x00, 0xd1, 0x38, 0x01, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x42, 0x00, 0xd1, 0x38, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyObject_DelItem+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x74, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__DEOPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DEOPT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_TARGET + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // c: f9008ac8 str x8, [x22, #0x110] + // 10: f9400288 ldr x8, [x20] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_TARGET + // 18: f9002295 str x21, [x20, #0x40] + // 1c: 8b294508 add x8, x8, w9, uxtw #1 + // 20: 91034100 add x0, x8, #0xd0 + // 24: d65f03c0 ret + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xc8, 0x8a, 0x00, 0xf9, + 0x88, 0x02, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x45, 0x29, 0x8b, + 0x00, 0x41, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + }; + // 0: EXECUTOR + // 8: TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->target); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); +} + +void +emit__DICT_MERGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_MERGE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 12800069 mov w9, #-0x4 // =-4 + // c: 52800042 mov w2, #0x2 // =2 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f85f82b3 ldur x19, [x21, #-0x8] + // 18: 910003fd mov x29, sp + // 1c: 12003d08 and w8, w8, #0xffff + // 20: aa1303e1 mov x1, x19 + // 24: 2a2803ea mvn w10, w8 + // 28: 4b080128 sub w8, w9, w8 + // 2c: f86adaa0 ldr x0, [x21, w10, sxtw #3] + // 30: f868dab7 ldr x23, [x21, w8, sxtw #3] + // 34: f9002295 str x21, [x20, #0x40] + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _PyDict_MergeEx + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _PyDict_MergeEx + // 40: d63f0100 blr x8 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 37f80120 tbnz w0, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 50: b9400268 ldr w8, [x19] + // 54: 37f80088 tbnz w8, #0x1f, 0x64 <_JIT_ENTRY+0x64> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000268 str w8, [x19] + // 60: 540002a0 b.eq 0xb4 <_JIT_ENTRY+0xb4> + // 64: d10022b5 sub x21, x21, #0x8 + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 70: f9002295 str x21, [x20, #0x40] + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatKwargsError + // 78: aa1603e0 mov x0, x22 + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatKwargsError + // 80: aa1703e1 mov x1, x23 + // 84: aa1303e2 mov x2, x19 + // 88: d63f0100 blr x8 + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: b9400268 ldr w8, [x19] + // 98: 37f80088 tbnz w8, #0x1f, 0xa8 <_JIT_ENTRY+0xa8> + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000268 str w8, [x19] + // a4: 54000160 b.eq 0xd0 <_JIT_ENTRY+0xd0> + // a8: d10022b5 sub x21, x21, #0x8 + // ac: a8c17bfd ldp x29, x30, [sp], #0x10 + // b0: 14000000 b 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000b0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // b8: aa1303e0 mov x0, x19 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c0: d63f0100 blr x8 + // c4: d10022b5 sub x21, x21, #0x8 + // c8: a8c17bfd ldp x29, x30, [sp], #0x10 + // cc: 14000000 b 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000cc: R_AARCH64_JUMP26 _JIT_CONTINUE + // d0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d4: aa1303e0 mov x0, x19 + // d8: f9400108 ldr x8, [x8] + // 00000000000000d8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // dc: d63f0100 blr x8 + // e0: d10022b5 sub x21, x21, #0x8 + // e4: a8c17bfd ldp x29, x30, [sp], #0x10 + // e8: 14000000 b 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // ec: 00 00 00 00 + const unsigned char code_body[240] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x69, 0x00, 0x80, 0x12, 0x42, 0x00, 0x80, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0xb3, 0x82, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x3d, 0x00, 0x12, + 0xe1, 0x03, 0x13, 0xaa, 0xea, 0x03, 0x28, 0x2a, + 0x28, 0x01, 0x08, 0x4b, 0xa0, 0xda, 0x6a, 0xf8, + 0xb7, 0xda, 0x68, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x01, 0xf8, 0x37, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x02, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x60, 0x01, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyDict_MergeEx+0x0 + // 10: &_PyEval_FormatKwargsError+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_MergeEx); + patch_64(data + 0x10, (uintptr_t)&_PyEval_FormatKwargsError); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xb0, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xcc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xd0, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xd8, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xe8, state->instruction_starts[instruction->error_target]); +} + +void +emit__DICT_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_UPDATE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: f85f82b3 ldur x19, [x21, #-0x8] + // 14: 2a2803e8 mvn w8, w8 + // 18: aa1303e1 mov x1, x19 + // 1c: 531d7108 lsl w8, w8, #3 + // 20: b26db108 orr x8, x8, #0xfffffffffff80000 + // 24: f8686aa0 ldr x0, [x21, x8] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PyDict_Update + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyDict_Update + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: 37f80120 tbnz w0, #0x1f, 0x64 <_JIT_ENTRY+0x64> + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540004a0 b.eq 0xe8 <_JIT_ENTRY+0xe8> + // 58: d10022b5 sub x21, x21, #0x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE PyExc_AttributeError + // 68: aa1603e0 mov x0, x22 + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC PyExc_AttributeError + // 70: f9002295 str x21, [x20, #0x40] + // 74: f9400101 ldr x1, [x8] + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _PyErr_ExceptionMatches + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _PyErr_ExceptionMatches + // 80: d63f0100 blr x8 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 340001e0 cbz w0, 0xc8 <_JIT_ENTRY+0xc8> + // 90: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // 94: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 98: 91000042 add x2, x2, #0x0 + // 0000000000000098: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 9c: f9400108 ldr x8, [x8] + // 000000000000009c: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // a0: f9400669 ldr x9, [x19, #0x8] + // a4: f9002295 str x21, [x20, #0x40] + // a8: aa1603e0 mov x0, x22 + // ac: f9400101 ldr x1, [x8] + // b0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b0: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // b4: f9400d23 ldr x3, [x9, #0x18] + // b8: f9400108 ldr x8, [x8] + // 00000000000000b8: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // bc: d63f0100 blr x8 + // c0: f9402295 ldr x21, [x20, #0x40] + // c4: f900229f str xzr, [x20, #0x40] + // c8: b9400268 ldr w8, [x19] + // cc: 37f80088 tbnz w8, #0x1f, 0xdc <_JIT_ENTRY+0xdc> + // d0: 71000508 subs w8, w8, #0x1 + // d4: b9000268 str w8, [x19] + // d8: 54000160 b.eq 0x104 <_JIT_ENTRY+0x104> + // dc: d10022b5 sub x21, x21, #0x8 + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // e8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // ec: aa1303e0 mov x0, x19 + // f0: f9400108 ldr x8, [x8] + // 00000000000000f0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f4: d63f0100 blr x8 + // f8: d10022b5 sub x21, x21, #0x8 + // fc: a8c17bfd ldp x29, x30, [sp], #0x10 + // 100: 14000000 b 0x100 <_JIT_ENTRY+0x100> + // 0000000000000100: R_AARCH64_JUMP26 _JIT_CONTINUE + // 104: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000104: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 108: aa1303e0 mov x0, x19 + // 10c: f9400108 ldr x8, [x8] + // 000000000000010c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 110: d63f0100 blr x8 + // 114: d10022b5 sub x21, x21, #0x8 + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c <_JIT_ENTRY+0x11c> + // 000000000000011c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[288] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0xe8, 0x03, 0x28, 0x2a, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x20, 0x01, 0xf8, 0x37, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x04, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe0, 0x01, 0x00, 0x34, + 0x08, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x69, 0x06, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x01, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x23, 0x0d, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x01, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "'%.200s' object is not a mapping\x00" + // 21: 00 00 00 00 00 00 00 + // 28: OPARG + // 30: &PyDict_Update+0x0 + // 38: &PyExc_AttributeError+0x0 + // 40: &_PyErr_ExceptionMatches+0x0 + // 48: &PyExc_TypeError+0x0 + // 50: &_PyErr_Format+0x0 + // 58: &_Py_Dealloc+0x0 + const unsigned char data_body[96] = { + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, instruction->oparg); + patch_64(data + 0x30, (uintptr_t)&PyDict_Update); + patch_64(data + 0x38, (uintptr_t)&PyExc_AttributeError); + patch_64(data + 0x40, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x48, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x50, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x58, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0xc, (uintptr_t)data + 0x28); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x30); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x38); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x38); + patch_aarch64_33rx(code + 0x78, (uintptr_t)data + 0x40); + patch_aarch64_21rx(code + 0x90, (uintptr_t)data + 0x48); + patch_aarch64_21r(code + 0x94, (uintptr_t)data); + patch_aarch64_12(code + 0x98, (uintptr_t)data); + patch_aarch64_12x(code + 0x9c, (uintptr_t)data + 0x48); + patch_aarch64_21rx(code + 0xb0, (uintptr_t)data + 0x50); + patch_aarch64_12x(code + 0xb8, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0xe4, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0xe8, (uintptr_t)data + 0x58); + patch_aarch64_12x(code + 0xf0, (uintptr_t)data + 0x58); + patch_aarch64_26r(code + 0x100, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x104, (uintptr_t)data + 0x58); + patch_aarch64_12x(code + 0x10c, (uintptr_t)data + 0x58); + patch_aarch64_26r(code + 0x11c, state->instruction_starts[instruction->error_target]); +} + +void +emit__END_FOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_FOR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea0 ldr x0, [x21, #-0x8]! + // 4: f9002295 str x21, [x20, #0x40] + // 8: b9400008 ldr w8, [x0] + // c: 37f80088 tbnz w8, #0x1f, 0x1c <_JIT_ENTRY+0x1c> + // 10: 71000508 subs w8, w8, #0x1 + // 14: b9000008 str w8, [x0] + // 18: 54000080 b.eq 0x28 <_JIT_ENTRY+0x28> + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 30: 910003fd mov x29, sp + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 38: d63f0100 blr x8 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: f9402295 ldr x21, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[72] = { + 0xa0, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_12x(code + 0x34, (uintptr_t)data); +} + +void +emit__END_SEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_SEND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f3 mov x19, x21 + // 4: f85f8eb7 ldr x23, [x21, #-0x8]! + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: b9400008 ldr w8, [x0] + // 10: 37f80088 tbnz w8, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 14: 71000508 subs w8, w8, #0x1 + // 18: b9000008 str w8, [x0] + // 1c: 54000060 b.eq 0x28 <_JIT_ENTRY+0x28> + // 20: f81f0277 stur x23, [x19, #-0x10] + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 30: 910003fd mov x29, sp + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 38: d63f0100 blr x8 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: f81f0277 stur x23, [x19, #-0x10] + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[72] = { + 0xf3, 0x03, 0x15, 0xaa, 0xb7, 0x8e, 0x5f, 0xf8, + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x60, 0x00, 0x00, 0x54, + 0x77, 0x02, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x77, 0x02, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data); + patch_aarch64_12x(code + 0x34, (uintptr_t)data); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ERROR_POP_N( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ERROR_POP_N.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 4: aa1f03e0 mov x0, xzr + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // c: f9008ac8 str x8, [x22, #0x110] + // 10: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 18: f9400289 ldr x9, [x20] + // 1c: 8b284528 add x8, x9, w8, uxtw #1 + // 20: 91034108 add x8, x8, #0xd0 + // 24: a903d688 stp x8, x21, [x20, #0x38] + // 28: d65f03c0 ret + // 2c: 00 00 00 00 + const unsigned char code_body[48] = { + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x1f, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0xc8, 0x8a, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x89, 0x02, 0x40, 0xf9, 0x28, 0x45, 0x28, 0x8b, + 0x08, 0x41, 0x03, 0x91, 0x88, 0xd6, 0x03, 0xa9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + }; + // 0: EXECUTOR + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data + 0x8); +} + +void +emit__EXIT_INIT_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_INIT_CHECK.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 8: f85f8d09 ldr x9, [x8, #-0x8]! + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 10: eb0a013f cmp x9, x10 + // 14: 54000240 b.eq 0x5c <_JIT_ENTRY+0x5c> + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // 20: 90000001 adrp x1, 0x0 <_JIT_ENTRY> + // 0000000000000020: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 24: 91000021 add x1, x1, #0x0 + // 0000000000000024: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 28: f9400108 ldr x8, [x8] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // 2c: f9400529 ldr x9, [x9, #0x8] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 910003fd mov x29, sp + // 38: f9400100 ldr x0, [x8] + // 3c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000003c: R_AARCH64_ADR_GOT_PAGE PyErr_Format + // 40: f9400d22 ldr x2, [x9, #0x18] + // 44: f9400108 ldr x8, [x8] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC PyErr_Format + // 48: d63f0100 blr x8 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 <_JIT_ENTRY+0x58> + // 0000000000000058: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 5c: aa0803f5 mov x21, x8 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[96] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x8d, 0x5f, 0xf8, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x40, 0x02, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x01, 0x00, 0x00, 0x90, 0x21, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x05, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x01, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x22, 0x0d, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x08, 0xaa, + }; + // 0: "__init__() should return None, not '%.200s'\x00" + // 2c: 00 00 00 00 + // 30: &_Py_NoneStruct+0x0 + // 38: &PyExc_TypeError+0x0 + // 40: &PyErr_Format+0x0 + const unsigned char data_body[72] = { + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x5f, + 0x28, 0x29, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x27, 0x25, 0x2e, 0x32, 0x30, + 0x30, 0x73, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x38, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x40, (uintptr_t)&PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x30); + patch_aarch64_12x(code + 0xc, (uintptr_t)data + 0x30); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x38); + patch_aarch64_21r(code + 0x20, (uintptr_t)data); + patch_aarch64_12(code + 0x24, (uintptr_t)data); + patch_aarch64_12x(code + 0x28, (uintptr_t)data + 0x38); + patch_aarch64_21rx(code + 0x3c, (uintptr_t)data + 0x40); + patch_aarch64_12x(code + 0x44, (uintptr_t)data + 0x40); + patch_aarch64_26r(code + 0x58, state->instruction_starts[instruction->error_target]); +} + +void +emit__EXIT_TRACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_TRACE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 90000017 adrp x23, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // c: 910043fd add x29, sp, #0x10 + // 10: f94002f7 ldr x23, [x23] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 14: f9400298 ldr x24, [x20] + // 18: f94006e0 ldr x0, [x23, #0x8] + // 1c: b94002f3 ldr w19, [x23] + // 20: b4000800 cbz x0, 0x120 <_JIT_ENTRY+0x120> + // 24: 39408808 ldrb w8, [x0, #0x22] + // 28: 37000608 tbnz w8, #0x0, 0xe8 <_JIT_ENTRY+0xe8> + // 2c: 529fff88 mov w8, #0xfffc // =65532 + // 30: f9002295 str x21, [x20, #0x40] + // 34: 79000ae8 strh w8, [x23, #0x4] + // 38: f90006ff str xzr, [x23, #0x8] + // 3c: b9400008 ldr w8, [x0] + // 40: 37f806c8 tbnz w8, #0x1f, 0x118 <_JIT_ENTRY+0x118> + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000008 str w8, [x0] + // 4c: 54000081 b.ne 0x5c <_JIT_ENTRY+0x5c> + // 50: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: d63f0100 blr x8 + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 60: f94006e0 ldr x0, [x23, #0x8] + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: f9008ac8 str x8, [x22, #0x110] + // 74: b5000400 cbnz x0, 0xf4 <_JIT_ENTRY+0xf4> + // 78: 79400af9 ldrh w25, [x23, #0x4] + // 7c: 8b130708 add x8, x24, x19, lsl #1 + // 80: 71003f3f cmp w25, #0xf + // 84: 91034113 add x19, x8, #0xd0 + // 88: 540005c2 b.hs 0x140 <_JIT_ENTRY+0x140> + // 8c: 39400268 ldrb w8, [x19] + // 90: 7103fd1f cmp w8, #0xff + // 94: 54000640 b.eq 0x15c <_JIT_ENTRY+0x15c> + // 98: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000098: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 9c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _PyOptimizer_Optimize + // a0: 910023e2 add x2, sp, #0x8 + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // a8: f9002295 str x21, [x20, #0x40] + // ac: aa1403e0 mov x0, x20 + // b0: aa1303e1 mov x1, x19 + // b4: 39408908 ldrb w8, [x8, #0x22] + // b8: f9400129 ldr x9, [x9] + // 00000000000000b8: R_AARCH64_LD64_GOT_LO12_NC _PyOptimizer_Optimize + // bc: 53027d08 lsr w8, w8, #2 + // c0: 11000503 add w3, w8, #0x1 + // c4: d63f0120 blr x9 + // c8: f9402295 ldr x21, [x20, #0x40] + // cc: 7100001f cmp w0, #0x0 + // d0: f900229f str xzr, [x20, #0x40] + // d4: 540005cd b.le 0x18c <_JIT_ENTRY+0x18c> + // d8: f94007e0 ldr x0, [sp, #0x8] + // dc: 529fff88 mov w8, #0xfffc // =65532 + // e0: 79000ae8 strh w8, [x23, #0x4] + // e4: 14000026 b 0x17c <_JIT_ENTRY+0x17c> + // e8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // ec: f9400108 ldr x8, [x8] + // 00000000000000ec: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // f0: f9008ac8 str x8, [x22, #0x110] + // f4: b9400008 ldr w8, [x0] + // f8: 37f80088 tbnz w8, #0x1f, 0x108 <_JIT_ENTRY+0x108> + // fc: 11000508 add w8, w8, #0x1 + // 100: b9000008 str w8, [x0] + // 104: f94006e0 ldr x0, [x23, #0x8] + // 108: a9417bfd ldp x29, x30, [sp, #0x10] + // 10c: f9403c00 ldr x0, [x0, #0x78] + // 110: 910083ff add sp, sp, #0x20 + // 114: d61f0000 br x0 + // 118: f9402295 ldr x21, [x20, #0x40] + // 11c: f900229f str xzr, [x20, #0x40] + // 120: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000120: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // 124: f9400108 ldr x8, [x8] + // 0000000000000124: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // 128: f9008ac8 str x8, [x22, #0x110] + // 12c: 79400af9 ldrh w25, [x23, #0x4] + // 130: 8b130708 add x8, x24, x19, lsl #1 + // 134: 71003f3f cmp w25, #0xf + // 138: 91034113 add x19, x8, #0xd0 + // 13c: 54fffa83 b.lo 0x8c <_JIT_ENTRY+0x8c> + // 140: 51004328 sub w8, w25, #0x10 + // 144: f9002295 str x21, [x20, #0x40] + // 148: 79000ae8 strh w8, [x23, #0x4] + // 14c: a9417bfd ldp x29, x30, [sp, #0x10] + // 150: aa1303e0 mov x0, x19 + // 154: 910083ff add sp, sp, #0x20 + // 158: d65f03c0 ret + // 15c: f9404f08 ldr x8, [x24, #0x98] + // 160: 39400669 ldrb w9, [x19, #0x1] + // 164: 8b090d08 add x8, x8, x9, lsl #3 + // 168: f9400500 ldr x0, [x8, #0x8] + // 16c: b9400008 ldr w8, [x0] + // 170: 37f80068 tbnz w8, #0x1f, 0x17c <_JIT_ENTRY+0x17c> + // 174: 11000508 add w8, w8, #0x1 + // 178: b9000008 str w8, [x0] + // 17c: f90006e0 str x0, [x23, #0x8] + // 180: b9400008 ldr w8, [x0] + // 184: 36fffbc8 tbz w8, #0x1f, 0xfc <_JIT_ENTRY+0xfc> + // 188: 17ffffe0 b 0x108 <_JIT_ENTRY+0x108> + // 18c: 71002f3f cmp w25, #0xb + // 190: 54000108 b.hi 0x1b0 <_JIT_ENTRY+0x1b0> + // 194: 52800048 mov w8, #0x2 // =2 + // 198: 11000729 add w9, w25, #0x1 + // 19c: 1ad92108 lsl w8, w8, w25 + // 1a0: 531c6d08 lsl w8, w8, #4 + // 1a4: 51004108 sub w8, w8, #0x10 + // 1a8: 2a090108 orr w8, w8, w9 + // 1ac: 14000002 b 0x1b4 <_JIT_ENTRY+0x1b4> + // 1b0: 529fff88 mov w8, #0xfffc // =65532 + // 1b4: 7100001f cmp w0, #0x0 + // 1b8: 79000ae8 strh w8, [x23, #0x4] + // 1bc: 9a9f0273 csel x19, x19, xzr, eq + // 1c0: f9002295 str x21, [x20, #0x40] + // 1c4: a9417bfd ldp x29, x30, [sp, #0x10] + // 1c8: aa1303e0 mov x0, x19 + // 1cc: 910083ff add sp, sp, #0x20 + // 1d0: d65f03c0 ret + // 1d4: 00 00 00 00 + const unsigned char code_body[472] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0x17, 0x00, 0x00, 0x90, 0xfd, 0x43, 0x00, 0x91, + 0xf7, 0x02, 0x40, 0xf9, 0x98, 0x02, 0x40, 0xf9, + 0xe0, 0x06, 0x40, 0xf9, 0xf3, 0x02, 0x40, 0xb9, + 0x00, 0x08, 0x00, 0xb4, 0x08, 0x88, 0x40, 0x39, + 0x08, 0x06, 0x00, 0x37, 0x88, 0xff, 0x9f, 0x52, + 0x95, 0x22, 0x00, 0xf9, 0xe8, 0x0a, 0x00, 0x79, + 0xff, 0x06, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0xc8, 0x06, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x06, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0x00, 0x04, 0x00, 0xb5, + 0xf9, 0x0a, 0x40, 0x79, 0x08, 0x07, 0x13, 0x8b, + 0x3f, 0x3f, 0x00, 0x71, 0x13, 0x41, 0x03, 0x91, + 0xc2, 0x05, 0x00, 0x54, 0x68, 0x02, 0x40, 0x39, + 0x1f, 0xfd, 0x03, 0x71, 0x40, 0x06, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0xe2, 0x23, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x89, 0x40, 0x39, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x7d, 0x02, 0x53, + 0x03, 0x05, 0x00, 0x11, 0x20, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x1f, 0x00, 0x00, 0x71, + 0x9f, 0x22, 0x00, 0xf9, 0xcd, 0x05, 0x00, 0x54, + 0xe0, 0x07, 0x40, 0xf9, 0x88, 0xff, 0x9f, 0x52, + 0xe8, 0x0a, 0x00, 0x79, 0x26, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x08, 0x00, 0x00, 0xb9, 0xe0, 0x06, 0x40, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0x00, 0x3c, 0x40, 0xf9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x1f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xc8, 0x8a, 0x00, 0xf9, 0xf9, 0x0a, 0x40, 0x79, + 0x08, 0x07, 0x13, 0x8b, 0x3f, 0x3f, 0x00, 0x71, + 0x13, 0x41, 0x03, 0x91, 0x83, 0xfa, 0xff, 0x54, + 0x28, 0x43, 0x00, 0x51, 0x95, 0x22, 0x00, 0xf9, + 0xe8, 0x0a, 0x00, 0x79, 0xfd, 0x7b, 0x41, 0xa9, + 0xe0, 0x03, 0x13, 0xaa, 0xff, 0x83, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x08, 0x4f, 0x40, 0xf9, + 0x69, 0x06, 0x40, 0x39, 0x08, 0x0d, 0x09, 0x8b, + 0x00, 0x05, 0x40, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x08, 0x00, 0x00, 0xb9, 0xe0, 0x06, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0xc8, 0xfb, 0xff, 0x36, + 0xe0, 0xff, 0xff, 0x17, 0x3f, 0x2f, 0x00, 0x71, + 0x08, 0x01, 0x00, 0x54, 0x48, 0x00, 0x80, 0x52, + 0x29, 0x07, 0x00, 0x11, 0x08, 0x21, 0xd9, 0x1a, + 0x08, 0x6d, 0x1c, 0x53, 0x08, 0x41, 0x00, 0x51, + 0x08, 0x01, 0x09, 0x2a, 0x02, 0x00, 0x00, 0x14, + 0x88, 0xff, 0x9f, 0x52, 0x1f, 0x00, 0x00, 0x71, + 0xe8, 0x0a, 0x00, 0x79, 0x73, 0x02, 0x9f, 0x9a, + 0x95, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xe0, 0x03, 0x13, 0xaa, 0xff, 0x83, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: EXECUTOR + // 18: &_PyOptimizer_Optimize+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)executor); + patch_64(data + 0x18, (uintptr_t)&_PyOptimizer_Optimize); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x50, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x98, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xb8, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0xe8, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x120, (uintptr_t)data + 0x10); +} + +void +emit__EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 12003d0b and w11, w8, #0xffff + // c: 12800028 mov w8, #-0x2 // =-2 + // 10: 4b0b0108 sub w8, w8, w11 + // 14: 2a2b03eb mvn w11, w11 + // 18: f868daa9 ldr x9, [x21, w8, sxtw #3] + // 1c: f9400d2a ldr x10, [x9, #0x18] + // 20: b940014c ldr w12, [x10] + // 24: 37f8006c tbnz w12, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // 28: 1100058c add w12, w12, #0x1 + // 2c: b900014c str w12, [x10] + // 30: f82bdaaa str x10, [x21, w11, sxtw #3] + // 34: f9400929 ldr x9, [x9, #0x10] + // 38: f868daa0 ldr x0, [x21, w8, sxtw #3] + // 3c: b940012a ldr w10, [x9] + // 40: 37f8006a tbnz w10, #0x1f, 0x4c <_JIT_ENTRY+0x4c> + // 44: 1100054a add w10, w10, #0x1 + // 48: b900012a str w10, [x9] + // 4c: f828daa9 str x9, [x21, w8, sxtw #3] + // 50: f9002295 str x21, [x20, #0x40] + // 54: b9400008 ldr w8, [x0] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000008 str w8, [x0] + // 64: 54000080 b.eq 0x74 <_JIT_ENTRY+0x74> + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 7c: 910003fd mov x29, sp + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0b, 0x3d, 0x00, 0x12, 0x28, 0x00, 0x80, 0x12, + 0x08, 0x01, 0x0b, 0x4b, 0xeb, 0x03, 0x2b, 0x2a, + 0xa9, 0xda, 0x68, 0xf8, 0x2a, 0x0d, 0x40, 0xf9, + 0x4c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x4c, 0x01, 0x00, 0xb9, + 0xaa, 0xda, 0x2b, 0xf8, 0x29, 0x09, 0x40, 0xf9, + 0xa0, 0xda, 0x68, 0xf8, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xda, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD_KW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 9280002c mov x12, #-0x2 // =-2 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: 92403d0a and x10, x8, #0xffff + // 10: 92800048 mov x8, #-0x3 // =-3 + // 14: cb0a0108 sub x8, x8, x10 + // 18: cb0a018a sub x10, x12, x10 + // 1c: f8687aa0 ldr x0, [x21, x8, lsl #3] + // 20: f9400c09 ldr x9, [x0, #0x18] + // 24: b940012b ldr w11, [x9] + // 28: 37f8006b tbnz w11, #0x1f, 0x34 <_JIT_ENTRY+0x34> + // 2c: 1100056b add w11, w11, #0x1 + // 30: b900012b str w11, [x9] + // 34: f82a7aa9 str x9, [x21, x10, lsl #3] + // 38: f9400809 ldr x9, [x0, #0x10] + // 3c: b940012a ldr w10, [x9] + // 40: 37f8006a tbnz w10, #0x1f, 0x4c <_JIT_ENTRY+0x4c> + // 44: 1100054a add w10, w10, #0x1 + // 48: b900012a str w10, [x9] + // 4c: f8287aa9 str x9, [x21, x8, lsl #3] + // 50: f9002295 str x21, [x20, #0x40] + // 54: b9400008 ldr w8, [x0] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000008 str w8, [x0] + // 64: 54000080 b.eq 0x74 <_JIT_ENTRY+0x74> + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 7c: 910003fd mov x29, sp + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0x08, 0x00, 0x00, 0x90, 0x2c, 0x00, 0x80, 0x92, + 0x08, 0x01, 0x40, 0xf9, 0x0a, 0x3d, 0x40, 0x92, + 0x48, 0x00, 0x80, 0x92, 0x08, 0x01, 0x0a, 0xcb, + 0x8a, 0x01, 0x0a, 0xcb, 0xa0, 0x7a, 0x68, 0xf8, + 0x09, 0x0c, 0x40, 0xf9, 0x2b, 0x01, 0x40, 0xb9, + 0x6b, 0x00, 0xf8, 0x37, 0x6b, 0x05, 0x00, 0x11, + 0x2b, 0x01, 0x00, 0xb9, 0xa9, 0x7a, 0x2a, 0xf8, + 0x09, 0x08, 0x40, 0xf9, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0x7a, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__FATAL_ERROR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FATAL_ERROR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_FatalErrorFunc + // 8: 90000000 adrp x0, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // c: 91000000 add x0, x0, #0x0 + // 000000000000000c: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _Py_FatalErrorFunc + // 14: 90000001 adrp x1, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1+0xb + // 18: 91000021 add x1, x1, #0x0 + // 0000000000000018: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1+0xb + // 1c: 910003fd mov x29, sp + // 20: d63f0100 blr x8 + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x01, 0x00, 0x00, 0x90, + 0x21, 0x00, 0x00, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x01, 0x3f, 0xd6, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '_JIT_ENTRY\x00Fatal error uop executed.\x00' + // 25: 00 00 00 + // 28: &_Py_FatalErrorFunc+0x0 + const unsigned char data_body[48] = { + 0x5f, 0x4a, 0x49, 0x54, 0x5f, 0x45, 0x4e, 0x54, + 0x52, 0x59, 0x00, 0x46, 0x61, 0x74, 0x61, 0x6c, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x75, + 0x6f, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_FatalErrorFunc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x28); + patch_aarch64_21r(code + 0x8, (uintptr_t)data); + patch_aarch64_12(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data + 0x28); + patch_aarch64_21r(code + 0x14, (uintptr_t)data + 0xb); + patch_aarch64_12(code + 0x18, (uintptr_t)data + 0xb); +} + +void +emit__FORMAT_SIMPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_SIMPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: aa1503e8 mov x8, x21 + // 8: f85f8eb3 ldr x19, [x21, #-0x8]! + // c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyUnicode_Type + // 10: 910003fd mov x29, sp + // 14: f9400669 ldr x9, [x19, #0x8] + // 18: f940014a ldr x10, [x10] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Type + // 1c: eb0a013f cmp x9, x10 + // 20: 54000260 b.eq 0x6c <_JIT_ENTRY+0x6c> + // 24: f9002288 str x8, [x20, #0x40] + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE PyObject_Format + // 2c: aa1303e0 mov x0, x19 + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyObject_Format + // 34: aa1f03e1 mov x1, xzr + // 38: d63f0100 blr x8 + // 3c: f9402288 ldr x8, [x20, #0x40] + // 40: d1002108 sub x8, x8, #0x8 + // 44: f9002288 str x8, [x20, #0x40] + // 48: b9400268 ldr w8, [x19] + // 4c: 37f80088 tbnz w8, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000268 str w8, [x19] + // 58: 54000100 b.eq 0x78 <_JIT_ENTRY+0x78> + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: b40001c0 cbz x0, 0x9c <_JIT_ENTRY+0x9c> + // 68: aa0003f3 mov x19, x0 + // 6c: f80086b3 str x19, [x21], #0x8 + // 70: a8c17bfd ldp x29, x30, [sp], #0x10 + // 74: 14000000 b 0x74 <_JIT_ENTRY+0x74> + // 0000000000000074: R_AARCH64_JUMP26 _JIT_CONTINUE + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 7c: aa0003f5 mov x21, x0 + // 80: aa1303e0 mov x0, x19 + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 88: d63f0100 blr x8 + // 8c: aa1503e0 mov x0, x21 + // 90: f9402295 ldr x21, [x20, #0x40] + // 94: f900229f str xzr, [x20, #0x40] + // 98: b5fffe80 cbnz x0, 0x68 <_JIT_ENTRY+0x68> + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 <_JIT_ENTRY+0xa0> + // 00000000000000a0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // a4: 00 00 00 00 + const unsigned char code_body[168] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xe8, 0x03, 0x15, 0xaa, + 0xb3, 0x8e, 0x5f, 0xf8, 0x0a, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x69, 0x06, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0xeb, + 0x60, 0x02, 0x00, 0x54, 0x88, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0xe1, 0x03, 0x1f, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0x08, 0x21, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x00, 0x01, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xc0, 0x01, 0x00, 0xb4, + 0xf3, 0x03, 0x00, 0xaa, 0xb3, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0xfe, 0xff, 0xb5, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: &PyObject_Format+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, (uintptr_t)&PyObject_Format); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x74, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x78, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x84, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); +} + +void +emit__FORMAT_WITH_SPEC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_WITH_SPEC.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f4eb8 ldp x24, x19, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyObject_Format + // c: f9002295 str x21, [x20, #0x40] + // 10: 910003fd mov x29, sp + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyObject_Format + // 18: aa1803e0 mov x0, x24 + // 1c: aa1303e1 mov x1, x19 + // 20: d63f0100 blr x8 + // 24: f9402299 ldr x25, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: aa0003f7 mov x23, x0 + // 30: b9400308 ldr w8, [x24] + // 34: 37f80108 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b9000308 str w8, [x24] + // 40: 540000a1 b.ne 0x54 <_JIT_ENTRY+0x54> + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 48: aa1803e0 mov x0, x24 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 50: d63f0100 blr x8 + // 54: b9400268 ldr w8, [x19] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000268 str w8, [x19] + // 64: 540000c0 b.eq 0x7c <_JIT_ENTRY+0x7c> + // 68: b4000157 cbz x23, 0x90 <_JIT_ENTRY+0x90> + // 6c: d1002335 sub x21, x25, #0x8 + // 70: f81f0337 stur x23, [x25, #-0x10] + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: 14000000 b 0x78 <_JIT_ENTRY+0x78> + // 0000000000000078: R_AARCH64_JUMP26 _JIT_CONTINUE + // 7c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000007c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 80: aa1303e0 mov x0, x19 + // 84: f9400108 ldr x8, [x8] + // 0000000000000084: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 88: d63f0100 blr x8 + // 8c: b5ffff17 cbnz x23, 0x6c <_JIT_ENTRY+0x6c> + // 90: d1004335 sub x21, x25, #0x10 + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 9c: 00 00 00 00 + const unsigned char code_body[160] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb8, 0x4e, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x00, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x57, 0x01, 0x00, 0xb4, 0x35, 0x23, 0x00, 0xd1, + 0x37, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x17, 0xff, 0xff, 0xb5, + 0x35, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_Format+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Format); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x7c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x84, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x98, state->instruction_starts[instruction->error_target]); +} + +void +emit__FOR_ITER_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_GEN_FRAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyGen_Type + // 8: f9400509 ldr x9, [x8, #0x8] + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyGen_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000061 b.ne 0x20 <_JIT_ENTRY+0x20> + // 18: 39c10d09 ldrsb w9, [x8, #0x43] + // 1c: 37f80049 tbnz w9, #0x1f, 0x24 <_JIT_ENTRY+0x24> + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 28: f9404509 ldr x9, [x8, #0x88] + // 2c: 9100a10b add x11, x8, #0x28 + // 30: f940014a ldr x10, [x10] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 34: f900012a str x10, [x9] + // 38: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 40: f9403eca ldr x10, [x22, #0x78] + // 44: f9003ecb str x11, [x22, #0x78] + // 48: f940450b ldr x11, [x8, #0x88] + // 4c: 39010d1f strb wzr, [x8, #0x43] + // 50: 11000929 add w9, w9, #0x2 + // 54: f900190a str x10, [x8, #0x30] + // 58: 9101210a add x10, x8, #0x48 + // 5c: 79009289 strh w9, [x20, #0x48] + // 60: 91002169 add x9, x11, #0x8 + // 64: f9002914 str x20, [x8, #0x50] + // 68: f9004509 str x9, [x8, #0x88] + // 6c: f80086aa str x10, [x21], #0x8 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[112] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x0d, 0xc1, 0x39, 0x49, 0x00, 0xf8, 0x37, + 0x00, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x45, 0x40, 0xf9, 0x0b, 0xa1, 0x00, 0x91, + 0x4a, 0x01, 0x40, 0xf9, 0x2a, 0x01, 0x00, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0xca, 0x3e, 0x40, 0xf9, 0xcb, 0x3e, 0x00, 0xf9, + 0x0b, 0x45, 0x40, 0xf9, 0x1f, 0x0d, 0x01, 0x39, + 0x29, 0x09, 0x00, 0x11, 0x0a, 0x19, 0x00, 0xf9, + 0x0a, 0x21, 0x01, 0x91, 0x89, 0x92, 0x00, 0x79, + 0x69, 0x21, 0x00, 0x91, 0x14, 0x29, 0x00, 0xf9, + 0x09, 0x45, 0x00, 0xf9, 0xaa, 0x86, 0x00, 0xf8, + }; + // 0: &PyGen_Type+0x0 + // 8: &_Py_NoneStruct+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyGen_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x10); +} + +void +emit__FOR_ITER_TIER_TWO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_TIER_TWO.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82a0 ldur x0, [x21, #-0x8] + // 8: 910003fd mov x29, sp + // c: f9002295 str x21, [x20, #0x40] + // 10: f9400408 ldr x8, [x0, #0x8] + // 14: f9407108 ldr x8, [x8, #0xe0] + // 18: d63f0100 blr x8 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: b4000080 cbz x0, 0x34 <_JIT_ENTRY+0x34> + // 28: f80086a0 str x0, [x21], #0x8 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: f9403ac8 ldr x8, [x22, #0x70] + // 38: b4000368 cbz x8, 0xa4 <_JIT_ENTRY+0xa4> + // 3c: f9400508 ldr x8, [x8, #0x8] + // 40: b4000328 cbz x8, 0xa4 <_JIT_ENTRY+0xa4> + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE PyExc_StopIteration + // 48: aa1603e0 mov x0, x22 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC PyExc_StopIteration + // 50: f9002295 str x21, [x20, #0x40] + // 54: f9400101 ldr x1, [x8] + // 58: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000058: R_AARCH64_ADR_GOT_PAGE _PyErr_ExceptionMatches + // 5c: f9400108 ldr x8, [x8] + // 000000000000005c: R_AARCH64_LD64_GOT_LO12_NC _PyErr_ExceptionMatches + // 60: d63f0100 blr x8 + // 64: f9402295 ldr x21, [x20, #0x40] + // 68: f900229f str xzr, [x20, #0x40] + // 6c: 34000200 cbz w0, 0xac <_JIT_ENTRY+0xac> + // 70: f9002295 str x21, [x20, #0x40] + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _PyEval_MonitorRaise + // 78: f9401e82 ldr x2, [x20, #0x38] + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_MonitorRaise + // 80: aa1603e0 mov x0, x22 + // 84: aa1403e1 mov x1, x20 + // 88: d63f0100 blr x8 + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE _PyErr_Clear + // 90: aa1603e0 mov x0, x22 + // 94: f9400108 ldr x8, [x8] + // 0000000000000094: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Clear + // 98: d63f0100 blr x8 + // 9c: f9402295 ldr x21, [x20, #0x40] + // a0: f900229f str xzr, [x20, #0x40] + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a8: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // ac: a8c17bfd ldp x29, x30, [sp], #0x10 + // b0: 14000000 b 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000b0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // b4: 00 00 00 00 + const unsigned char code_body[184] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa0, 0x82, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x04, 0x40, 0xf9, 0x08, 0x71, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xc8, 0x3a, 0x40, 0xf9, + 0x68, 0x03, 0x00, 0xb4, 0x08, 0x05, 0x40, 0xf9, + 0x28, 0x03, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x01, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x02, 0x00, 0x34, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x82, 0x1e, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x14, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyExc_StopIteration+0x0 + // 8: &_PyErr_ExceptionMatches+0x0 + // 10: &_PyEval_MonitorRaise+0x0 + // 18: &_PyErr_Clear+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyExc_StopIteration); + patch_64(data + 0x8, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x10, (uintptr_t)&_PyEval_MonitorRaise); + patch_64(data + 0x18, (uintptr_t)&_PyErr_Clear); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data); + patch_aarch64_33rx(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x8c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x94, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xa8, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0xb0, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_AITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AITER.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: 910003fd mov x29, sp + // c: f9400668 ldr x8, [x19, #0x8] + // 10: f9402909 ldr x9, [x8, #0x50] + // 14: b40002e9 cbz x9, 0x70 <_JIT_ENTRY+0x70> + // 18: f9400529 ldr x9, [x9, #0x8] + // 1c: b40002a9 cbz x9, 0x70 <_JIT_ENTRY+0x70> + // 20: aa1303e0 mov x0, x19 + // 24: f9002295 str x21, [x20, #0x40] + // 28: d63f0120 blr x9 + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: aa0003f7 mov x23, x0 + // 38: b9400268 ldr w8, [x19] + // 3c: 37f80088 tbnz w8, #0x1f, 0x4c <_JIT_ENTRY+0x4c> + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000268 str w8, [x19] + // 48: 54000760 b.eq 0x134 <_JIT_ENTRY+0x134> + // 4c: b4000377 cbz x23, 0xb8 <_JIT_ENTRY+0xb8> + // 50: f94006e8 ldr x8, [x23, #0x8] + // 54: f9402909 ldr x9, [x8, #0x50] + // 58: b4000369 cbz x9, 0xc4 <_JIT_ENTRY+0xc4> + // 5c: f9400929 ldr x9, [x9, #0x10] + // 60: b4000329 cbz x9, 0xc4 <_JIT_ENTRY+0xc4> + // 64: f81f82b7 stur x23, [x21, #-0x8] + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 70: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // 74: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 78: 91000042 add x2, x2, #0x0 + // 0000000000000078: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 7c: f9400129 ldr x9, [x9] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // 80: f9400d03 ldr x3, [x8, #0x18] + // 84: f9002295 str x21, [x20, #0x40] + // 88: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // 8c: aa1603e0 mov x0, x22 + // 90: f9400121 ldr x1, [x9] + // 94: f9400108 ldr x8, [x8] + // 0000000000000094: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // 98: d63f0100 blr x8 + // 9c: f9402295 ldr x21, [x20, #0x40] + // a0: f900229f str xzr, [x20, #0x40] + // a4: b9400268 ldr w8, [x19] + // a8: 37f80088 tbnz w8, #0x1f, 0xb8 <_JIT_ENTRY+0xb8> + // ac: 71000508 subs w8, w8, #0x1 + // b0: b9000268 str w8, [x19] + // b4: 54000320 b.eq 0x118 <_JIT_ENTRY+0x118> + // b8: d10022b5 sub x21, x21, #0x8 + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000c0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // c4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // c8: d10022aa sub x10, x21, #0x8 + // cc: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1+0x41 + // d0: 91000042 add x2, x2, #0x0 + // 00000000000000d0: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1+0x41 + // d4: f9400129 ldr x9, [x9] + // 00000000000000d4: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // d8: f9400d03 ldr x3, [x8, #0x18] + // dc: f900228a str x10, [x20, #0x40] + // e0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e0: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // e4: aa1603e0 mov x0, x22 + // e8: f9400121 ldr x1, [x9] + // ec: f9400108 ldr x8, [x8] + // 00000000000000ec: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // f0: d63f0100 blr x8 + // f4: b94002e8 ldr w8, [x23] + // f8: 37f80088 tbnz w8, #0x1f, 0x108 <_JIT_ENTRY+0x108> + // fc: 71000508 subs w8, w8, #0x1 + // 100: b90002e8 str w8, [x23] + // 104: 54000240 b.eq 0x14c <_JIT_ENTRY+0x14c> + // 108: f9402295 ldr x21, [x20, #0x40] + // 10c: f900229f str xzr, [x20, #0x40] + // 110: a8c17bfd ldp x29, x30, [sp], #0x10 + // 114: 14000000 b 0x114 <_JIT_ENTRY+0x114> + // 0000000000000114: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 118: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000118: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 11c: aa1303e0 mov x0, x19 + // 120: f9400108 ldr x8, [x8] + // 0000000000000120: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 124: d63f0100 blr x8 + // 128: d10022b5 sub x21, x21, #0x8 + // 12c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 130: 14000000 b 0x130 <_JIT_ENTRY+0x130> + // 0000000000000130: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 134: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000134: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 138: aa1303e0 mov x0, x19 + // 13c: f9400108 ldr x8, [x8] + // 000000000000013c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 140: d63f0100 blr x8 + // 144: b5fff877 cbnz x23, 0x50 <_JIT_ENTRY+0x50> + // 148: 17ffffdc b 0xb8 <_JIT_ENTRY+0xb8> + // 14c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000014c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 150: aa1703e0 mov x0, x23 + // 154: f9400108 ldr x8, [x8] + // 0000000000000154: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 158: d63f0100 blr x8 + // 15c: f9402295 ldr x21, [x20, #0x40] + // 160: f900229f str xzr, [x20, #0x40] + // 164: a8c17bfd ldp x29, x30, [sp], #0x10 + // 168: 14000000 b 0x168 <_JIT_ENTRY+0x168> + // 0000000000000168: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 16c: 00 00 00 00 + const unsigned char code_body[368] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0x68, 0x06, 0x40, 0xf9, + 0x09, 0x29, 0x40, 0xf9, 0xe9, 0x02, 0x00, 0xb4, + 0x29, 0x05, 0x40, 0xf9, 0xa9, 0x02, 0x00, 0xb4, + 0xe0, 0x03, 0x13, 0xaa, 0x95, 0x22, 0x00, 0xf9, + 0x20, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0xaa, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x07, 0x00, 0x54, 0x77, 0x03, 0x00, 0xb4, + 0xe8, 0x06, 0x40, 0xf9, 0x09, 0x29, 0x40, 0xf9, + 0x69, 0x03, 0x00, 0xb4, 0x29, 0x09, 0x40, 0xf9, + 0x29, 0x03, 0x00, 0xb4, 0xb7, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x09, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x29, 0x01, 0x40, 0xf9, + 0x03, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x21, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x20, 0x03, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0xaa, 0x22, 0x00, 0xd1, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x29, 0x01, 0x40, 0xf9, + 0x03, 0x0d, 0x40, 0xf9, 0x8a, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x21, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe8, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0x40, 0x02, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x77, 0xf8, 0xff, 0xb5, + 0xdc, 0xff, 0xff, 0x17, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'async for' requires an object with __aiter__ method, got %.100s\x00'async for' received an object from __aiter__ that does not implement __anext__: %.100s\x00" + // 99: 00 00 00 00 00 00 00 + // a0: &PyExc_TypeError+0x0 + // a8: &_PyErr_Format+0x0 + // b0: &_Py_Dealloc+0x0 + const unsigned char data_body[184] = { + 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x5f, 0x5f, 0x61, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x5f, 0x5f, 0x61, + 0x69, 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, + 0x3a, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0xa0, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0xa8, (uintptr_t)&_PyErr_Format); + patch_64(data + 0xb0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0xa0); + patch_aarch64_21r(code + 0x74, (uintptr_t)data); + patch_aarch64_12(code + 0x78, (uintptr_t)data); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0xa0); + patch_aarch64_21rx(code + 0x88, (uintptr_t)data + 0xa8); + patch_aarch64_12x(code + 0x94, (uintptr_t)data + 0xa8); + patch_aarch64_26r(code + 0xc0, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0xc4, (uintptr_t)data + 0xa0); + patch_aarch64_21r(code + 0xcc, (uintptr_t)data + 0x41); + patch_aarch64_12(code + 0xd0, (uintptr_t)data + 0x41); + patch_aarch64_12x(code + 0xd4, (uintptr_t)data + 0xa0); + patch_aarch64_21rx(code + 0xe0, (uintptr_t)data + 0xa8); + patch_aarch64_12x(code + 0xec, (uintptr_t)data + 0xa8); + patch_aarch64_26r(code + 0x114, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x118, (uintptr_t)data + 0xb0); + patch_aarch64_12x(code + 0x120, (uintptr_t)data + 0xb0); + patch_aarch64_26r(code + 0x130, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x134, (uintptr_t)data + 0xb0); + patch_aarch64_12x(code + 0x13c, (uintptr_t)data + 0xb0); + patch_aarch64_21rx(code + 0x14c, (uintptr_t)data + 0xb0); + patch_aarch64_12x(code + 0x154, (uintptr_t)data + 0xb0); + patch_aarch64_26r(code + 0x168, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_ANEXT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ANEXT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82a0 ldur x0, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE _PyEval_GetANext + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _PyEval_GetANext + // 14: 910003fd mov x29, sp + // 18: d63f0100 blr x8 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: b4000080 cbz x0, 0x34 <_JIT_ENTRY+0x34> + // 28: f80086a0 str x0, [x21], #0x8 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa0, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_GetANext+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_GetANext); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_AWAITABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AWAITABLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyEval_GetAwaitable + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f85f82b3 ldur x19, [x21, #-0x8] + // 18: f9002295 str x21, [x20, #0x40] + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_GetAwaitable + // 20: 12003d01 and w1, w8, #0xffff + // 24: aa1303e0 mov x0, x19 + // 28: d63f0120 blr x9 + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: b9400268 ldr w8, [x19] + // 38: 37f80088 tbnz w8, #0x1f, 0x48 <_JIT_ENTRY+0x48> + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b9000268 str w8, [x19] + // 44: 540000a0 b.eq 0x58 <_JIT_ENTRY+0x58> + // 48: b4000160 cbz x0, 0x74 <_JIT_ENTRY+0x74> + // 4c: f81f82a0 stur x0, [x21, #-0x8] + // 50: a8c17bfd ldp x29, x30, [sp], #0x10 + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + // 58: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000058: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 5c: aa0003f7 mov x23, x0 + // 60: aa1303e0 mov x0, x19 + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 68: d63f0100 blr x8 + // 6c: aa1703e0 mov x0, x23 + // 70: b5fffef7 cbnz x23, 0x4c <_JIT_ENTRY+0x4c> + // 74: d10022b5 sub x21, x21, #0x8 + // 78: a8c17bfd ldp x29, x30, [sp], #0x10 + // 7c: 14000000 b 0x7c <_JIT_ENTRY+0x7c> + // 000000000000007c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[128] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x01, 0x3d, 0x00, 0x12, 0xe0, 0x03, 0x13, 0xaa, + 0x20, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x60, 0x01, 0x00, 0xb4, 0xa0, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0xf7, 0xfe, 0xff, 0xb5, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyEval_GetAwaitable+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_GetAwaitable); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x58, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x7c, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ITER.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyObject_GetIter + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyObject_GetIter + // 14: 910003fd mov x29, sp + // 18: aa1303e0 mov x0, x19 + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b9400268 ldr w8, [x19] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000268 str w8, [x19] + // 38: 540000a0 b.eq 0x4c <_JIT_ENTRY+0x4c> + // 3c: b4000160 cbz x0, 0x68 <_JIT_ENTRY+0x68> + // 40: f81f82a0 stur x0, [x21, #-0x8] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: aa0003f7 mov x23, x0 + // 54: aa1303e0 mov x0, x19 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 5c: d63f0100 blr x8 + // 60: aa1703e0 mov x0, x23 + // 64: b5fffef7 cbnz x23, 0x40 <_JIT_ENTRY+0x40> + // 68: d10022b5 sub x21, x21, #0x8 + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 74: 00 00 00 00 + const unsigned char code_body[120] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x60, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0xaa, 0xf7, 0xfe, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_GetIter+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x70, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_LEN.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82a0 ldur x0, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyObject_Size + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyObject_Size + // 14: 910003fd mov x29, sp + // 18: d63f0100 blr x8 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: b7f80100 tbnz x0, #0x3f, 0x44 <_JIT_ENTRY+0x44> + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE PyLong_FromSsize_t + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC PyLong_FromSsize_t + // 30: d63f0100 blr x8 + // 34: b4000080 cbz x0, 0x44 <_JIT_ENTRY+0x44> + // 38: f80086a0 str x0, [x21], #0x8 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa0, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x01, 0xf8, 0xb7, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_Size+0x0 + // 8: &PyLong_FromSsize_t+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Size); + patch_64(data + 0x8, (uintptr_t)&PyLong_FromSsize_t); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->error_target]); +} + +void +emit__GET_YIELD_FROM_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_YIELD_FROM_ITER.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyCoro_Type + // c: 910003fd mov x29, sp + // 10: f9400668 ldr x8, [x19, #0x8] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyCoro_Type + // 18: eb09011f cmp x8, x9 + // 1c: 540002a0 b.eq 0x70 <_JIT_ENTRY+0x70> + // 20: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000020: R_AARCH64_ADR_GOT_PAGE PyGen_Type + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC PyGen_Type + // 28: eb09011f cmp x8, x9 + // 2c: 540002a0 b.eq 0x80 <_JIT_ENTRY+0x80> + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE PyObject_GetIter + // 38: aa1303e0 mov x0, x19 + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC PyObject_GetIter + // 40: d63f0100 blr x8 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: b4000380 cbz x0, 0xbc <_JIT_ENTRY+0xbc> + // 50: b9400268 ldr w8, [x19] + // 54: 37f80388 tbnz w8, #0x1f, 0xc4 <_JIT_ENTRY+0xc4> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000268 str w8, [x19] + // 60: 54000380 b.eq 0xd0 <_JIT_ENTRY+0xd0> + // 64: f81f82a0 stur x0, [x21, #-0x8] + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 70: f9400288 ldr x8, [x20] + // 74: 79406108 ldrh w8, [x8, #0x30] + // 78: 7219051f tst w8, #0x180 + // 7c: 54000080 b.eq 0x8c <_JIT_ENTRY+0x8c> + // 80: f81f82b3 stur x19, [x21, #-0x8] + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_CONTINUE + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // 90: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 94: 91000042 add x2, x2, #0x0 + // 0000000000000094: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // 9c: f9002295 str x21, [x20, #0x40] + // a0: aa1603e0 mov x0, x22 + // a4: f9400101 ldr x1, [x8] + // a8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a8: R_AARCH64_ADR_GOT_PAGE _PyErr_SetString + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _PyErr_SetString + // b0: d63f0100 blr x8 + // b4: f9402295 ldr x21, [x20, #0x40] + // b8: f900229f str xzr, [x20, #0x40] + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000c0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // c4: f81f82a0 stur x0, [x21, #-0x8] + // c8: a8c17bfd ldp x29, x30, [sp], #0x10 + // cc: 14000000 b 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000cc: R_AARCH64_JUMP26 _JIT_CONTINUE + // d0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // d4: aa0003f7 mov x23, x0 + // d8: aa1303e0 mov x0, x19 + // dc: f9400108 ldr x8, [x8] + // 00000000000000dc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // e0: d63f0100 blr x8 + // e4: f81f82b7 stur x23, [x21, #-0x8] + // e8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ec: 14000000 b 0xec <_JIT_ENTRY+0xec> + // 00000000000000ec: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[240] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xa0, 0x02, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xa0, 0x02, 0x00, 0x54, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x80, 0x03, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x03, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x80, 0x03, 0x00, 0x54, 0xa0, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x88, 0x02, 0x40, 0xf9, 0x08, 0x61, 0x40, 0x79, + 0x1f, 0x05, 0x19, 0x72, 0x80, 0x00, 0x00, 0x54, + 0xb3, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x01, 0x01, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xa0, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf7, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb7, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: "cannot 'yield from' a coroutine object in a non-coroutine generator\x00" + // 44: 00 00 00 00 + // 48: &PyCoro_Type+0x0 + // 50: &PyGen_Type+0x0 + // 58: &PyObject_GetIter+0x0 + // 60: &PyExc_TypeError+0x0 + // 68: &_PyErr_SetString+0x0 + // 70: &_Py_Dealloc+0x0 + const unsigned char data_body[120] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x27, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x48, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x50, (uintptr_t)&PyGen_Type); + patch_64(data + 0x58, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x60, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x68, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x70, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x48); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x48); + patch_aarch64_33rx(code + 0x20, (uintptr_t)data + 0x50); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x58); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x58); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x88, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x8c, (uintptr_t)data + 0x60); + patch_aarch64_21r(code + 0x90, (uintptr_t)data); + patch_aarch64_12(code + 0x94, (uintptr_t)data); + patch_aarch64_12x(code + 0x98, (uintptr_t)data + 0x60); + patch_aarch64_33rx(code + 0xa8, (uintptr_t)data + 0x68); + patch_aarch64_26r(code + 0xc0, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0xcc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xd0, (uintptr_t)data + 0x70); + patch_aarch64_12x(code + 0xdc, (uintptr_t)data + 0x70); + patch_aarch64_26r(code + 0xec, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BINARY_OP_EXTEND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 10: a97f06a0 ldp x0, x1, [x21, #-0x10] + // 14: f9002295 str x21, [x20, #0x40] + // 18: f9400508 ldr x8, [x8, #0x8] + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: 34000060 cbz w0, 0x34 <_JIT_ENTRY+0x34> + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a8c17bfd ldp x29, x30, [sp], #0x10 + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xa0, 0x06, 0x7f, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x05, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x60, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_BOTH_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyFloat_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyFloat_Type + // 10: eb08013f cmp x9, x8 + // 14: 540000a1 b.ne 0x28 <_JIT_ENTRY+0x28> + // 18: f85f82a9 ldur x9, [x21, #-0x8] + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: eb08013f cmp x9, x8 + // 24: 54000040 b.eq 0x2c <_JIT_ENTRY+0x2c> + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xa9, 0x82, 0x5f, 0xf8, 0x29, 0x05, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BOTH_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 10: eb08013f cmp x9, x8 + // 14: 540000a1 b.ne 0x28 <_JIT_ENTRY+0x28> + // 18: f85f82a9 ldur x9, [x21, #-0x8] + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: eb08013f cmp x9, x8 + // 24: 54000040 b.eq 0x2c <_JIT_ENTRY+0x2c> + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xa9, 0x82, 0x5f, 0xf8, 0x29, 0x05, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BOTH_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_UNICODE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyUnicode_Type + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Type + // 10: eb08013f cmp x9, x8 + // 14: 540000a1 b.ne 0x28 <_JIT_ENTRY+0x28> + // 18: f85f82a9 ldur x9, [x21, #-0x8] + // 1c: f9400529 ldr x9, [x9, #0x8] + // 20: eb08013f cmp x9, x8 + // 24: 54000040 b.eq 0x2c <_JIT_ENTRY+0x2c> + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xa9, 0x82, 0x5f, 0xf8, 0x29, 0x05, 0x40, 0xf9, + 0x3f, 0x01, 0x08, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyUnicode_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x28, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_BUILTINS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BUILTINS_VERSION_PUSH_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9401288 ldr x8, [x20, #0x20] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // 8: f9400509 ldr x9, [x8, #0x8] + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000121 b.ne 0x38 <_JIT_ENTRY+0x38> + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 20: b9400d09 ldr w9, [x8, #0xc] + // 24: f940014a ldr x10, [x10] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 28: 6b2a213f cmp w9, w10, uxth + // 2c: 54000061 b.ne 0x38 <_JIT_ENTRY+0x38> + // 30: f80086a8 str x8, [x21], #0x8 + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0x88, 0x12, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x21, 0x01, 0x00, 0x54, + 0x08, 0x11, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x0d, 0x40, 0xb9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x21, 0x2a, 0x6b, 0x61, 0x00, 0x00, 0x54, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_DORV_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_NO_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f85e8109 ldur x9, [x8, #-0x18] + // 8: b4000049 cbz x9, 0x10 <_JIT_ENTRY+0x10> + // c: 14000000 b 0xc <_JIT_ENTRY+0xc> + // 000000000000000c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 10: f9400509 ldr x9, [x8, #0x8] + // 14: f9401129 ldr x9, [x9, #0x20] + // 18: 8b090108 add x8, x8, x9 + // 1c: 39400d08 ldrb w8, [x8, #0x3] + // 20: 34ffff68 cbz w8, 0xc <_JIT_ENTRY+0xc> + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x81, 0x5e, 0xf8, + 0x49, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x14, + 0x09, 0x05, 0x40, 0xf9, 0x29, 0x11, 0x40, 0xf9, + 0x08, 0x01, 0x09, 0x8b, 0x08, 0x0d, 0x40, 0x39, + 0x68, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400509 ldr x9, [x8, #0x8] + // 8: f9401129 ldr x9, [x9, #0x20] + // c: 8b090108 add x8, x8, x9 + // 10: 39400d08 ldrb w8, [x8, #0x3] + // 14: 34000048 cbz w8, 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x05, 0x40, 0xf9, + 0x29, 0x11, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0x08, 0x0d, 0x40, 0x39, 0x48, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_GLOBALS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400e88 ldr x8, [x20, #0x18] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // 8: f9400509 ldr x9, [x8, #0x8] + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000101 b.ne 0x34 <_JIT_ENTRY+0x34> + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 20: b9400d08 ldr w8, [x8, #0xc] + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 28: 6b29211f cmp w8, w9, uxth + // 2c: 54000041 b.ne 0x34 <_JIT_ENTRY+0x34> + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[56] = { + 0x88, 0x0e, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x01, 0x01, 0x00, 0x54, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x0d, 0x40, 0xb9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x21, 0x29, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x34, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_GLOBALS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION_PUSH_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400e88 ldr x8, [x20, #0x18] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // 8: f9400509 ldr x9, [x8, #0x8] + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 10: eb0a013f cmp x9, x10 + // 14: 54000121 b.ne 0x38 <_JIT_ENTRY+0x38> + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 20: b9400d09 ldr w9, [x8, #0xc] + // 24: f940014a ldr x10, [x10] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 28: 6b2a213f cmp w9, w10, uxth + // 2c: 54000061 b.ne 0x38 <_JIT_ENTRY+0x38> + // 30: f80086a8 str x8, [x21], #0x8 + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 3c: 00 00 00 00 + const unsigned char code_body[64] = { + 0x88, 0x0e, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x05, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x21, 0x01, 0x00, 0x54, + 0x08, 0x11, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x09, 0x0d, 0x40, 0xb9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x21, 0x2a, 0x6b, 0x61, 0x00, 0x00, 0x54, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_FALSE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_FALSE_POP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 4: f85f8ea8 ldr x8, [x21, #-0x8]! + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // c: eb09011f cmp x8, x9 + // 10: 54000040 b.eq 0x18 <_JIT_ENTRY+0x18> + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x8e, 0x5f, 0xf8, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_FalseStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NONE_POP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 4: f85f8ea0 ldr x0, [x21, #-0x8]! + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // c: eb08001f cmp x0, x8 + // 10: 54000140 b.eq 0x38 <_JIT_ENTRY+0x38> + // 14: f9002295 str x21, [x20, #0x40] + // 18: b9400008 ldr w8, [x0] + // 1c: 37f80088 tbnz w8, #0x1f, 0x2c <_JIT_ENTRY+0x2c> + // 20: 71000508 subs w8, w8, #0x1 + // 24: b9000008 str w8, [x0] + // 28: 540000a0 b.eq 0x3c <_JIT_ENTRY+0x3c> + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 40: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 44: 910003fd mov x29, sp + // 48: f9400108 ldr x8, [x8] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 4c: d63f0100 blr x8 + // 50: a8c17bfd ldp x29, x30, [sp], #0x10 + // 54: f9402295 ldr x21, [x20, #0x40] + // 58: f900229f str xzr, [x20, #0x40] + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[96] = { + 0x08, 0x00, 0x00, 0x90, 0xa0, 0x8e, 0x5f, 0xf8, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_NOT_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NOT_NONE_POP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8eb3 ldr x19, [x21, #-0x8]! + // 4: f9002295 str x21, [x20, #0x40] + // 8: b9400268 ldr w8, [x19] + // c: 37f80088 tbnz w8, #0x1f, 0x1c <_JIT_ENTRY+0x1c> + // 10: 71000508 subs w8, w8, #0x1 + // 14: b9000268 str w8, [x19] + // 18: 54000100 b.eq 0x38 <_JIT_ENTRY+0x38> + // 1c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: eb08027f cmp x19, x8 + // 30: 540001e0 b.eq 0x6c <_JIT_ENTRY+0x6c> + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + // 38: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 3c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000003c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 40: aa1303e0 mov x0, x19 + // 44: 910003fd mov x29, sp + // 48: f9400108 ldr x8, [x8] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 4c: d63f0100 blr x8 + // 50: a8c17bfd ldp x29, x30, [sp], #0x10 + // 54: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000054: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: eb08027f cmp x19, x8 + // 68: 54fffe61 b.ne 0x34 <_JIT_ENTRY+0x34> + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[112] = { + 0xb3, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x00, 0x01, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x7f, 0x02, 0x08, 0xeb, + 0xe0, 0x01, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x7f, 0x02, 0x08, 0xeb, + 0x61, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x54, (uintptr_t)data); + patch_aarch64_26r(code + 0x6c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_IS_TRUE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_TRUE_POP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 4: f85f8ea8 ldr x8, [x21, #-0x8]! + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // c: eb09011f cmp x8, x9 + // 10: 54000040 b.eq 0x18 <_JIT_ENTRY+0x18> + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x8e, 0x5f, 0xf8, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_TrueStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_KEYS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_KEYS_VERSION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f941b908 ldr x8, [x8, #0x370] + // 10: b9400d08 ldr w8, [x8, #0xc] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 18: 6b09011f cmp w8, w9 + // 1c: 54000041 b.ne 0x24 <_JIT_ENTRY+0x24> + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_CONTINUE + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x08, 0xb9, 0x41, 0xf9, + 0x08, 0x0d, 0x40, 0xb9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0x6b, 0x41, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x24, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_NOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyFloat_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyFloat_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_NOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_NOT_EXHAUSTED_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_LIST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400d09 ldr x9, [x8, #0x18] + // 8: b40000c9 cbz x9, 0x20 <_JIT_ENTRY+0x20> + // c: f940090a ldr x10, [x8, #0x10] + // 10: f9400929 ldr x9, [x9, #0x10] + // 14: eb09015f cmp x10, x9 + // 18: 54000062 b.hs 0x24 <_JIT_ENTRY+0x24> + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: 92800009 mov x9, #-0x1 // =-1 + // 28: f9000909 str x9, [x8, #0x10] + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[48] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x0d, 0x40, 0xf9, + 0xc9, 0x00, 0x00, 0xb4, 0x0a, 0x09, 0x40, 0xf9, + 0x29, 0x09, 0x40, 0xf9, 0x5f, 0x01, 0x09, 0xeb, + 0x62, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x80, 0x92, + 0x09, 0x09, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x2c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_NOT_EXHAUSTED_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_RANGE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9401108 ldr x8, [x8, #0x20] + // 8: f100011f cmp x8, #0x0 + // c: 5400004d b.le 0x14 <_JIT_ENTRY+0x14> + // 10: 14000000 b 0x10 <_JIT_ENTRY+0x10> + // 0000000000000010: R_AARCH64_JUMP26 _JIT_CONTINUE + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[24] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x08, 0x11, 0x40, 0xf9, + 0x1f, 0x01, 0x00, 0xf1, 0x4d, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_NOT_EXHAUSTED_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: f9400d09 ldr x9, [x8, #0x18] + // 8: b40000c9 cbz x9, 0x20 <_JIT_ENTRY+0x20> + // c: f9400908 ldr x8, [x8, #0x10] + // 10: f9400929 ldr x9, [x9, #0x10] + // 14: eb09011f cmp x8, x9 + // 18: 5400004a b.ge 0x20 <_JIT_ENTRY+0x20> + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x0d, 0x40, 0xf9, + 0xc9, 0x00, 0x00, 0xb4, 0x08, 0x09, 0x40, 0xf9, + 0x29, 0x09, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x4a, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_TOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_FLOAT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyFloat_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyFloat_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_TOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__GUARD_TYPE_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: f9400508 ldr x8, [x8, #0x8] + // c: b9418108 ldr w8, [x8, #0x180] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 14: 6b09011f cmp w8, w9 + // 18: 54000041 b.ne 0x20 <_JIT_ENTRY+0x20> + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x08, 0x81, 0x41, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__GUARD_TYPE_VERSION_AND_LOCK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION_AND_LOCK.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: f9400508 ldr x8, [x8, #0x8] + // c: b9418108 ldr w8, [x8, #0x180] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 14: 6b09011f cmp w8, w9 + // 18: 54000041 b.ne 0x20 <_JIT_ENTRY+0x20> + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 24: 00 00 00 00 + const unsigned char code_body[40] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x08, 0x81, 0x41, 0xb9, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0x6b, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x20, state->instruction_starts[instruction->jump_target]); +} + +void +emit__IMPORT_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_FROM.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: aa1603e0 mov x0, x22 + // 10: 910003fd mov x29, sp + // 14: f9401108 ldr x8, [x8, #0x20] + // 18: f9400129 ldr x9, [x9] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 1c: f85f82a1 ldur x1, [x21, #-0x8] + // 20: 8b292d08 add x8, x8, w9, uxth #3 + // 24: f9400d02 ldr x2, [x8, #0x18] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _PyEval_ImportFrom + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _PyEval_ImportFrom + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b4000080 cbz x0, 0x50 <_JIT_ENTRY+0x50> + // 44: f80086a0 str x0, [x21], #0x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 50: a8c17bfd ldp x29, x30, [sp], #0x10 + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[88] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x11, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0xa1, 0x82, 0x5f, 0xf8, + 0x08, 0x2d, 0x29, 0x8b, 0x02, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyEval_ImportFrom+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportFrom); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x54, state->instruction_starts[instruction->error_target]); +} + +void +emit__IMPORT_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_NAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: aa1603e0 mov x0, x22 + // 10: aa1403e1 mov x1, x20 + // 14: 910003fd mov x29, sp + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 20: a97f4eb8 ldp x24, x19, [x21, #-0x10] + // 24: 8b292d08 add x8, x8, w9, uxth #3 + // 28: f9400d02 ldr x2, [x8, #0x18] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _PyEval_ImportName + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _PyEval_ImportName + // 38: aa1303e3 mov x3, x19 + // 3c: aa1803e4 mov x4, x24 + // 40: d63f0100 blr x8 + // 44: f9402299 ldr x25, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: aa0003f7 mov x23, x0 + // 50: b9400308 ldr w8, [x24] + // 54: 37f80108 tbnz w8, #0x1f, 0x74 <_JIT_ENTRY+0x74> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000308 str w8, [x24] + // 60: 540000a1 b.ne 0x74 <_JIT_ENTRY+0x74> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: aa1803e0 mov x0, x24 + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 70: d63f0100 blr x8 + // 74: b9400268 ldr w8, [x19] + // 78: 37f80088 tbnz w8, #0x1f, 0x88 <_JIT_ENTRY+0x88> + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000268 str w8, [x19] + // 84: 540000c0 b.eq 0x9c <_JIT_ENTRY+0x9c> + // 88: b4000157 cbz x23, 0xb0 <_JIT_ENTRY+0xb0> + // 8c: d1002335 sub x21, x25, #0x8 + // 90: f81f0337 stur x23, [x25, #-0x10] + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_CONTINUE + // 9c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a0: aa1303e0 mov x0, x19 + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a8: d63f0100 blr x8 + // ac: b5ffff17 cbnz x23, 0x8c <_JIT_ENTRY+0x8c> + // b0: d1004335 sub x21, x25, #0x10 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: 14000000 b 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // bc: 00 00 00 00 + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x14, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb8, 0x4e, 0x7f, 0xa9, 0x08, 0x2d, 0x29, 0x8b, + 0x02, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe3, 0x03, 0x13, 0xaa, 0xe4, 0x03, 0x18, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x99, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0xaa, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x57, 0x01, 0x00, 0xb4, 0x35, 0x23, 0x00, 0xd1, + 0x37, 0x03, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x17, 0xff, 0xff, 0xb5, + 0x35, 0x43, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ImportName+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportName); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x98, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); +} + +void +emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_BOUND_METHOD_EXACT_ARGS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 12003d0b and w11, w8, #0xffff + // c: 12800028 mov w8, #-0x2 // =-2 + // 10: 4b0b0108 sub w8, w8, w11 + // 14: 2a2b03eb mvn w11, w11 + // 18: f868daa9 ldr x9, [x21, w8, sxtw #3] + // 1c: f9400d2a ldr x10, [x9, #0x18] + // 20: b940014c ldr w12, [x10] + // 24: 37f8006c tbnz w12, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // 28: 1100058c add w12, w12, #0x1 + // 2c: b900014c str w12, [x10] + // 30: f82bdaaa str x10, [x21, w11, sxtw #3] + // 34: f9400929 ldr x9, [x9, #0x10] + // 38: f868daa0 ldr x0, [x21, w8, sxtw #3] + // 3c: b940012a ldr w10, [x9] + // 40: 37f8006a tbnz w10, #0x1f, 0x4c <_JIT_ENTRY+0x4c> + // 44: 1100054a add w10, w10, #0x1 + // 48: b900012a str w10, [x9] + // 4c: f828daa9 str x9, [x21, w8, sxtw #3] + // 50: f9002295 str x21, [x20, #0x40] + // 54: b9400008 ldr w8, [x0] + // 58: 37f80088 tbnz w8, #0x1f, 0x68 <_JIT_ENTRY+0x68> + // 5c: 71000508 subs w8, w8, #0x1 + // 60: b9000008 str w8, [x0] + // 64: 54000080 b.eq 0x74 <_JIT_ENTRY+0x74> + // 68: f9402295 ldr x21, [x20, #0x40] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 7c: 910003fd mov x29, sp + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x0b, 0x3d, 0x00, 0x12, 0x28, 0x00, 0x80, 0x12, + 0x08, 0x01, 0x0b, 0x4b, 0xeb, 0x03, 0x2b, 0x2a, + 0xa9, 0xda, 0x68, 0xf8, 0x2a, 0x0d, 0x40, 0xf9, + 0x4c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x4c, 0x01, 0x00, 0xb9, + 0xaa, 0xda, 0x2b, 0xf8, 0x29, 0x09, 0x40, 0xf9, + 0xa0, 0xda, 0x68, 0xf8, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xda, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 1280002a mov w10, #-0x2 // =-2 + // 8: aa1503e8 mov x8, x21 + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 12003d2d and w13, w9, #0xffff + // 14: 4b0d0149 sub w9, w10, w13 + // 18: f9407aca ldr x10, [x22, #0xf0] + // 1c: 2a2d03ee mvn w14, w13 + // 20: f869daaf ldr x15, [x21, w9, sxtw #3] + // 24: 8b2eceb5 add x21, x21, w14, sxtw #3 + // 28: f94019eb ldr x11, [x15, #0x30] + // 2c: b9804d6c ldrsw x12, [x11, #0x4c] + // 30: 8b0c0d4e add x14, x10, x12, lsl #3 + // 34: f94002ac ldr x12, [x21] + // 38: f9007ace str x14, [x22, #0xf0] + // 3c: f100019f cmp x12, #0x0 + // 40: a900bd54 stp x20, x15, [x10, #0x8] + // 44: 1a8d05ad cinc w13, w13, ne + // 48: b940016e ldr w14, [x11] + // 4c: 37f8006e tbnz w14, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 50: 110005ce add w14, w14, #0x1 + // 54: b900016e str w14, [x11] + // 58: f900014b str x11, [x10] + // 5c: 9101414e add x14, x10, #0x50 + // 60: 91034171 add x17, x11, #0xd0 + // 64: b9804970 ldrsw x16, [x11, #0x48] + // 68: 3dc005e0 ldr q0, [x15, #0x10] + // 6c: a902fd5f stp xzr, xzr, [x10, #0x28] + // 70: b900495f str wzr, [x10, #0x48] + // 74: 8b100dcf add x15, x14, x16, lsl #3 + // 78: 6b0d021f cmp w16, w13 + // 7c: 3c818140 stur q0, [x10, #0x18] + // 80: a903bd51 stp x17, x15, [x10, #0x38] + // 84: 540000cd b.le 0x9c <_JIT_ENTRY+0x9c> + // 88: f82d79df str xzr, [x14, x13, lsl #3] + // 8c: 910005ad add x13, x13, #0x1 + // 90: b980496f ldrsw x15, [x11, #0x48] + // 94: eb0f01bf cmp x13, x15 + // 98: 54ffff8b b.lt 0x88 <_JIT_ENTRY+0x88> + // 9c: 9000000d adrp x13, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // a0: f100019f cmp x12, #0x0 + // a4: f94001ad ldr x13, [x13] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // a8: f94002af ldr x15, [x21] + // ac: 1a9f07eb cset w11, ne + // b0: 72003dbf tst w13, #0xffff + // b4: f90001cf str x15, [x14] + // b8: 54000300 b.eq 0x118 <_JIT_ENTRY+0x118> + // bc: 12003dae and w14, w13, #0xffff + // c0: 92403dad and x13, x13, #0xffff + // c4: 71002ddf cmp w14, #0xb + // c8: 54000149 b.ls 0xf0 <_JIT_ENTRY+0xf0> + // cc: f100019f cmp x12, #0x0 + // d0: d37df1ae lsl x14, x13, #3 + // d4: 1a9f07ec cset w12, ne + // d8: 8b2c4d4c add x12, x10, w12, uxtw #3 + // dc: 8b0e018c add x12, x12, x14 + // e0: cb08018c sub x12, x12, x8 + // e4: 9101418c add x12, x12, #0x50 + // e8: f100819f cmp x12, #0x20 + // ec: 540001a2 b.hs 0x120 <_JIT_ENTRY+0x120> + // f0: aa1f03ec mov x12, xzr + // f4: d37df18e lsl x14, x12, #3 + // f8: 8b0b0dcb add x11, x14, x11, lsl #3 + // fc: 8b0a016e add x14, x11, x10 + // 100: cb0d018b sub x11, x12, x13 + // 104: 910141cc add x12, x14, #0x50 + // 108: f86b790d ldr x13, [x8, x11, lsl #3] + // 10c: b100056b adds x11, x11, #0x1 + // 110: f800858d str x13, [x12], #0x8 + // 114: 54ffffa3 b.lo 0x108 <_JIT_ENTRY+0x108> + // 118: f829d90a str x10, [x8, w9, sxtw #3] + // 11c: 14000000 b 0x11c <_JIT_ENTRY+0x11c> + // 000000000000011c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 120: 8b0b0d4f add x15, x10, x11, lsl #3 + // 124: 927e35ac and x12, x13, #0xfffc + // 128: cb0e0110 sub x16, x8, x14 + // 12c: 910181ee add x14, x15, #0x60 + // 130: 9100420f add x15, x16, #0x10 + // 134: aa0c03f0 mov x16, x12 + // 138: ad7f85e0 ldp q0, q1, [x15, #-0x10] + // 13c: f1001210 subs x16, x16, #0x4 + // 140: 910081ef add x15, x15, #0x20 + // 144: ad3f85c0 stp q0, q1, [x14, #-0x10] + // 148: 910081ce add x14, x14, #0x20 + // 14c: 54ffff61 b.ne 0x138 <_JIT_ENTRY+0x138> + // 150: eb0d019f cmp x12, x13 + // 154: 54fffd01 b.ne 0xf4 <_JIT_ENTRY+0xf4> + // 158: 17fffff0 b 0x118 <_JIT_ENTRY+0x118> + // 15c: 00 00 00 00 + const unsigned char code_body[352] = { + 0x09, 0x00, 0x00, 0x90, 0x2a, 0x00, 0x80, 0x12, + 0xe8, 0x03, 0x15, 0xaa, 0x29, 0x01, 0x40, 0xf9, + 0x2d, 0x3d, 0x00, 0x12, 0x49, 0x01, 0x0d, 0x4b, + 0xca, 0x7a, 0x40, 0xf9, 0xee, 0x03, 0x2d, 0x2a, + 0xaf, 0xda, 0x69, 0xf8, 0xb5, 0xce, 0x2e, 0x8b, + 0xeb, 0x19, 0x40, 0xf9, 0x6c, 0x4d, 0x80, 0xb9, + 0x4e, 0x0d, 0x0c, 0x8b, 0xac, 0x02, 0x40, 0xf9, + 0xce, 0x7a, 0x00, 0xf9, 0x9f, 0x01, 0x00, 0xf1, + 0x54, 0xbd, 0x00, 0xa9, 0xad, 0x05, 0x8d, 0x1a, + 0x6e, 0x01, 0x40, 0xb9, 0x6e, 0x00, 0xf8, 0x37, + 0xce, 0x05, 0x00, 0x11, 0x6e, 0x01, 0x00, 0xb9, + 0x4b, 0x01, 0x00, 0xf9, 0x4e, 0x41, 0x01, 0x91, + 0x71, 0x41, 0x03, 0x91, 0x70, 0x49, 0x80, 0xb9, + 0xe0, 0x05, 0xc0, 0x3d, 0x5f, 0xfd, 0x02, 0xa9, + 0x5f, 0x49, 0x00, 0xb9, 0xcf, 0x0d, 0x10, 0x8b, + 0x1f, 0x02, 0x0d, 0x6b, 0x40, 0x81, 0x81, 0x3c, + 0x51, 0xbd, 0x03, 0xa9, 0xcd, 0x00, 0x00, 0x54, + 0xdf, 0x79, 0x2d, 0xf8, 0xad, 0x05, 0x00, 0x91, + 0x6f, 0x49, 0x80, 0xb9, 0xbf, 0x01, 0x0f, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x0d, 0x00, 0x00, 0x90, + 0x9f, 0x01, 0x00, 0xf1, 0xad, 0x01, 0x40, 0xf9, + 0xaf, 0x02, 0x40, 0xf9, 0xeb, 0x07, 0x9f, 0x1a, + 0xbf, 0x3d, 0x00, 0x72, 0xcf, 0x01, 0x00, 0xf9, + 0x00, 0x03, 0x00, 0x54, 0xae, 0x3d, 0x00, 0x12, + 0xad, 0x3d, 0x40, 0x92, 0xdf, 0x2d, 0x00, 0x71, + 0x49, 0x01, 0x00, 0x54, 0x9f, 0x01, 0x00, 0xf1, + 0xae, 0xf1, 0x7d, 0xd3, 0xec, 0x07, 0x9f, 0x1a, + 0x4c, 0x4d, 0x2c, 0x8b, 0x8c, 0x01, 0x0e, 0x8b, + 0x8c, 0x01, 0x08, 0xcb, 0x8c, 0x41, 0x01, 0x91, + 0x9f, 0x81, 0x00, 0xf1, 0xa2, 0x01, 0x00, 0x54, + 0xec, 0x03, 0x1f, 0xaa, 0x8e, 0xf1, 0x7d, 0xd3, + 0xcb, 0x0d, 0x0b, 0x8b, 0x6e, 0x01, 0x0a, 0x8b, + 0x8b, 0x01, 0x0d, 0xcb, 0xcc, 0x41, 0x01, 0x91, + 0x0d, 0x79, 0x6b, 0xf8, 0x6b, 0x05, 0x00, 0xb1, + 0x8d, 0x85, 0x00, 0xf8, 0xa3, 0xff, 0xff, 0x54, + 0x0a, 0xd9, 0x29, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x4f, 0x0d, 0x0b, 0x8b, 0xac, 0x35, 0x7e, 0x92, + 0x10, 0x01, 0x0e, 0xcb, 0xee, 0x81, 0x01, 0x91, + 0x0f, 0x42, 0x00, 0x91, 0xf0, 0x03, 0x0c, 0xaa, + 0xe0, 0x85, 0x7f, 0xad, 0x10, 0x12, 0x00, 0xf1, + 0xef, 0x81, 0x00, 0x91, 0xc0, 0x85, 0x3f, 0xad, + 0xce, 0x81, 0x00, 0x91, 0x61, 0xff, 0xff, 0x54, + 0x9f, 0x01, 0x0d, 0xeb, 0x01, 0xfd, 0xff, 0x54, + 0xf0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data); + patch_aarch64_26r(code + 0x11c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_0.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85f8eab ldr x11, [x21, #-0x8]! + // 8: f85f82ae ldur x14, [x21, #-0x8] + // c: f9407ac9 ldr x9, [x22, #0xf0] + // 10: f100017f cmp x11, #0x0 + // 14: f94019ca ldr x10, [x14, #0x30] + // 18: 1a9f07ed cset w13, ne + // 1c: b9804d4c ldrsw x12, [x10, #0x4c] + // 20: 8b0c0d2c add x12, x9, x12, lsl #3 + // 24: f9007acc str x12, [x22, #0xf0] + // 28: a900b934 stp x20, x14, [x9, #0x8] + // 2c: b940014c ldr w12, [x10] + // 30: 37f8006c tbnz w12, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 34: 1100058c add w12, w12, #0x1 + // 38: b900014c str w12, [x10] + // 3c: f900012a str x10, [x9] + // 40: 9101412c add x12, x9, #0x50 + // 44: 91034150 add x16, x10, #0xd0 + // 48: b980494f ldrsw x15, [x10, #0x48] + // 4c: 3dc005c0 ldr q0, [x14, #0x10] + // 50: a902fd3f stp xzr, xzr, [x9, #0x28] + // 54: b900493f str wzr, [x9, #0x48] + // 58: 8b0f0d8e add x14, x12, x15, lsl #3 + // 5c: 6b0d01ff cmp w15, w13 + // 60: 3c818120 stur q0, [x9, #0x18] + // 64: a903b930 stp x16, x14, [x9, #0x38] + // 68: 5400010d b.le 0x88 <_JIT_ENTRY+0x88> + // 6c: f100017f cmp x11, #0x0 + // 70: 1a9f07eb cset w11, ne + // 74: f82b799f str xzr, [x12, x11, lsl #3] + // 78: 9100056b add x11, x11, #0x1 + // 7c: b980494d ldrsw x13, [x10, #0x48] + // 80: eb0d017f cmp x11, x13 + // 84: 54ffff8b b.lt 0x74 <_JIT_ENTRY+0x74> + // 88: f85f810a ldur x10, [x8, #-0x8] + // 8c: f900292a str x10, [x9, #0x50] + // 90: f81f0109 stur x9, [x8, #-0x10] + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0xe8, 0x03, 0x15, 0xaa, 0xab, 0x8e, 0x5f, 0xf8, + 0xae, 0x82, 0x5f, 0xf8, 0xc9, 0x7a, 0x40, 0xf9, + 0x7f, 0x01, 0x00, 0xf1, 0xca, 0x19, 0x40, 0xf9, + 0xed, 0x07, 0x9f, 0x1a, 0x4c, 0x4d, 0x80, 0xb9, + 0x2c, 0x0d, 0x0c, 0x8b, 0xcc, 0x7a, 0x00, 0xf9, + 0x34, 0xb9, 0x00, 0xa9, 0x4c, 0x01, 0x40, 0xb9, + 0x6c, 0x00, 0xf8, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x4c, 0x01, 0x00, 0xb9, 0x2a, 0x01, 0x00, 0xf9, + 0x2c, 0x41, 0x01, 0x91, 0x50, 0x41, 0x03, 0x91, + 0x4f, 0x49, 0x80, 0xb9, 0xc0, 0x05, 0xc0, 0x3d, + 0x3f, 0xfd, 0x02, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0x8e, 0x0d, 0x0f, 0x8b, 0xff, 0x01, 0x0d, 0x6b, + 0x20, 0x81, 0x81, 0x3c, 0x30, 0xb9, 0x03, 0xa9, + 0x0d, 0x01, 0x00, 0x54, 0x7f, 0x01, 0x00, 0xf1, + 0xeb, 0x07, 0x9f, 0x1a, 0x9f, 0x79, 0x2b, 0xf8, + 0x6b, 0x05, 0x00, 0x91, 0x4d, 0x49, 0x80, 0xb9, + 0x7f, 0x01, 0x0d, 0xeb, 0x8b, 0xff, 0xff, 0x54, + 0x0a, 0x81, 0x5f, 0xf8, 0x2a, 0x29, 0x00, 0xf9, + 0x09, 0x01, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x94, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85f0eaa ldr x10, [x21, #-0x10]! + // 8: f85f82ae ldur x14, [x21, #-0x8] + // c: f9407ac9 ldr x9, [x22, #0xf0] + // 10: f100015f cmp x10, #0x0 + // 14: f94019cb ldr x11, [x14, #0x30] + // 18: b9804d6c ldrsw x12, [x11, #0x4c] + // 1c: 8b0c0d2c add x12, x9, x12, lsl #3 + // 20: f9007acc str x12, [x22, #0xf0] + // 24: 5280002c mov w12, #0x1 // =1 + // 28: a900b934 stp x20, x14, [x9, #0x8] + // 2c: 1a8c058c cinc w12, w12, ne + // 30: b940016d ldr w13, [x11] + // 34: 37f8006d tbnz w13, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 38: 110005ad add w13, w13, #0x1 + // 3c: b900016d str w13, [x11] + // 40: f900012b str x11, [x9] + // 44: 9101412d add x13, x9, #0x50 + // 48: 91034170 add x16, x11, #0xd0 + // 4c: b980496f ldrsw x15, [x11, #0x48] + // 50: 3dc005c0 ldr q0, [x14, #0x10] + // 54: a902fd3f stp xzr, xzr, [x9, #0x28] + // 58: b900493f str wzr, [x9, #0x48] + // 5c: 8b0f0dae add x14, x13, x15, lsl #3 + // 60: 6b0c01ff cmp w15, w12 + // 64: 3c818120 stur q0, [x9, #0x18] + // 68: a903b930 stp x16, x14, [x9, #0x38] + // 6c: 540000cd b.le 0x84 <_JIT_ENTRY+0x84> + // 70: f82c79bf str xzr, [x13, x12, lsl #3] + // 74: 9100058c add x12, x12, #0x1 + // 78: b980496e ldrsw x14, [x11, #0x48] + // 7c: eb0e019f cmp x12, x14 + // 80: 54ffff8b b.lt 0x70 <_JIT_ENTRY+0x70> + // 84: f85f010b ldur x11, [x8, #-0x10] + // 88: f100015f cmp x10, #0x0 + // 8c: 1a9f07ea cset w10, ne + // 90: f900292b str x11, [x9, #0x50] + // 94: f85f810b ldur x11, [x8, #-0x8] + // 98: f82a59ab str x11, [x13, w10, uxtw #3] + // 9c: f81e8109 stur x9, [x8, #-0x18] + // a0: 14000000 b 0xa0 <_JIT_ENTRY+0xa0> + // 00000000000000a0: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[160] = { + 0xe8, 0x03, 0x15, 0xaa, 0xaa, 0x0e, 0x5f, 0xf8, + 0xae, 0x82, 0x5f, 0xf8, 0xc9, 0x7a, 0x40, 0xf9, + 0x5f, 0x01, 0x00, 0xf1, 0xcb, 0x19, 0x40, 0xf9, + 0x6c, 0x4d, 0x80, 0xb9, 0x2c, 0x0d, 0x0c, 0x8b, + 0xcc, 0x7a, 0x00, 0xf9, 0x2c, 0x00, 0x80, 0x52, + 0x34, 0xb9, 0x00, 0xa9, 0x8c, 0x05, 0x8c, 0x1a, + 0x6d, 0x01, 0x40, 0xb9, 0x6d, 0x00, 0xf8, 0x37, + 0xad, 0x05, 0x00, 0x11, 0x6d, 0x01, 0x00, 0xb9, + 0x2b, 0x01, 0x00, 0xf9, 0x2d, 0x41, 0x01, 0x91, + 0x70, 0x41, 0x03, 0x91, 0x6f, 0x49, 0x80, 0xb9, + 0xc0, 0x05, 0xc0, 0x3d, 0x3f, 0xfd, 0x02, 0xa9, + 0x3f, 0x49, 0x00, 0xb9, 0xae, 0x0d, 0x0f, 0x8b, + 0xff, 0x01, 0x0c, 0x6b, 0x20, 0x81, 0x81, 0x3c, + 0x30, 0xb9, 0x03, 0xa9, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2c, 0xf8, 0x8c, 0x05, 0x00, 0x91, + 0x6e, 0x49, 0x80, 0xb9, 0x9f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x0b, 0x01, 0x5f, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0xea, 0x07, 0x9f, 0x1a, + 0x2b, 0x29, 0x00, 0xf9, 0x0b, 0x81, 0x5f, 0xf8, + 0xab, 0x59, 0x2a, 0xf8, 0x09, 0x81, 0x1e, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_2.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85e8eaa ldr x10, [x21, #-0x18]! + // 8: f85f82ae ldur x14, [x21, #-0x8] + // c: f9407ac9 ldr x9, [x22, #0xf0] + // 10: f100015f cmp x10, #0x0 + // 14: f94019cb ldr x11, [x14, #0x30] + // 18: b9804d6c ldrsw x12, [x11, #0x4c] + // 1c: 8b0c0d2c add x12, x9, x12, lsl #3 + // 20: f9007acc str x12, [x22, #0xf0] + // 24: 5280004c mov w12, #0x2 // =2 + // 28: a900b934 stp x20, x14, [x9, #0x8] + // 2c: 1a8c058c cinc w12, w12, ne + // 30: b940016d ldr w13, [x11] + // 34: 37f8006d tbnz w13, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 38: 110005ad add w13, w13, #0x1 + // 3c: b900016d str w13, [x11] + // 40: f900012b str x11, [x9] + // 44: 9101412d add x13, x9, #0x50 + // 48: 91034170 add x16, x11, #0xd0 + // 4c: b980496f ldrsw x15, [x11, #0x48] + // 50: 3dc005c0 ldr q0, [x14, #0x10] + // 54: a902fd3f stp xzr, xzr, [x9, #0x28] + // 58: b900493f str wzr, [x9, #0x48] + // 5c: 8b0f0dae add x14, x13, x15, lsl #3 + // 60: 6b0c01ff cmp w15, w12 + // 64: 3c818120 stur q0, [x9, #0x18] + // 68: a903b930 stp x16, x14, [x9, #0x38] + // 6c: 540000cd b.le 0x84 <_JIT_ENTRY+0x84> + // 70: f82c79bf str xzr, [x13, x12, lsl #3] + // 74: 9100058c add x12, x12, #0x1 + // 78: b980496e ldrsw x14, [x11, #0x48] + // 7c: eb0e019f cmp x12, x14 + // 80: 54ffff8b b.lt 0x70 <_JIT_ENTRY+0x70> + // 84: f85e810b ldur x11, [x8, #-0x18] + // 88: f100015f cmp x10, #0x0 + // 8c: 1a9f07ea cset w10, ne + // 90: f900292b str x11, [x9, #0x50] + // 94: 8b2a4daa add x10, x13, w10, uxtw #3 + // 98: f85f010b ldur x11, [x8, #-0x10] + // 9c: f900014b str x11, [x10] + // a0: f85f810b ldur x11, [x8, #-0x8] + // a4: f900054b str x11, [x10, #0x8] + // a8: f81e0109 stur x9, [x8, #-0x20] + // ac: 14000000 b 0xac <_JIT_ENTRY+0xac> + // 00000000000000ac: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[176] = { + 0xe8, 0x03, 0x15, 0xaa, 0xaa, 0x8e, 0x5e, 0xf8, + 0xae, 0x82, 0x5f, 0xf8, 0xc9, 0x7a, 0x40, 0xf9, + 0x5f, 0x01, 0x00, 0xf1, 0xcb, 0x19, 0x40, 0xf9, + 0x6c, 0x4d, 0x80, 0xb9, 0x2c, 0x0d, 0x0c, 0x8b, + 0xcc, 0x7a, 0x00, 0xf9, 0x4c, 0x00, 0x80, 0x52, + 0x34, 0xb9, 0x00, 0xa9, 0x8c, 0x05, 0x8c, 0x1a, + 0x6d, 0x01, 0x40, 0xb9, 0x6d, 0x00, 0xf8, 0x37, + 0xad, 0x05, 0x00, 0x11, 0x6d, 0x01, 0x00, 0xb9, + 0x2b, 0x01, 0x00, 0xf9, 0x2d, 0x41, 0x01, 0x91, + 0x70, 0x41, 0x03, 0x91, 0x6f, 0x49, 0x80, 0xb9, + 0xc0, 0x05, 0xc0, 0x3d, 0x3f, 0xfd, 0x02, 0xa9, + 0x3f, 0x49, 0x00, 0xb9, 0xae, 0x0d, 0x0f, 0x8b, + 0xff, 0x01, 0x0c, 0x6b, 0x20, 0x81, 0x81, 0x3c, + 0x30, 0xb9, 0x03, 0xa9, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2c, 0xf8, 0x8c, 0x05, 0x00, 0x91, + 0x6e, 0x49, 0x80, 0xb9, 0x9f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x0b, 0x81, 0x5e, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0xea, 0x07, 0x9f, 0x1a, + 0x2b, 0x29, 0x00, 0xf9, 0xaa, 0x4d, 0x2a, 0x8b, + 0x0b, 0x01, 0x5f, 0xf8, 0x4b, 0x01, 0x00, 0xf9, + 0x0b, 0x81, 0x5f, 0xf8, 0x4b, 0x05, 0x00, 0xf9, + 0x09, 0x01, 0x1e, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xac, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_3.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85e0eaa ldr x10, [x21, #-0x20]! + // 8: f85f82ae ldur x14, [x21, #-0x8] + // c: f9407ac9 ldr x9, [x22, #0xf0] + // 10: f100015f cmp x10, #0x0 + // 14: f94019cb ldr x11, [x14, #0x30] + // 18: b9804d6c ldrsw x12, [x11, #0x4c] + // 1c: 8b0c0d2c add x12, x9, x12, lsl #3 + // 20: f9007acc str x12, [x22, #0xf0] + // 24: 5280006c mov w12, #0x3 // =3 + // 28: a900b934 stp x20, x14, [x9, #0x8] + // 2c: 1a8c058c cinc w12, w12, ne + // 30: b940016d ldr w13, [x11] + // 34: 37f8006d tbnz w13, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 38: 110005ad add w13, w13, #0x1 + // 3c: b900016d str w13, [x11] + // 40: f900012b str x11, [x9] + // 44: 9101412d add x13, x9, #0x50 + // 48: 91034170 add x16, x11, #0xd0 + // 4c: b980496f ldrsw x15, [x11, #0x48] + // 50: 3dc005c0 ldr q0, [x14, #0x10] + // 54: a902fd3f stp xzr, xzr, [x9, #0x28] + // 58: b900493f str wzr, [x9, #0x48] + // 5c: 8b0f0dae add x14, x13, x15, lsl #3 + // 60: 6b0c01ff cmp w15, w12 + // 64: 3c818120 stur q0, [x9, #0x18] + // 68: a903b930 stp x16, x14, [x9, #0x38] + // 6c: 540000cd b.le 0x84 <_JIT_ENTRY+0x84> + // 70: f82c79bf str xzr, [x13, x12, lsl #3] + // 74: 9100058c add x12, x12, #0x1 + // 78: b980496e ldrsw x14, [x11, #0x48] + // 7c: eb0e019f cmp x12, x14 + // 80: 54ffff8b b.lt 0x70 <_JIT_ENTRY+0x70> + // 84: f85e010b ldur x11, [x8, #-0x20] + // 88: f100015f cmp x10, #0x0 + // 8c: 1a9f07ea cset w10, ne + // 90: f900292b str x11, [x9, #0x50] + // 94: 8b2a4daa add x10, x13, w10, uxtw #3 + // 98: f85e810b ldur x11, [x8, #-0x18] + // 9c: f900014b str x11, [x10] + // a0: f85f010b ldur x11, [x8, #-0x10] + // a4: f900054b str x11, [x10, #0x8] + // a8: f85f810b ldur x11, [x8, #-0x8] + // ac: f900094b str x11, [x10, #0x10] + // b0: f81d8109 stur x9, [x8, #-0x28] + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[184] = { + 0xe8, 0x03, 0x15, 0xaa, 0xaa, 0x0e, 0x5e, 0xf8, + 0xae, 0x82, 0x5f, 0xf8, 0xc9, 0x7a, 0x40, 0xf9, + 0x5f, 0x01, 0x00, 0xf1, 0xcb, 0x19, 0x40, 0xf9, + 0x6c, 0x4d, 0x80, 0xb9, 0x2c, 0x0d, 0x0c, 0x8b, + 0xcc, 0x7a, 0x00, 0xf9, 0x6c, 0x00, 0x80, 0x52, + 0x34, 0xb9, 0x00, 0xa9, 0x8c, 0x05, 0x8c, 0x1a, + 0x6d, 0x01, 0x40, 0xb9, 0x6d, 0x00, 0xf8, 0x37, + 0xad, 0x05, 0x00, 0x11, 0x6d, 0x01, 0x00, 0xb9, + 0x2b, 0x01, 0x00, 0xf9, 0x2d, 0x41, 0x01, 0x91, + 0x70, 0x41, 0x03, 0x91, 0x6f, 0x49, 0x80, 0xb9, + 0xc0, 0x05, 0xc0, 0x3d, 0x3f, 0xfd, 0x02, 0xa9, + 0x3f, 0x49, 0x00, 0xb9, 0xae, 0x0d, 0x0f, 0x8b, + 0xff, 0x01, 0x0c, 0x6b, 0x20, 0x81, 0x81, 0x3c, + 0x30, 0xb9, 0x03, 0xa9, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2c, 0xf8, 0x8c, 0x05, 0x00, 0x91, + 0x6e, 0x49, 0x80, 0xb9, 0x9f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x0b, 0x01, 0x5e, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0xea, 0x07, 0x9f, 0x1a, + 0x2b, 0x29, 0x00, 0xf9, 0xaa, 0x4d, 0x2a, 0x8b, + 0x0b, 0x81, 0x5e, 0xf8, 0x4b, 0x01, 0x00, 0xf9, + 0x0b, 0x01, 0x5f, 0xf8, 0x4b, 0x05, 0x00, 0xf9, + 0x0b, 0x81, 0x5f, 0xf8, 0x4b, 0x09, 0x00, 0xf9, + 0x09, 0x81, 0x1d, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_4.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85d8eaa ldr x10, [x21, #-0x28]! + // 8: f85f82ae ldur x14, [x21, #-0x8] + // c: f9407ac9 ldr x9, [x22, #0xf0] + // 10: f100015f cmp x10, #0x0 + // 14: f94019cb ldr x11, [x14, #0x30] + // 18: b9804d6c ldrsw x12, [x11, #0x4c] + // 1c: 8b0c0d2c add x12, x9, x12, lsl #3 + // 20: f9007acc str x12, [x22, #0xf0] + // 24: 5280008c mov w12, #0x4 // =4 + // 28: a900b934 stp x20, x14, [x9, #0x8] + // 2c: 1a8c058c cinc w12, w12, ne + // 30: b940016d ldr w13, [x11] + // 34: 37f8006d tbnz w13, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 38: 110005ad add w13, w13, #0x1 + // 3c: b900016d str w13, [x11] + // 40: f900012b str x11, [x9] + // 44: 9101412d add x13, x9, #0x50 + // 48: 91034170 add x16, x11, #0xd0 + // 4c: b980496f ldrsw x15, [x11, #0x48] + // 50: 3dc005c0 ldr q0, [x14, #0x10] + // 54: a902fd3f stp xzr, xzr, [x9, #0x28] + // 58: b900493f str wzr, [x9, #0x48] + // 5c: 8b0f0dae add x14, x13, x15, lsl #3 + // 60: 6b0c01ff cmp w15, w12 + // 64: 3c818120 stur q0, [x9, #0x18] + // 68: a903b930 stp x16, x14, [x9, #0x38] + // 6c: 540000cd b.le 0x84 <_JIT_ENTRY+0x84> + // 70: f82c79bf str xzr, [x13, x12, lsl #3] + // 74: 9100058c add x12, x12, #0x1 + // 78: b980496e ldrsw x14, [x11, #0x48] + // 7c: eb0e019f cmp x12, x14 + // 80: 54ffff8b b.lt 0x70 <_JIT_ENTRY+0x70> + // 84: f85d810b ldur x11, [x8, #-0x28] + // 88: f100015f cmp x10, #0x0 + // 8c: 1a9f07ea cset w10, ne + // 90: f900292b str x11, [x9, #0x50] + // 94: 8b2a4daa add x10, x13, w10, uxtw #3 + // 98: f85e010b ldur x11, [x8, #-0x20] + // 9c: f900014b str x11, [x10] + // a0: f85e810b ldur x11, [x8, #-0x18] + // a4: f900054b str x11, [x10, #0x8] + // a8: f85f010b ldur x11, [x8, #-0x10] + // ac: f900094b str x11, [x10, #0x10] + // b0: f85f810b ldur x11, [x8, #-0x8] + // b4: f9000d4b str x11, [x10, #0x18] + // b8: f81d0109 stur x9, [x8, #-0x30] + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[192] = { + 0xe8, 0x03, 0x15, 0xaa, 0xaa, 0x8e, 0x5d, 0xf8, + 0xae, 0x82, 0x5f, 0xf8, 0xc9, 0x7a, 0x40, 0xf9, + 0x5f, 0x01, 0x00, 0xf1, 0xcb, 0x19, 0x40, 0xf9, + 0x6c, 0x4d, 0x80, 0xb9, 0x2c, 0x0d, 0x0c, 0x8b, + 0xcc, 0x7a, 0x00, 0xf9, 0x8c, 0x00, 0x80, 0x52, + 0x34, 0xb9, 0x00, 0xa9, 0x8c, 0x05, 0x8c, 0x1a, + 0x6d, 0x01, 0x40, 0xb9, 0x6d, 0x00, 0xf8, 0x37, + 0xad, 0x05, 0x00, 0x11, 0x6d, 0x01, 0x00, 0xb9, + 0x2b, 0x01, 0x00, 0xf9, 0x2d, 0x41, 0x01, 0x91, + 0x70, 0x41, 0x03, 0x91, 0x6f, 0x49, 0x80, 0xb9, + 0xc0, 0x05, 0xc0, 0x3d, 0x3f, 0xfd, 0x02, 0xa9, + 0x3f, 0x49, 0x00, 0xb9, 0xae, 0x0d, 0x0f, 0x8b, + 0xff, 0x01, 0x0c, 0x6b, 0x20, 0x81, 0x81, 0x3c, + 0x30, 0xb9, 0x03, 0xa9, 0xcd, 0x00, 0x00, 0x54, + 0xbf, 0x79, 0x2c, 0xf8, 0x8c, 0x05, 0x00, 0x91, + 0x6e, 0x49, 0x80, 0xb9, 0x9f, 0x01, 0x0e, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x0b, 0x81, 0x5d, 0xf8, + 0x5f, 0x01, 0x00, 0xf1, 0xea, 0x07, 0x9f, 0x1a, + 0x2b, 0x29, 0x00, 0xf9, 0xaa, 0x4d, 0x2a, 0x8b, + 0x0b, 0x01, 0x5e, 0xf8, 0x4b, 0x01, 0x00, 0xf9, + 0x0b, 0x81, 0x5e, 0xf8, 0x4b, 0x05, 0x00, 0xf9, + 0x0b, 0x01, 0x5f, 0xf8, 0x4b, 0x09, 0x00, 0xf9, + 0x0b, 0x81, 0x5f, 0xf8, 0x4b, 0x0d, 0x00, 0xf9, + 0x09, 0x01, 0x1d, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xbc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__IS_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_NONE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 4: f85f82a0 ldur x0, [x21, #-0x8] + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // c: eb08001f cmp x0, x8 + // 10: 54000140 b.eq 0x38 <_JIT_ENTRY+0x38> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000120 b.eq 0x48 <_JIT_ENTRY+0x48> + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 30: f81f82a8 stur x8, [x21, #-0x8] + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 40: f81f82a8 stur x8, [x21, #-0x8] + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_CONTINUE + // 48: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: 910003fd mov x29, sp + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: d63f0100 blr x8 + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 60: f9400108 ldr x8, [x8] + // 0000000000000060: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 64: a8c17bfd ldp x29, x30, [sp], #0x10 + // 68: f81f82a8 stur x8, [x21, #-0x8] + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[112] = { + 0x08, 0x00, 0x00, 0x90, 0xa0, 0x82, 0x5f, 0xf8, + 0x08, 0x01, 0x40, 0xf9, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x20, 0x01, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: &_Py_TrueStruct+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0x5c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__IS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_OP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: aa1503f3 mov x19, x21 + // 8: f85f8eb7 ldr x23, [x21, #-0x8]! + // c: f85f82b8 ldur x24, [x21, #-0x8] + // 10: 910003fd mov x29, sp + // 14: b9400308 ldr w8, [x24] + // 18: 37f80108 tbnz w8, #0x1f, 0x38 <_JIT_ENTRY+0x38> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000308 str w8, [x24] + // 24: 540000a1 b.ne 0x38 <_JIT_ENTRY+0x38> + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 2c: aa1803e0 mov x0, x24 + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 34: d63f0100 blr x8 + // 38: b94002e8 ldr w8, [x23] + // 3c: 37f80108 tbnz w8, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 40: 71000508 subs w8, w8, #0x1 + // 44: b90002e8 str w8, [x23] + // 48: 540000a1 b.ne 0x5c <_JIT_ENTRY+0x5c> + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: aa1703e0 mov x0, x23 + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: d63f0100 blr x8 + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 60: eb17031f cmp x24, x23 + // 64: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 6c: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 70: f9400129 ldr x9, [x9] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 74: 1a9f17ea cset w10, eq + // 78: f940016b ldr x11, [x11] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 7c: 6b28215f cmp w10, w8, uxth + // 80: 9a890168 csel x8, x11, x9, eq + // 84: f81f0268 stur x8, [x19, #-0x10] + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: 14000000 b 0x8c <_JIT_ENTRY+0x8c> + // 000000000000008c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xf3, 0x03, 0x15, 0xaa, + 0xb7, 0x8e, 0x5f, 0xf8, 0xb8, 0x82, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x03, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x1f, 0x03, 0x17, 0xeb, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x0b, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0xea, 0x17, 0x9f, 0x1a, + 0x6b, 0x01, 0x40, 0xf9, 0x5f, 0x21, 0x28, 0x6b, + 0x68, 0x01, 0x89, 0x9a, 0x68, 0x02, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &_Py_TrueStruct+0x0 + // 18: &_Py_FalseStruct+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data); + patch_aarch64_12x(code + 0x30, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data); + patch_aarch64_12x(code + 0x54, (uintptr_t)data); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x68, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x6c, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x78, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_CHECK_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_LIST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyListIter_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyListIter_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyListIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyListIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_CHECK_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_RANGE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyRangeIter_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyRangeIter_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyRangeIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyRangeIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_CHECK_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyTupleIter_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyTupleIter_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyTupleIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTupleIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_NEXT_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_LIST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a9 ldur x9, [x21, #-0x8] + // 4: a941212a ldp x10, x8, [x9, #0x10] + // 8: f9400d08 ldr x8, [x8, #0x18] + // c: 9100054b add x11, x10, #0x1 + // 10: f900092b str x11, [x9, #0x10] + // 14: f86a7908 ldr x8, [x8, x10, lsl #3] + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa9, 0x82, 0x5f, 0xf8, 0x2a, 0x21, 0x41, 0xa9, + 0x08, 0x0d, 0x40, 0xf9, 0x4b, 0x05, 0x00, 0x91, + 0x2b, 0x09, 0x00, 0xf9, 0x08, 0x79, 0x6a, 0xf8, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__ITER_NEXT_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_RANGE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82a8 ldur x8, [x21, #-0x8] + // 8: 910003fd mov x29, sp + // c: a9412500 ldp x0, x9, [x8, #0x10] + // 10: f940110a ldr x10, [x8, #0x20] + // 14: d100054a sub x10, x10, #0x1 + // 18: 8b000129 add x9, x9, x0 + // 1c: f900110a str x10, [x8, #0x20] + // 20: f9000909 str x9, [x8, #0x10] + // 24: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE PyLong_FromLong + // 28: f9400108 ldr x8, [x8] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC PyLong_FromLong + // 2c: d63f0100 blr x8 + // 30: b4000080 cbz x0, 0x40 <_JIT_ENTRY+0x40> + // 34: f80086a0 str x0, [x21], #0x8 + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa8, 0x82, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x25, 0x41, 0xa9, + 0x0a, 0x11, 0x40, 0xf9, 0x4a, 0x05, 0x00, 0xd1, + 0x29, 0x01, 0x00, 0x8b, 0x0a, 0x11, 0x00, 0xf9, + 0x09, 0x09, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_FromLong+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_FromLong); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x24, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->error_target]); +} + +void +emit__ITER_NEXT_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a9 ldur x9, [x21, #-0x8] + // 4: a941212a ldp x10, x8, [x9, #0x10] + // 8: 8b0a0d08 add x8, x8, x10, lsl #3 + // c: 9100054a add x10, x10, #0x1 + // 10: f900092a str x10, [x9, #0x10] + // 14: f9400d08 ldr x8, [x8, #0x18] + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa9, 0x82, 0x5f, 0xf8, 0x2a, 0x21, 0x41, 0xa9, + 0x08, 0x0d, 0x0a, 0x8b, 0x4a, 0x05, 0x00, 0x91, + 0x2a, 0x09, 0x00, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__JUMP_TO_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _JUMP_TO_TOP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 14000000 b 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 4: 00 00 00 00 + const unsigned char code_body[8] = { + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x0, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_APPEND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 2a2803e8 mvn w8, w8 + // c: 531d7108 lsl w8, w8, #3 + // 10: b26db108 orr x8, x8, #0xfffffffffff80000 + // 14: f8686aa0 ldr x0, [x21, x8] + // 18: f85f8ea1 ldr x1, [x21, #-0x8]! + // 1c: f9400808 ldr x8, [x0, #0x10] + // 20: f9401009 ldr x9, [x0, #0x20] + // 24: eb08013f cmp x9, x8 + // 28: 540000cd b.le 0x40 <_JIT_ENTRY+0x40> + // 2c: f9400c09 ldr x9, [x0, #0x18] + // 30: 9100050a add x10, x8, #0x1 + // 34: f900080a str x10, [x0, #0x10] + // 38: f8287921 str x1, [x9, x8, lsl #3] + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 40: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _PyList_AppendTakeRefListResize + // 48: 910003fd mov x29, sp + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _PyList_AppendTakeRefListResize + // 50: d63f0100 blr x8 + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 37f80040 tbnz w0, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x28, 0x2a, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0xa1, 0x8e, 0x5f, 0xf8, 0x08, 0x08, 0x40, 0xf9, + 0x09, 0x10, 0x40, 0xf9, 0x3f, 0x01, 0x08, 0xeb, + 0xcd, 0x00, 0x00, 0x54, 0x09, 0x0c, 0x40, 0xf9, + 0x0a, 0x05, 0x00, 0x91, 0x0a, 0x08, 0x00, 0xf9, + 0x21, 0x79, 0x28, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x40, 0x00, 0xf8, 0x37, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyList_AppendTakeRefListResize+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyList_AppendTakeRefListResize); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x5c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); +} + +void +emit__LIST_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_EXTEND.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: f85f82b3 ldur x19, [x21, #-0x8] + // 14: 2a2803e8 mvn w8, w8 + // 18: aa1303e1 mov x1, x19 + // 1c: 531d7108 lsl w8, w8, #3 + // 20: b26db108 orr x8, x8, #0xfffffffffff80000 + // 24: f8686aa0 ldr x0, [x21, x8] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _PyList_Extend + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _PyList_Extend + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b4000120 cbz x0, 0x64 <_JIT_ENTRY+0x64> + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540005e0 b.eq 0x110 <_JIT_ENTRY+0x110> + // 58: d10022b5 sub x21, x21, #0x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: 90000017 adrp x23, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _PyErr_ExceptionMatches + // 6c: aa1603e0 mov x0, x22 + // 70: f94002f7 ldr x23, [x23] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // 74: f9002295 str x21, [x20, #0x40] + // 78: f94002e1 ldr x1, [x23] + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _PyErr_ExceptionMatches + // 80: d63f0100 blr x8 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 34000320 cbz w0, 0xf0 <_JIT_ENTRY+0xf0> + // 90: f9400668 ldr x8, [x19, #0x8] + // 94: f9406d08 ldr x8, [x8, #0xd8] + // 98: b50002c8 cbnz x8, 0xf0 <_JIT_ENTRY+0xf0> + // 9c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE PySequence_Check + // a0: aa1303e0 mov x0, x19 + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC PySequence_Check + // a8: d63f0100 blr x8 + // ac: 35000220 cbnz w0, 0xf0 <_JIT_ENTRY+0xf0> + // b0: f9002295 str x21, [x20, #0x40] + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _PyErr_Clear + // b8: aa1603e0 mov x0, x22 + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Clear + // c0: d63f0100 blr x8 + // c4: f9400668 ldr x8, [x19, #0x8] + // c8: f94002e1 ldr x1, [x23] + // cc: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 00000000000000cc: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // d0: 91000042 add x2, x2, #0x0 + // 00000000000000d0: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // d4: aa1603e0 mov x0, x22 + // d8: f9400d03 ldr x3, [x8, #0x18] + // dc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000dc: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // e0: f9400108 ldr x8, [x8] + // 00000000000000e0: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // e4: d63f0100 blr x8 + // e8: f9402295 ldr x21, [x20, #0x40] + // ec: f900229f str xzr, [x20, #0x40] + // f0: b9400268 ldr w8, [x19] + // f4: 37f80088 tbnz w8, #0x1f, 0x104 <_JIT_ENTRY+0x104> + // f8: 71000508 subs w8, w8, #0x1 + // fc: b9000268 str w8, [x19] + // 100: 54000160 b.eq 0x12c <_JIT_ENTRY+0x12c> + // 104: d10022b5 sub x21, x21, #0x8 + // 108: a8c17bfd ldp x29, x30, [sp], #0x10 + // 10c: 14000000 b 0x10c <_JIT_ENTRY+0x10c> + // 000000000000010c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 110: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000110: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 114: aa1303e0 mov x0, x19 + // 118: f9400108 ldr x8, [x8] + // 0000000000000118: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 11c: d63f0100 blr x8 + // 120: d10022b5 sub x21, x21, #0x8 + // 124: a8c17bfd ldp x29, x30, [sp], #0x10 + // 128: 14000000 b 0x128 <_JIT_ENTRY+0x128> + // 0000000000000128: R_AARCH64_JUMP26 _JIT_CONTINUE + // 12c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000012c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 130: aa1303e0 mov x0, x19 + // 134: f9400108 ldr x8, [x8] + // 0000000000000134: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 138: d63f0100 blr x8 + // 13c: d10022b5 sub x21, x21, #0x8 + // 140: a8c17bfd ldp x29, x30, [sp], #0x10 + // 144: 14000000 b 0x144 <_JIT_ENTRY+0x144> + // 0000000000000144: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[328] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0xe8, 0x03, 0x28, 0x2a, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xb4, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x05, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x17, 0x00, 0x00, 0x90, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0xf7, 0x02, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe1, 0x02, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x03, 0x00, 0x34, + 0x68, 0x06, 0x40, 0xf9, 0x08, 0x6d, 0x40, 0xf9, + 0xc8, 0x02, 0x00, 0xb5, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x20, 0x02, 0x00, 0x35, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x06, 0x40, 0xf9, + 0xe1, 0x02, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x03, 0x0d, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x01, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: 'Value after * must be an iterable, not %.200s\x00' + // 2e: 00 00 + // 30: OPARG + // 38: &_PyList_Extend+0x0 + // 40: &PyExc_TypeError+0x0 + // 48: &_PyErr_ExceptionMatches+0x0 + // 50: &PySequence_Check+0x0 + // 58: &_PyErr_Clear+0x0 + // 60: &_PyErr_Format+0x0 + // 68: &_Py_Dealloc+0x0 + const unsigned char data_body[112] = { + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, + 0x2e, 0x32, 0x30, 0x30, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, instruction->oparg); + patch_64(data + 0x38, (uintptr_t)&_PyList_Extend); + patch_64(data + 0x40, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x48, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x50, (uintptr_t)&PySequence_Check); + patch_64(data + 0x58, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x60, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x68, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x30); + patch_aarch64_12x(code + 0xc, (uintptr_t)data + 0x30); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x38); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x40); + patch_aarch64_21rx(code + 0x68, (uintptr_t)data + 0x48); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x40); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x48); + patch_aarch64_21rx(code + 0x9c, (uintptr_t)data + 0x50); + patch_aarch64_12x(code + 0xa4, (uintptr_t)data + 0x50); + patch_aarch64_21rx(code + 0xb4, (uintptr_t)data + 0x58); + patch_aarch64_12x(code + 0xbc, (uintptr_t)data + 0x58); + patch_aarch64_21r(code + 0xcc, (uintptr_t)data); + patch_aarch64_12(code + 0xd0, (uintptr_t)data); + patch_aarch64_33rx(code + 0xdc, (uintptr_t)data + 0x60); + patch_aarch64_26r(code + 0x10c, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x110, (uintptr_t)data + 0x68); + patch_aarch64_12x(code + 0x118, (uintptr_t)data + 0x68); + patch_aarch64_26r(code + 0x128, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x12c, (uintptr_t)data + 0x68); + patch_aarch64_12x(code + 0x134, (uintptr_t)data + 0x68); + patch_aarch64_26r(code + 0x144, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 90000017 adrp x23, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 910043fd add x29, sp, #0x10 + // 10: f94002f7 ldr x23, [x23] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400288 ldr x8, [x20] + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: f9401108 ldr x8, [x8, #0x20] + // 20: 53013ee9 ubfx w9, w23, #1, #15 + // 24: 8b294d08 add x8, x8, w9, uxtw #3 + // 28: f9400d01 ldr x1, [x8, #0x18] + // 2c: 37000297 tbnz w23, #0x0, 0x7c <_JIT_ENTRY+0x7c> + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE PyObject_GetAttr + // 38: aa1303e0 mov x0, x19 + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC PyObject_GetAttr + // 40: d63f0100 blr x8 + // 44: f9402298 ldr x24, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: b9400268 ldr w8, [x19] + // 50: 37f80088 tbnz w8, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 54: 71000508 subs w8, w8, #0x1 + // 58: b9000268 str w8, [x19] + // 5c: 540004e0 b.eq 0xf8 <_JIT_ENTRY+0xf8> + // 60: b40005a0 cbz x0, 0x114 <_JIT_ENTRY+0x114> + // 64: a9417bfd ldp x29, x30, [sp, #0x10] + // 68: 120002e8 and w8, w23, #0x1 + // 6c: 8b284f15 add x21, x24, w8, uxtw #3 + // 70: f81f8300 stur x0, [x24, #-0x8] + // 74: 910083ff add sp, sp, #0x20 + // 78: 14000000 b 0x78 <_JIT_ENTRY+0x78> + // 0000000000000078: R_AARCH64_JUMP26 _JIT_CONTINUE + // 7c: f90007ff str xzr, [sp, #0x8] + // 80: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000080: R_AARCH64_ADR_GOT_PAGE _PyObject_GetMethod + // 84: 910023e2 add x2, sp, #0x8 + // 88: f9002295 str x21, [x20, #0x40] + // 8c: aa1303e0 mov x0, x19 + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC _PyObject_GetMethod + // 94: d63f0100 blr x8 + // 98: f9402298 ldr x24, [x20, #0x40] + // 9c: f900229f str xzr, [x20, #0x40] + // a0: 34000060 cbz w0, 0xac <_JIT_ENTRY+0xac> + // a4: f94007e0 ldr x0, [sp, #0x8] + // a8: 1400000d b 0xdc <_JIT_ENTRY+0xdc> + // ac: b9400268 ldr w8, [x19] + // b0: 37f80108 tbnz w8, #0x1f, 0xd0 <_JIT_ENTRY+0xd0> + // b4: 71000508 subs w8, w8, #0x1 + // b8: b9000268 str w8, [x19] + // bc: 540000a1 b.ne 0xd0 <_JIT_ENTRY+0xd0> + // c0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c4: aa1303e0 mov x0, x19 + // c8: f9400108 ldr x8, [x8] + // 00000000000000c8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // cc: d63f0100 blr x8 + // d0: f94007e0 ldr x0, [sp, #0x8] + // d4: b4000200 cbz x0, 0x114 <_JIT_ENTRY+0x114> + // d8: aa1f03f3 mov x19, xzr + // dc: f90002b3 str x19, [x21] + // e0: a9417bfd ldp x29, x30, [sp, #0x10] + // e4: 120002e8 and w8, w23, #0x1 + // e8: 8b284f15 add x21, x24, w8, uxtw #3 + // ec: f81f8300 stur x0, [x24, #-0x8] + // f0: 910083ff add sp, sp, #0x20 + // f4: 14000000 b 0xf4 <_JIT_ENTRY+0xf4> + // 00000000000000f4: R_AARCH64_JUMP26 _JIT_CONTINUE + // f8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000f8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // fc: aa0003f5 mov x21, x0 + // 100: aa1303e0 mov x0, x19 + // 104: f9400108 ldr x8, [x8] + // 0000000000000104: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 108: d63f0100 blr x8 + // 10c: aa1503e0 mov x0, x21 + // 110: b5fffab5 cbnz x21, 0x64 <_JIT_ENTRY+0x64> + // 114: a9417bfd ldp x29, x30, [sp, #0x10] + // 118: d1002315 sub x21, x24, #0x8 + // 11c: 910083ff add sp, sp, #0x20 + // 120: 14000000 b 0x120 <_JIT_ENTRY+0x120> + // 0000000000000120: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 124: 00 00 00 00 + const unsigned char code_body[296] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0x17, 0x00, 0x00, 0x90, 0xfd, 0x43, 0x00, 0x91, + 0xf7, 0x02, 0x40, 0xf9, 0x88, 0x02, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x11, 0x40, 0xf9, + 0xe9, 0x3e, 0x01, 0x53, 0x08, 0x4d, 0x29, 0x8b, + 0x01, 0x0d, 0x40, 0xf9, 0x97, 0x02, 0x00, 0x37, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x04, 0x00, 0x54, + 0xa0, 0x05, 0x00, 0xb4, 0xfd, 0x7b, 0x41, 0xa9, + 0xe8, 0x02, 0x00, 0x12, 0x15, 0x4f, 0x28, 0x8b, + 0x00, 0x83, 0x1f, 0xf8, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xff, 0x07, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe2, 0x23, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x98, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x60, 0x00, 0x00, 0x34, 0xe0, 0x07, 0x40, 0xf9, + 0x0d, 0x00, 0x00, 0x14, 0x68, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x07, 0x40, 0xf9, 0x00, 0x02, 0x00, 0xb4, + 0xf3, 0x03, 0x1f, 0xaa, 0xb3, 0x02, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xe8, 0x02, 0x00, 0x12, + 0x15, 0x4f, 0x28, 0x8b, 0x00, 0x83, 0x1f, 0xf8, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf5, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0xaa, + 0xb5, 0xfa, 0xff, 0xb5, 0xfd, 0x7b, 0x41, 0xa9, + 0x15, 0x23, 0x00, 0xd1, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_GetAttr+0x0 + // 10: &_PyObject_GetMethod+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetAttr); + patch_64(data + 0x10, (uintptr_t)&_PyObject_GetMethod); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x90, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xc0, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xc8, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xf4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xf8, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x104, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x120, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_CLASS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000013 adrp x19, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f9400273 ldr x19, [x19] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: b9400268 ldr w8, [x19] + // 10: 37f80068 tbnz w8, #0x1f, 0x1c <_JIT_ENTRY+0x1c> + // 14: 11000508 add w8, w8, #0x1 + // 18: b9000268 str w8, [x19] + // 1c: b9400008 ldr w8, [x0] + // 20: 37f80088 tbnz w8, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // 24: 71000508 subs w8, w8, #0x1 + // 28: b9000008 str w8, [x0] + // 2c: 54000060 b.eq 0x38 <_JIT_ENTRY+0x38> + // 30: f81f82b3 stur x19, [x21, #-0x8] + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + // 38: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 3c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000003c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 40: 910003fd mov x29, sp + // 44: f9400108 ldr x8, [x8] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 48: d63f0100 blr x8 + // 4c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 50: f81f82b3 stur x19, [x21, #-0x8] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0x13, 0x00, 0x00, 0x90, 0x73, 0x02, 0x40, 0xf9, + 0xa0, 0x82, 0x5f, 0xf8, 0x68, 0x02, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x68, 0x02, 0x00, 0xb9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x60, 0x00, 0x00, 0x54, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_INSTANCE_VALUE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: 92403d08 and x8, x8, #0xffff + // 10: f8686808 ldr x8, [x0, x8] + // 14: b40001e8 cbz x8, 0x50 <_JIT_ENTRY+0x50> + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f81f82a8 stur x8, [x21, #-0x8] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: b9400008 ldr w8, [x0] + // 34: 37f80088 tbnz w8, #0x1f, 0x44 <_JIT_ENTRY+0x44> + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b9000008 str w8, [x0] + // 40: 540000a0 b.eq 0x54 <_JIT_ENTRY+0x54> + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 50: 14000000 b 0x50 <_JIT_ENTRY+0x50> + // 0000000000000050: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 54: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 58: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000058: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 5c: 910003fd mov x29, sp + // 60: f9400108 ldr x8, [x8] + // 0000000000000060: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 64: d63f0100 blr x8 + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: f9402295 ldr x21, [x20, #0x40] + // 70: f900229f str xzr, [x20, #0x40] + // 74: 14000000 b 0x74 <_JIT_ENTRY+0x74> + // 0000000000000074: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[120] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x3d, 0x40, 0x92, + 0x08, 0x68, 0x68, 0xf8, 0xe8, 0x01, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x82, 0x1f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x50, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x60, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x74, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_LAZY_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: aa1503e8 mov x8, x21 + // 8: f940014a ldr x10, [x10] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // c: f85f82a9 ldur x9, [x21, #-0x8] + // 10: b940014b ldr w11, [x10] + // 14: 37f8006b tbnz w11, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 18: 1100056b add w11, w11, #0x1 + // 1c: b900014b str w11, [x10] + // 20: 91002115 add x21, x8, #0x8 + // 24: a93fa50a stp x10, x9, [x8, #-0x8] + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x0a, 0x00, 0x00, 0x90, 0xe8, 0x03, 0x15, 0xaa, + 0x4a, 0x01, 0x40, 0xf9, 0xa9, 0x82, 0x5f, 0xf8, + 0x4b, 0x01, 0x40, 0xb9, 0x6b, 0x00, 0xf8, 0x37, + 0x6b, 0x05, 0x00, 0x11, 0x4b, 0x01, 0x00, 0xb9, + 0x15, 0x21, 0x00, 0x91, 0x0a, 0xa5, 0x3f, 0xa9, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); +} + +void +emit__LOAD_ATTR_METHOD_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_NO_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: aa1503e8 mov x8, x21 + // 8: f940014a ldr x10, [x10] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // c: f85f82a9 ldur x9, [x21, #-0x8] + // 10: b940014b ldr w11, [x10] + // 14: 37f8006b tbnz w11, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 18: 1100056b add w11, w11, #0x1 + // 1c: b900014b str w11, [x10] + // 20: 91002115 add x21, x8, #0x8 + // 24: a93fa50a stp x10, x9, [x8, #-0x8] + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x0a, 0x00, 0x00, 0x90, 0xe8, 0x03, 0x15, 0xaa, + 0x4a, 0x01, 0x40, 0xf9, 0xa9, 0x82, 0x5f, 0xf8, + 0x4b, 0x01, 0x40, 0xb9, 0x6b, 0x00, 0xf8, 0x37, + 0x6b, 0x05, 0x00, 0x11, 0x4b, 0x01, 0x00, 0xb9, + 0x15, 0x21, 0x00, 0x91, 0x0a, 0xa5, 0x3f, 0xa9, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); +} + +void +emit__LOAD_ATTR_METHOD_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_WITH_VALUES.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: aa1503e8 mov x8, x21 + // 8: f940014a ldr x10, [x10] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // c: f85f82a9 ldur x9, [x21, #-0x8] + // 10: b940014b ldr w11, [x10] + // 14: 37f8006b tbnz w11, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 18: 1100056b add w11, w11, #0x1 + // 1c: b900014b str w11, [x10] + // 20: 91002115 add x21, x8, #0x8 + // 24: a93fa50a stp x10, x9, [x8, #-0x8] + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x0a, 0x00, 0x00, 0x90, 0xe8, 0x03, 0x15, 0xaa, + 0x4a, 0x01, 0x40, 0xf9, 0xa9, 0x82, 0x5f, 0xf8, + 0x4b, 0x01, 0x40, 0xb9, 0x6b, 0x00, 0xf8, 0x37, + 0x6b, 0x05, 0x00, 0x11, 0x4b, 0x01, 0x00, 0xb9, + 0x15, 0x21, 0x00, 0x91, 0x0a, 0xa5, 0x3f, 0xa9, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); +} + +void +emit__LOAD_ATTR_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 5280002a mov w10, #0x1 // =1 + // 8: f9400808 ldr x8, [x0, #0x10] + // c: f9401108 ldr x8, [x8, #0x20] + // 10: 39402509 ldrb w9, [x8, #0x9] + // 14: 9ac92149 lsl x9, x10, x9 + // 18: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000018: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 1c: f940014a ldr x10, [x10] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 20: 8b090108 add x8, x8, x9 + // 24: 8b2a3108 add x8, x8, w10, uxth #4 + // 28: f9401513 ldr x19, [x8, #0x28] + // 2c: b4000193 cbz x19, 0x5c <_JIT_ENTRY+0x5c> + // 30: b9400268 ldr w8, [x19] + // 34: 37f80068 tbnz w8, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 38: 11000508 add w8, w8, #0x1 + // 3c: b9000268 str w8, [x19] + // 40: b9400008 ldr w8, [x0] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000008 str w8, [x0] + // 50: 54000080 b.eq 0x60 <_JIT_ENTRY+0x60> + // 54: f81f82b3 stur x19, [x21, #-0x8] + // 58: 14000000 b 0x58 <_JIT_ENTRY+0x58> + // 0000000000000058: R_AARCH64_JUMP26 _JIT_CONTINUE + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 60: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 910003fd mov x29, sp + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 70: d63f0100 blr x8 + // 74: a8c17bfd ldp x29, x30, [sp], #0x10 + // 78: f81f82b3 stur x19, [x21, #-0x8] + // 7c: 14000000 b 0x7c <_JIT_ENTRY+0x7c> + // 000000000000007c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[128] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x2a, 0x00, 0x80, 0x52, + 0x08, 0x08, 0x40, 0xf9, 0x08, 0x11, 0x40, 0xf9, + 0x09, 0x25, 0x40, 0x39, 0x49, 0x21, 0xc9, 0x9a, + 0x0a, 0x00, 0x00, 0x90, 0x4a, 0x01, 0x40, 0xf9, + 0x08, 0x01, 0x09, 0x8b, 0x08, 0x31, 0x2a, 0x8b, + 0x13, 0x15, 0x40, 0xf9, 0x93, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x68, 0x02, 0x00, 0xb9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0xb3, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x7c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE_FROM_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: f85f8ea9 ldr x9, [x21, #-0x8]! + // 8: 5280002b mov w11, #0x1 // =1 + // c: 3940252a ldrb w10, [x9, #0x9] + // 10: 9aca216a lsl x10, x11, x10 + // 14: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 18: f940016b ldr x11, [x11] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: 8b0a0129 add x9, x9, x10 + // 20: 8b2b3129 add x9, x9, w11, uxth #4 + // 24: f9401529 ldr x9, [x9, #0x28] + // 28: b4000209 cbz x9, 0x68 <_JIT_ENTRY+0x68> + // 2c: b940012a ldr w10, [x9] + // 30: f85f82a0 ldur x0, [x21, #-0x8] + // 34: 37f8006a tbnz w10, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 38: 1100054a add w10, w10, #0x1 + // 3c: b900012a str w10, [x9] + // 40: f81f0109 stur x9, [x8, #-0x10] + // 44: f9002295 str x21, [x20, #0x40] + // 48: b9400008 ldr w8, [x0] + // 4c: 37f80088 tbnz w8, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000008 str w8, [x0] + // 58: 540000a0 b.eq 0x6c <_JIT_ENTRY+0x6c> + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: 14000000 b 0x64 <_JIT_ENTRY+0x64> + // 0000000000000064: R_AARCH64_JUMP26 _JIT_CONTINUE + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 6c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 70: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 74: 910003fd mov x29, sp + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 7c: d63f0100 blr x8 + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: 14000000 b 0x8c <_JIT_ENTRY+0x8c> + // 000000000000008c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[144] = { + 0xe8, 0x03, 0x15, 0xaa, 0xa9, 0x8e, 0x5f, 0xf8, + 0x2b, 0x00, 0x80, 0x52, 0x2a, 0x25, 0x40, 0x39, + 0x6a, 0x21, 0xca, 0x9a, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x0a, 0x8b, + 0x29, 0x31, 0x2b, 0x8b, 0x29, 0x15, 0x40, 0xf9, + 0x09, 0x02, 0x00, 0xb4, 0x2a, 0x01, 0x40, 0xb9, + 0xa0, 0x82, 0x5f, 0xf8, 0x6a, 0x00, 0xf8, 0x37, + 0x4a, 0x05, 0x00, 0x11, 0x2a, 0x01, 0x00, 0xb9, + 0x09, 0x01, 0x1f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_NO_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: b9400008 ldr w8, [x0] + // 8: 37f80148 tbnz w8, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 540000e1 b.ne 0x30 <_JIT_ENTRY+0x30> + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 20: 910003fd mov x29, sp + // 24: f9400108 ldr x8, [x8] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 28: d63f0100 blr x8 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 38: b9400109 ldr w9, [x8] + // 3c: 37f80069 tbnz w9, #0x1f, 0x48 <_JIT_ENTRY+0x48> + // 40: 11000529 add w9, w9, #0x1 + // 44: b9000109 str w9, [x8] + // 48: f81f82a8 stur x8, [x21, #-0x8] + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x48, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xe1, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_12x(code + 0x24, (uintptr_t)data); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: b9400008 ldr w8, [x0] + // 8: 37f80148 tbnz w8, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 540000e1 b.ne 0x30 <_JIT_ENTRY+0x30> + // 18: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 1c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 20: 910003fd mov x29, sp + // 24: f9400108 ldr x8, [x8] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 28: d63f0100 blr x8 + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 38: b9400109 ldr w9, [x8] + // 3c: 37f80069 tbnz w9, #0x1f, 0x48 <_JIT_ENTRY+0x48> + // 40: 11000529 add w9, w9, #0x1 + // 44: b9000109 str w9, [x8] + // 48: f81f82a8 stur x8, [x21, #-0x8] + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x48, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xe1, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data); + patch_aarch64_12x(code + 0x24, (uintptr_t)data); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_PROPERTY_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_PROPERTY_FRAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: 528001aa mov w10, #0xd // =13 + // 8: f940016b ldr x11, [x11] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // c: f9401968 ldr x8, [x11, #0x30] + // 10: b9403109 ldr w9, [x8, #0x30] + // 14: 0a0a0129 and w9, w9, w10 + // 18: 7100053f cmp w9, #0x1 + // 1c: 540005e1 b.ne 0xd8 <_JIT_ENTRY+0xd8> + // 20: b9403d09 ldr w9, [x8, #0x3c] + // 24: 350005a9 cbnz w9, 0xd8 <_JIT_ENTRY+0xd8> + // 28: b9403509 ldr w9, [x8, #0x34] + // 2c: 7100053f cmp w9, #0x1 + // 30: 54000541 b.ne 0xd8 <_JIT_ENTRY+0xd8> + // 34: f9407ac9 ldr x9, [x22, #0xf0] + // 38: b4000509 cbz x9, 0xd8 <_JIT_ENTRY+0xd8> + // 3c: f9407eca ldr x10, [x22, #0xf8] + // 40: b9804d0c ldrsw x12, [x8, #0x4c] + // 44: cb09014a sub x10, x10, x9 + // 48: eb8a0d9f cmp x12, x10, asr #3 + // 4c: 5400046a b.ge 0xd8 <_JIT_ENTRY+0xd8> + // 50: b940016d ldr w13, [x11] + // 54: f85f82aa ldur x10, [x21, #-0x8] + // 58: 37f8006d tbnz w13, #0x1f, 0x64 <_JIT_ENTRY+0x64> + // 5c: 110005ad add w13, w13, #0x1 + // 60: b900016d str w13, [x11] + // 64: 8b0c0d2c add x12, x9, x12, lsl #3 + // 68: f9007acc str x12, [x22, #0xf0] + // 6c: a900ad34 stp x20, x11, [x9, #0x8] + // 70: b940010c ldr w12, [x8] + // 74: 37f8006c tbnz w12, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 78: 1100058c add w12, w12, #0x1 + // 7c: b900010c str w12, [x8] + // 80: f9000128 str x8, [x9] + // 84: 9103410d add x13, x8, #0xd0 + // 88: b980490c ldrsw x12, [x8, #0x48] + // 8c: 3dc00560 ldr q0, [x11, #0x10] + // 90: a902fd3f stp xzr, xzr, [x9, #0x28] + // 94: b900493f str wzr, [x9, #0x48] + // 98: 8b0c0d2b add x11, x9, x12, lsl #3 + // 9c: 7100099f cmp w12, #0x2 + // a0: 3c818120 stur q0, [x9, #0x18] + // a4: 9101416b add x11, x11, #0x50 + // a8: a903ad2d stp x13, x11, [x9, #0x38] + // ac: 5400010b b.lt 0xcc <_JIT_ENTRY+0xcc> + // b0: 9101612b add x11, x9, #0x58 + // b4: 5280002c mov w12, #0x1 // =1 + // b8: f800857f str xzr, [x11], #0x8 + // bc: 9100058c add x12, x12, #0x1 + // c0: b980490d ldrsw x13, [x8, #0x48] + // c4: eb0d019f cmp x12, x13 + // c8: 54ffff8b b.lt 0xb8 <_JIT_ENTRY+0xb8> + // cc: f900292a str x10, [x9, #0x50] + // d0: f81f82a9 stur x9, [x21, #-0x8] + // d4: 14000000 b 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d4: R_AARCH64_JUMP26 _JIT_CONTINUE + // d8: 14000000 b 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d8: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // dc: 00 00 00 00 + const unsigned char code_body[224] = { + 0x0b, 0x00, 0x00, 0x90, 0xaa, 0x01, 0x80, 0x52, + 0x6b, 0x01, 0x40, 0xf9, 0x68, 0x19, 0x40, 0xf9, + 0x09, 0x31, 0x40, 0xb9, 0x29, 0x01, 0x0a, 0x0a, + 0x3f, 0x05, 0x00, 0x71, 0xe1, 0x05, 0x00, 0x54, + 0x09, 0x3d, 0x40, 0xb9, 0xa9, 0x05, 0x00, 0x35, + 0x09, 0x35, 0x40, 0xb9, 0x3f, 0x05, 0x00, 0x71, + 0x41, 0x05, 0x00, 0x54, 0xc9, 0x7a, 0x40, 0xf9, + 0x09, 0x05, 0x00, 0xb4, 0xca, 0x7e, 0x40, 0xf9, + 0x0c, 0x4d, 0x80, 0xb9, 0x4a, 0x01, 0x09, 0xcb, + 0x9f, 0x0d, 0x8a, 0xeb, 0x6a, 0x04, 0x00, 0x54, + 0x6d, 0x01, 0x40, 0xb9, 0xaa, 0x82, 0x5f, 0xf8, + 0x6d, 0x00, 0xf8, 0x37, 0xad, 0x05, 0x00, 0x11, + 0x6d, 0x01, 0x00, 0xb9, 0x2c, 0x0d, 0x0c, 0x8b, + 0xcc, 0x7a, 0x00, 0xf9, 0x34, 0xad, 0x00, 0xa9, + 0x0c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x0c, 0x01, 0x00, 0xb9, + 0x28, 0x01, 0x00, 0xf9, 0x0d, 0x41, 0x03, 0x91, + 0x0c, 0x49, 0x80, 0xb9, 0x60, 0x05, 0xc0, 0x3d, + 0x3f, 0xfd, 0x02, 0xa9, 0x3f, 0x49, 0x00, 0xb9, + 0x2b, 0x0d, 0x0c, 0x8b, 0x9f, 0x09, 0x00, 0x71, + 0x20, 0x81, 0x81, 0x3c, 0x6b, 0x41, 0x01, 0x91, + 0x2d, 0xad, 0x03, 0xa9, 0x0b, 0x01, 0x00, 0x54, + 0x2b, 0x61, 0x01, 0x91, 0x2c, 0x00, 0x80, 0x52, + 0x7f, 0x85, 0x00, 0xf8, 0x8c, 0x05, 0x00, 0x91, + 0x0d, 0x49, 0x80, 0xb9, 0x9f, 0x01, 0x0d, 0xeb, + 0x8b, 0xff, 0xff, 0x54, 0x2a, 0x29, 0x00, 0xf9, + 0xa9, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0xd4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xd8, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_SLOT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 8: f85f82a0 ldur x0, [x21, #-0x8] + // c: 92403d08 and x8, x8, #0xffff + // 10: f8686813 ldr x19, [x0, x8] + // 14: b4000193 cbz x19, 0x44 <_JIT_ENTRY+0x44> + // 18: b9400268 ldr w8, [x19] + // 1c: 37f80068 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 20: 11000508 add w8, w8, #0x1 + // 24: b9000268 str w8, [x19] + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 54000080 b.eq 0x48 <_JIT_ENTRY+0x48> + // 3c: f81f82b3 stur x19, [x21, #-0x8] + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 48: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: 910003fd mov x29, sp + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: d63f0100 blr x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: f81f82b3 stur x19, [x21, #-0x8] + // 64: 14000000 b 0x64 <_JIT_ENTRY+0x64> + // 0000000000000064: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[104] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x3d, 0x40, 0x92, + 0x13, 0x68, 0x68, 0xf8, 0x93, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x68, 0x02, 0x00, 0xb9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0xb3, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0xb3, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_WITH_HINT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f3 mov x19, x21 + // 4: f85f8ea8 ldr x8, [x21, #-0x8]! + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // c: f9401108 ldr x8, [x8, #0x20] + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 14: f9400d0a ldr x10, [x8, #0x18] + // 18: 92403d29 and x9, x9, #0xffff + // 1c: eb09015f cmp x10, x9 + // 20: 54000269 b.ls 0x6c <_JIT_ENTRY+0x6c> + // 24: 3940290a ldrb w10, [x8, #0xa] + // 28: 7100055f cmp w10, #0x1 + // 2c: 54000201 b.ne 0x6c <_JIT_ENTRY+0x6c> + // 30: 3940250b ldrb w11, [x8, #0x9] + // 34: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 38: f940028a ldr x10, [x20] + // 3c: f940018c ldr x12, [x12] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 40: 5280002d mov w13, #0x1 // =1 + // 44: 9acb21ab lsl x11, x13, x11 + // 48: f940114a ldr x10, [x10, #0x20] + // 4c: 53013d8c ubfx w12, w12, #1, #15 + // 50: 8b0b0108 add x8, x8, x11 + // 54: 8b2c4d4a add x10, x10, w12, uxtw #3 + // 58: 8b091108 add x8, x8, x9, lsl #4 + // 5c: f9400d49 ldr x9, [x10, #0x18] + // 60: f8420d0a ldr x10, [x8, #0x20]! + // 64: eb09015f cmp x10, x9 + // 68: 54000040 b.eq 0x70 <_JIT_ENTRY+0x70> + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 70: f9400517 ldr x23, [x8, #0x8] + // 74: b4ffffd7 cbz x23, 0x6c <_JIT_ENTRY+0x6c> + // 78: b94002e8 ldr w8, [x23] + // 7c: f85f82a0 ldur x0, [x21, #-0x8] + // 80: 37f80068 tbnz w8, #0x1f, 0x8c <_JIT_ENTRY+0x8c> + // 84: 11000508 add w8, w8, #0x1 + // 88: b90002e8 str w8, [x23] + // 8c: b9400008 ldr w8, [x0] + // 90: 37f80148 tbnz w8, #0x1f, 0xb8 <_JIT_ENTRY+0xb8> + // 94: 71000508 subs w8, w8, #0x1 + // 98: b9000008 str w8, [x0] + // 9c: 540000e1 b.ne 0xb8 <_JIT_ENTRY+0xb8> + // a0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a8: 910003fd mov x29, sp + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // b0: d63f0100 blr x8 + // b4: a8c17bfd ldp x29, x30, [sp], #0x10 + // b8: f81f0277 stur x23, [x19, #-0x10] + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[192] = { + 0xf3, 0x03, 0x15, 0xaa, 0xa8, 0x8e, 0x5f, 0xf8, + 0x09, 0x00, 0x00, 0x90, 0x08, 0x11, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x0a, 0x0d, 0x40, 0xf9, + 0x29, 0x3d, 0x40, 0x92, 0x5f, 0x01, 0x09, 0xeb, + 0x69, 0x02, 0x00, 0x54, 0x0a, 0x29, 0x40, 0x39, + 0x5f, 0x05, 0x00, 0x71, 0x01, 0x02, 0x00, 0x54, + 0x0b, 0x25, 0x40, 0x39, 0x0c, 0x00, 0x00, 0x90, + 0x8a, 0x02, 0x40, 0xf9, 0x8c, 0x01, 0x40, 0xf9, + 0x2d, 0x00, 0x80, 0x52, 0xab, 0x21, 0xcb, 0x9a, + 0x4a, 0x11, 0x40, 0xf9, 0x8c, 0x3d, 0x01, 0x53, + 0x08, 0x01, 0x0b, 0x8b, 0x4a, 0x4d, 0x2c, 0x8b, + 0x08, 0x11, 0x09, 0x8b, 0x49, 0x0d, 0x40, 0xf9, + 0x0a, 0x0d, 0x42, 0xf8, 0x5f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x17, 0x05, 0x40, 0xf9, 0xd7, 0xff, 0xff, 0xb4, + 0xe8, 0x02, 0x40, 0xb9, 0xa0, 0x82, 0x5f, 0xf8, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0xe8, 0x02, 0x00, 0xb9, 0x08, 0x00, 0x40, 0xb9, + 0x48, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xe1, 0x00, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x77, 0x02, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: OPARG + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x6c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xbc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_BUILD_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_BUILD_CLASS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // c: f9401280 ldr x0, [x20, #0x20] + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 14: f9002295 str x21, [x20, #0x40] + // 18: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000018: R_AARCH64_ADR_GOT_PAGE PyMapping_GetOptionalItem + // 1c: 52924009 mov w9, #0x9200 // =37376 + // 20: f940014a ldr x10, [x10] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC PyMapping_GetOptionalItem + // 24: 910023e2 add x2, sp, #0x8 + // 28: 8b090101 add x1, x8, x9 + // 2c: 910043fd add x29, sp, #0x10 + // 30: d63f0140 blr x10 + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: 37f80260 tbnz w0, #0x1f, 0x88 <_JIT_ENTRY+0x88> + // 40: f94007e8 ldr x8, [sp, #0x8] + // 44: b40000a8 cbz x8, 0x58 <_JIT_ENTRY+0x58> + // 48: a9417bfd ldp x29, x30, [sp, #0x10] + // 4c: f80086a8 str x8, [x21], #0x8 + // 50: 910083ff add sp, sp, #0x20 + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + // 58: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000058: R_AARCH64_ADR_GOT_PAGE PyExc_NameError + // 5c: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 60: 91000042 add x2, x2, #0x0 + // 0000000000000060: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC PyExc_NameError + // 68: f9002295 str x21, [x20, #0x40] + // 6c: aa1603e0 mov x0, x22 + // 70: f9400101 ldr x1, [x8] + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _PyErr_SetString + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _PyErr_SetString + // 7c: d63f0100 blr x8 + // 80: f9402295 ldr x21, [x20, #0x40] + // 84: f900229f str xzr, [x20, #0x40] + // 88: a9417bfd ldp x29, x30, [sp, #0x10] + // 8c: 910083ff add sp, sp, #0x20 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 94: 00 00 00 00 + const unsigned char code_body[152] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x80, 0x12, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x0a, 0x00, 0x00, 0x90, 0x09, 0x40, 0x92, 0x52, + 0x4a, 0x01, 0x40, 0xf9, 0xe2, 0x23, 0x00, 0x91, + 0x01, 0x01, 0x09, 0x8b, 0xfd, 0x43, 0x00, 0x91, + 0x40, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x60, 0x02, 0xf8, 0x37, + 0xe8, 0x07, 0x40, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0xfd, 0x7b, 0x41, 0xa9, 0xa8, 0x86, 0x00, 0xf8, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x01, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '__build_class__ not found\x00' + // 1a: 00 00 00 00 00 00 + // 20: &_PyRuntime+0x0 + // 28: &PyMapping_GetOptionalItem+0x0 + // 30: &PyExc_NameError+0x0 + // 38: &_PyErr_SetString+0x0 + const unsigned char data_body[64] = { + 0x5f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x5f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&_PyRuntime); + patch_64(data + 0x28, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x30, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x38, (uintptr_t)&_PyErr_SetString); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x10, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0x18, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x28); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x58, (uintptr_t)data + 0x30); + patch_aarch64_21r(code + 0x5c, (uintptr_t)data); + patch_aarch64_12(code + 0x60, (uintptr_t)data); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x30); + patch_aarch64_33rx(code + 0x74, (uintptr_t)data + 0x38); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_COMMON_CONSTANT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_COMMON_CONSTANT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyExc_AssertionError + // 8: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyExc_NotImplementedError + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyExc_AssertionError + // 14: f940014a ldr x10, [x10] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyExc_NotImplementedError + // 18: 72003d1f tst w8, #0xffff + // 1c: 9a8a0128 csel x8, x9, x10, eq + // 20: f9400108 ldr x8, [x8] + // 24: f80086a8 str x8, [x21], #0x8 + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x0a, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x1f, 0x3d, 0x00, 0x72, 0x28, 0x01, 0x8a, 0x9a, + 0x08, 0x01, 0x40, 0xf9, 0xa8, 0x86, 0x00, 0xf8, + }; + // 0: OPARG + // 8: &PyExc_AssertionError+0x0 + // 10: &PyExc_NotImplementedError+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyExc_AssertionError); + patch_64(data + 0x10, (uintptr_t)&PyExc_NotImplementedError); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x10); +} + +void +emit__LOAD_CONST_IMMORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_IMMORTAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400288 ldr x8, [x20] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: f9400d08 ldr x8, [x8, #0x18] + // 10: 8b292d08 add x8, x8, w9, uxth #3 + // 14: f9400d08 ldr x8, [x8, #0x18] + // 18: f80086a8 str x8, [x21], #0x8 + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0x88, 0x02, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x08, 0x0d, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x08, 0x0d, 0x40, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 8: b9400109 ldr w9, [x8] + // c: 37f80069 tbnz w9, #0x1f, 0x18 <_JIT_ENTRY+0x18> + // 10: 11000529 add w9, w9, #0x1 + // 14: b9000109 str w9, [x8] + // 18: f80086a8 str x8, [x21], #0x8 + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE_BORROW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 8: f80086a8 str x8, [x21], #0x8 + // c: 14000000 b 0xc <_JIT_ENTRY+0xc> + // 000000000000000c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[16] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_CONST_MORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_MORTAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400288 ldr x8, [x20] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: f9400d08 ldr x8, [x8, #0x18] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 8b292d08 add x8, x8, w9, uxth #3 + // 14: f9400d08 ldr x8, [x8, #0x18] + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0x88, 0x02, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x0d, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x08, 0x0d, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_DEREF.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 8b282e88 add x8, x20, w8, uxth #3 + // c: f9402908 ldr x8, [x8, #0x50] + // 10: f9400908 ldr x8, [x8, #0x10] + // 14: b40000e8 cbz x8, 0x30 <_JIT_ENTRY+0x30> + // 18: b9400109 ldr w9, [x8] + // 1c: 37f80069 tbnz w9, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 20: 11000529 add w9, w9, #0x1 + // 24: b9000109 str w9, [x8] + // 28: f80086a8 str x8, [x21], #0x8 + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 38: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcUnbound + // 3c: aa1603e0 mov x0, x22 + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 44: f9002295 str x21, [x20, #0x40] + // 48: f9400281 ldr x1, [x20] + // 4c: f9400129 ldr x9, [x9] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcUnbound + // 50: 910003fd mov x29, sp + // 54: 12003d02 and w2, w8, #0xffff + // 58: d63f0120 blr x9 + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: a8c17bfd ldp x29, x30, [sp], #0x10 + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 6c: 00 00 00 00 + const unsigned char code_body[112] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x08, 0x09, 0x40, 0xf9, 0xe8, 0x00, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x81, 0x02, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x02, 0x3d, 0x00, 0x12, + 0x20, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_FormatExcUnbound+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_FormatExcUnbound); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 8b282e88 add x8, x20, w8, uxth #3 + // c: f9402908 ldr x8, [x8, #0x50] + // 10: b9400109 ldr w9, [x8] + // 14: 37f80069 tbnz w9, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 18: 11000529 add w9, w9, #0x1 + // 1c: b9000109 str w9, [x8] + // 20: f80086a8 str x8, [x21], #0x8 + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_0.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9402a88 ldr x8, [x20, #0x50] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x2a, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9402e88 ldr x8, [x20, #0x58] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x2e, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_2.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9403288 ldr x8, [x20, #0x60] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x32, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_3.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9403688 ldr x8, [x20, #0x68] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x36, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_4.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9403a88 ldr x8, [x20, #0x70] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x3a, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_5.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9403e88 ldr x8, [x20, #0x78] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x3e, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_6.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9404288 ldr x8, [x20, #0x80] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x42, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_7.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9404688 ldr x8, [x20, #0x88] + // 4: b9400109 ldr w9, [x8] + // 8: 37f80069 tbnz w9, #0x1f, 0x14 <_JIT_ENTRY+0x14> + // c: 11000529 add w9, w9, #0x1 + // 10: b9000109 str w9, [x8] + // 14: f80086a8 str x8, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x88, 0x46, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_AND_CLEAR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_AND_CLEAR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 8b282e88 add x8, x20, w8, uxth #3 + // c: f9402909 ldr x9, [x8, #0x50] + // 10: f900291f str xzr, [x8, #0x50] + // 14: f80086a9 str x9, [x21], #0x8 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x09, 0x29, 0x40, 0xf9, + 0x1f, 0x29, 0x00, 0xf9, 0xa9, 0x86, 0x00, 0xf8, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); +} + +void +emit__LOAD_FAST_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_CHECK.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 8b282e89 add x9, x20, w8, uxth #3 + // c: f9402929 ldr x9, [x9, #0x50] + // 10: b40000e9 cbz x9, 0x2c <_JIT_ENTRY+0x2c> + // 14: b9400128 ldr w8, [x9] + // 18: 37f80068 tbnz w8, #0x1f, 0x24 <_JIT_ENTRY+0x24> + // 1c: 11000508 add w8, w8, #0x1 + // 20: b9000128 str w8, [x9] + // 24: f80086a9 str x9, [x21], #0x8 + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_CONTINUE + // 2c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 30: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE PyExc_UnboundLocalError + // 34: 92403d01 and x1, x8, #0xffff + // 38: 910003fd mov x29, sp + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC PyExc_UnboundLocalError + // 40: f940028a ldr x10, [x20] + // 44: f9002295 str x21, [x20, #0x40] + // 48: f9400133 ldr x19, [x9] + // 4c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE PyTuple_GetItem + // 50: f9403140 ldr x0, [x10, #0x60] + // 54: f9400129 ldr x9, [x9] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC PyTuple_GetItem + // 58: d63f0120 blr x9 + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcCheckArg + // 60: aa0003e3 mov x3, x0 + // 64: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 68: 91000042 add x2, x2, #0x0 + // 0000000000000068: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcCheckArg + // 70: aa1603e0 mov x0, x22 + // 74: aa1303e1 mov x1, x19 + // 78: d63f0100 blr x8 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x89, 0x2e, 0x28, 0x8b, 0x29, 0x29, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x28, 0x01, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x28, 0x01, 0x00, 0xb9, 0xa9, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x09, 0x00, 0x00, 0x90, 0x01, 0x3d, 0x40, 0x92, + 0xfd, 0x03, 0x00, 0x91, 0x29, 0x01, 0x40, 0xf9, + 0x8a, 0x02, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x33, 0x01, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x40, 0x31, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x20, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0xe3, 0x03, 0x00, 0xaa, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: OPARG + // 58: &PyExc_UnboundLocalError+0x0 + // 60: &PyTuple_GetItem+0x0 + // 68: &_PyEval_FormatExcCheckArg+0x0 + const unsigned char data_body[112] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, instruction->oparg); + patch_64(data + 0x58, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x60, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x68, (uintptr_t)&_PyEval_FormatExcCheckArg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x30, (uintptr_t)data + 0x58); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x58); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x60); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x60); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x68); + patch_aarch64_21r(code + 0x64, (uintptr_t)data); + patch_aarch64_12(code + 0x68, (uintptr_t)data); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x68); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_FROM_DICT_OR_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FROM_DICT_OR_DEREF.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: f9400288 ldr x8, [x20] + // 8: a9017bfd stp x29, x30, [sp, #0x10] + // c: 90000017 adrp x23, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 10: 910023e2 add x2, sp, #0x8 + // 14: 910043fd add x29, sp, #0x10 + // 18: f9403108 ldr x8, [x8, #0x60] + // 1c: f94002f7 ldr x23, [x23] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 20: f85f82b3 ldur x19, [x21, #-0x8] + // 24: 8b372d08 add x8, x8, w23, uxth #3 + // 28: aa1303e0 mov x0, x19 + // 2c: f9400d01 ldr x1, [x8, #0x18] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE PyMapping_GetOptionalItem + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC PyMapping_GetOptionalItem + // 3c: d63f0100 blr x8 + // 40: f9402295 ldr x21, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: 37f806a0 tbnz w0, #0x1f, 0x11c <_JIT_ENTRY+0x11c> + // 4c: f94007e8 ldr x8, [sp, #0x8] + // 50: b4000168 cbz x8, 0x7c <_JIT_ENTRY+0x7c> + // 54: d10022a9 sub x9, x21, #0x8 + // 58: f9002289 str x9, [x20, #0x40] + // 5c: b9400269 ldr w9, [x19] + // 60: 36f802a9 tbz w9, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 64: f9402295 ldr x21, [x20, #0x40] + // 68: a9417bfd ldp x29, x30, [sp, #0x10] + // 6c: f900229f str xzr, [x20, #0x40] + // 70: f80086a8 str x8, [x21], #0x8 + // 74: 910083ff add sp, sp, #0x20 + // 78: 14000000 b 0x78 <_JIT_ENTRY+0x78> + // 0000000000000078: R_AARCH64_JUMP26 _JIT_CONTINUE + // 7c: 92403ee8 and x8, x23, #0xffff + // 80: 8b080e88 add x8, x20, x8, lsl #3 + // 84: f9402908 ldr x8, [x8, #0x50] + // 88: f9400908 ldr x8, [x8, #0x10] + // 8c: b4000308 cbz x8, 0xec <_JIT_ENTRY+0xec> + // 90: b9400109 ldr w9, [x8] + // 94: 37f80069 tbnz w9, #0x1f, 0xa0 <_JIT_ENTRY+0xa0> + // 98: 11000529 add w9, w9, #0x1 + // 9c: b9000109 str w9, [x8] + // a0: f90007e8 str x8, [sp, #0x8] + // a4: d10022a9 sub x9, x21, #0x8 + // a8: f9002289 str x9, [x20, #0x40] + // ac: b9400269 ldr w9, [x19] + // b0: 37fffda9 tbnz w9, #0x1f, 0x64 <_JIT_ENTRY+0x64> + // b4: 71000529 subs w9, w9, #0x1 + // b8: b9000269 str w9, [x19] + // bc: 54fffd41 b.ne 0x64 <_JIT_ENTRY+0x64> + // c0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c4: aa1303e0 mov x0, x19 + // c8: f9400108 ldr x8, [x8] + // 00000000000000c8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // cc: d63f0100 blr x8 + // d0: f94007e8 ldr x8, [sp, #0x8] + // d4: f9402295 ldr x21, [x20, #0x40] + // d8: a9417bfd ldp x29, x30, [sp, #0x10] + // dc: f900229f str xzr, [x20, #0x40] + // e0: f80086a8 str x8, [x21], #0x8 + // e4: 910083ff add sp, sp, #0x20 + // e8: 14000000 b 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e8: R_AARCH64_JUMP26 _JIT_CONTINUE + // ec: f90007ff str xzr, [sp, #0x8] + // f0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000f0: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // f4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000f4: R_AARCH64_ADR_GOT_PAGE _PyEval_FormatExcUnbound + // f8: f9400108 ldr x8, [x8] + // 00000000000000f8: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // fc: f9002295 str x21, [x20, #0x40] + // 100: f9400281 ldr x1, [x20] + // 104: f9400129 ldr x9, [x9] + // 0000000000000104: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FormatExcUnbound + // 108: aa1603e0 mov x0, x22 + // 10c: 12003d02 and w2, w8, #0xffff + // 110: d63f0120 blr x9 + // 114: f9402295 ldr x21, [x20, #0x40] + // 118: f900229f str xzr, [x20, #0x40] + // 11c: a9417bfd ldp x29, x30, [sp, #0x10] + // 120: 910083ff add sp, sp, #0x20 + // 124: 14000000 b 0x124 <_JIT_ENTRY+0x124> + // 0000000000000124: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[296] = { + 0xff, 0x83, 0x00, 0xd1, 0x88, 0x02, 0x40, 0xf9, + 0xfd, 0x7b, 0x01, 0xa9, 0x17, 0x00, 0x00, 0x90, + 0xe2, 0x23, 0x00, 0x91, 0xfd, 0x43, 0x00, 0x91, + 0x08, 0x31, 0x40, 0xf9, 0xf7, 0x02, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0x08, 0x2d, 0x37, 0x8b, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x06, 0xf8, 0x37, 0xe8, 0x07, 0x40, 0xf9, + 0x68, 0x01, 0x00, 0xb4, 0xa9, 0x22, 0x00, 0xd1, + 0x89, 0x22, 0x00, 0xf9, 0x69, 0x02, 0x40, 0xb9, + 0xa9, 0x02, 0xf8, 0x36, 0x95, 0x22, 0x40, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0x9f, 0x22, 0x00, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xe8, 0x3e, 0x40, 0x92, + 0x88, 0x0e, 0x08, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x08, 0x09, 0x40, 0xf9, 0x08, 0x03, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xe8, 0x07, 0x00, 0xf9, 0xa9, 0x22, 0x00, 0xd1, + 0x89, 0x22, 0x00, 0xf9, 0x69, 0x02, 0x40, 0xb9, + 0xa9, 0xfd, 0xff, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x69, 0x02, 0x00, 0xb9, 0x41, 0xfd, 0xff, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x07, 0x40, 0xf9, 0x95, 0x22, 0x40, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0x9f, 0x22, 0x00, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xff, 0x07, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x81, 0x02, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0x02, 0x3d, 0x00, 0x12, + 0x20, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0x41, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMapping_GetOptionalItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_PyEval_FormatExcUnbound+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_PyEval_FormatExcUnbound); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x78, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xc0, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xc8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xe8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xf0, (uintptr_t)data); + patch_aarch64_21rx(code + 0xf4, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xf8, (uintptr_t)data); + patch_aarch64_12x(code + 0x104, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x124, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: f9400288 ldr x8, [x20] + // c: aa1503e3 mov x3, x21 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: a9418680 ldp x0, x1, [x20, #0x18] + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: 910003fd mov x29, sp + // 20: aa1503f3 mov x19, x21 + // 24: 53013d29 ubfx w9, w9, #1, #15 + // 28: 8b294d08 add x8, x8, w9, uxtw #3 + // 2c: f9400d02 ldr x2, [x8, #0x18] + // 30: f9002295 str x21, [x20, #0x40] + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _PyEval_LoadGlobalStackRef + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC _PyEval_LoadGlobalStackRef + // 3c: d63f0100 blr x8 + // 40: f9402295 ldr x21, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: f9400268 ldr x8, [x19] + // 4c: b4000088 cbz x8, 0x5c <_JIT_ENTRY+0x5c> + // 50: 910022b5 add x21, x21, #0x8 + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: 14000000 b 0x58 <_JIT_ENTRY+0x58> + // 0000000000000058: R_AARCH64_JUMP26 _JIT_CONTINUE + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 64: 00 00 00 00 + const unsigned char code_body[104] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x88, 0x02, 0x40, 0xf9, 0xe3, 0x03, 0x15, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0x80, 0x86, 0x41, 0xa9, + 0x08, 0x11, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x03, 0x15, 0xaa, 0x29, 0x3d, 0x01, 0x53, + 0x08, 0x4d, 0x29, 0x8b, 0x02, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xf9, 0x88, 0x00, 0x00, 0xb4, + 0xb5, 0x22, 0x00, 0x91, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_LoadGlobalStackRef+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_LoadGlobalStackRef); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_GLOBAL_BUILTINS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9401288 ldr x8, [x20, #0x20] + // 4: 5280002a mov w10, #0x1 // =1 + // 8: f9401108 ldr x8, [x8, #0x20] + // c: 39402509 ldrb w9, [x8, #0x9] + // 10: 9ac92149 lsl x9, x10, x9 + // 14: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 18: f940014a ldr x10, [x10] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: 8b090108 add x8, x8, x9 + // 20: 8b2a3108 add x8, x8, w10, uxth #4 + // 24: f9401508 ldr x8, [x8, #0x28] + // 28: b40000e8 cbz x8, 0x44 <_JIT_ENTRY+0x44> + // 2c: b9400109 ldr w9, [x8] + // 30: 37f80069 tbnz w9, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 34: 11000529 add w9, w9, #0x1 + // 38: b9000109 str w9, [x8] + // 3c: f80086a8 str x8, [x21], #0x8 + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0x88, 0x12, 0x40, 0xf9, 0x2a, 0x00, 0x80, 0x52, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x25, 0x40, 0x39, + 0x49, 0x21, 0xc9, 0x9a, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0x08, 0x31, 0x2a, 0x8b, 0x08, 0x15, 0x40, 0xf9, + 0xe8, 0x00, 0x00, 0xb4, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS_FROM_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: 5280002b mov w11, #0x1 // =1 + // 8: f85f8d09 ldr x9, [x8, #-0x8]! + // c: 3940252a ldrb w10, [x9, #0x9] + // 10: 9aca216a lsl x10, x11, x10 + // 14: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 18: f940016b ldr x11, [x11] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: 8b0a0129 add x9, x9, x10 + // 20: 8b2b3129 add x9, x9, w11, uxth #4 + // 24: f9401529 ldr x9, [x9, #0x28] + // 28: b40000e9 cbz x9, 0x44 <_JIT_ENTRY+0x44> + // 2c: b9400128 ldr w8, [x9] + // 30: 37f80068 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 34: 11000508 add w8, w8, #0x1 + // 38: b9000128 str w8, [x9] + // 3c: f81f82a9 stur x9, [x21, #-0x8] + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: aa0803f5 mov x21, x8 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xe8, 0x03, 0x15, 0xaa, 0x2b, 0x00, 0x80, 0x52, + 0x09, 0x8d, 0x5f, 0xf8, 0x2a, 0x25, 0x40, 0x39, + 0x6a, 0x21, 0xca, 0x9a, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x0a, 0x8b, + 0x29, 0x31, 0x2b, 0x8b, 0x29, 0x15, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x28, 0x01, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x28, 0x01, 0x00, 0xb9, 0xa9, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_GLOBAL_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400e88 ldr x8, [x20, #0x18] + // 4: 5280002a mov w10, #0x1 // =1 + // 8: f9401108 ldr x8, [x8, #0x20] + // c: 39402509 ldrb w9, [x8, #0x9] + // 10: 9ac92149 lsl x9, x10, x9 + // 14: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 18: f940014a ldr x10, [x10] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: 8b090108 add x8, x8, x9 + // 20: 8b2a3108 add x8, x8, w10, uxth #4 + // 24: f9401508 ldr x8, [x8, #0x28] + // 28: b40000e8 cbz x8, 0x44 <_JIT_ENTRY+0x44> + // 2c: b9400109 ldr w9, [x8] + // 30: 37f80069 tbnz w9, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 34: 11000529 add w9, w9, #0x1 + // 38: b9000109 str w9, [x8] + // 3c: f80086a8 str x8, [x21], #0x8 + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0x88, 0x0e, 0x40, 0xf9, 0x2a, 0x00, 0x80, 0x52, + 0x08, 0x11, 0x40, 0xf9, 0x09, 0x25, 0x40, 0x39, + 0x49, 0x21, 0xc9, 0x9a, 0x0a, 0x00, 0x00, 0x90, + 0x4a, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0x08, 0x31, 0x2a, 0x8b, 0x08, 0x15, 0x40, 0xf9, + 0xe8, 0x00, 0x00, 0xb4, 0x09, 0x01, 0x40, 0xb9, + 0x69, 0x00, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x11, + 0x09, 0x01, 0x00, 0xb9, 0xa8, 0x86, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_GLOBAL_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE_FROM_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: 5280002b mov w11, #0x1 // =1 + // 8: f85f8d09 ldr x9, [x8, #-0x8]! + // c: 3940252a ldrb w10, [x9, #0x9] + // 10: 9aca216a lsl x10, x11, x10 + // 14: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 18: f940016b ldr x11, [x11] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 1c: 8b0a0129 add x9, x9, x10 + // 20: 8b2b3129 add x9, x9, w11, uxth #4 + // 24: f9401529 ldr x9, [x9, #0x28] + // 28: b40000e9 cbz x9, 0x44 <_JIT_ENTRY+0x44> + // 2c: b9400128 ldr w8, [x9] + // 30: 37f80068 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 34: 11000508 add w8, w8, #0x1 + // 38: b9000128 str w8, [x9] + // 3c: f81f82a9 stur x9, [x21, #-0x8] + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: aa0803f5 mov x21, x8 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 4c: 00 00 00 00 + const unsigned char code_body[80] = { + 0xe8, 0x03, 0x15, 0xaa, 0x2b, 0x00, 0x80, 0x52, + 0x09, 0x8d, 0x5f, 0xf8, 0x2a, 0x25, 0x40, 0x39, + 0x6a, 0x21, 0xca, 0x9a, 0x0b, 0x00, 0x00, 0x90, + 0x6b, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x0a, 0x8b, + 0x29, 0x31, 0x2b, 0x8b, 0x29, 0x15, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x28, 0x01, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0x28, 0x01, 0x00, 0xb9, 0xa9, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0xf5, 0x03, 0x08, 0xaa, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x14, (uintptr_t)data); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x48, state->instruction_starts[instruction->jump_target]); +} + +void +emit__LOAD_LOCALS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_LOCALS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9401688 ldr x8, [x20, #0x28] + // 4: b40000e8 cbz x8, 0x20 <_JIT_ENTRY+0x20> + // 8: b9400109 ldr w9, [x8] + // c: 37f80069 tbnz w9, #0x1f, 0x18 <_JIT_ENTRY+0x18> + // 10: 11000529 add w9, w9, #0x1 + // 14: b9000109 str w9, [x8] + // 18: f80086a8 str x8, [x21], #0x8 + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 20: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 24: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE PyExc_SystemError + // 28: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 2c: 91000042 add x2, x2, #0x0 + // 000000000000002c: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PyExc_SystemError + // 34: f9002295 str x21, [x20, #0x40] + // 38: aa1603e0 mov x0, x22 + // 3c: 910003fd mov x29, sp + // 40: f9400101 ldr x1, [x8] + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _PyErr_SetString + // 48: f9400108 ldr x8, [x8] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC _PyErr_SetString + // 4c: d63f0100 blr x8 + // 50: f9402295 ldr x21, [x20, #0x40] + // 54: f900229f str xzr, [x20, #0x40] + // 58: a8c17bfd ldp x29, x30, [sp], #0x10 + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[96] = { + 0x88, 0x16, 0x40, 0xf9, 0xe8, 0x00, 0x00, 0xb4, + 0x09, 0x01, 0x40, 0xb9, 0x69, 0x00, 0xf8, 0x37, + 0x29, 0x05, 0x00, 0x11, 0x09, 0x01, 0x00, 0xb9, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x01, 0x01, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: 'no locals found\x00' + // 10: &PyExc_SystemError+0x0 + // 18: &_PyErr_SetString+0x0 + const unsigned char data_body[32] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x10, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x18, (uintptr_t)&_PyErr_SetString); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x24, (uintptr_t)data + 0x10); + patch_aarch64_21r(code + 0x28, (uintptr_t)data); + patch_aarch64_12(code + 0x2c, (uintptr_t)data); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x44, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x5c, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_NAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: aa1603e0 mov x0, x22 + // 10: aa1403e1 mov x1, x20 + // 14: 910003fd mov x29, sp + // 18: f9401108 ldr x8, [x8, #0x20] + // 1c: f9400129 ldr x9, [x9] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 20: 8b292d08 add x8, x8, w9, uxth #3 + // 24: f9400d02 ldr x2, [x8, #0x18] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _PyEval_LoadName + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _PyEval_LoadName + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b4000080 cbz x0, 0x50 <_JIT_ENTRY+0x50> + // 44: f80086a0 str x0, [x21], #0x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 50: a8c17bfd ldp x29, x30, [sp], #0x10 + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[88] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x14, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0x02, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyEval_LoadName+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_LoadName); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x54, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_SMALL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 10: 92403d08 and x8, x8, #0xffff + // 14: 8b081528 add x8, x9, x8, lsl #5 + // 18: 5286df09 mov w9, #0x36f8 // =14072 + // 1c: 8b090108 add x8, x8, x9 + // 20: f80086a8 str x8, [x21], #0x8 + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x08, 0x3d, 0x40, 0x92, 0x28, 0x15, 0x08, 0x8b, + 0x09, 0xdf, 0x86, 0x52, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_0.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 4: 5286df09 mov w9, #0x36f8 // =14072 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0xdf, 0x86, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 4: 5286e309 mov w9, #0x3718 // =14104 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0xe3, 0x86, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_2.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 4: 5286e709 mov w9, #0x3738 // =14136 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0xe7, 0x86, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SMALL_INT_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_3.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 4: 5286eb09 mov w9, #0x3758 // =14168 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // c: 8b090108 add x8, x8, x9 + // 10: f80086a8 str x8, [x21], #0x8 + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0xeb, 0x86, 0x52, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x09, 0x8b, + 0xa8, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__LOAD_SPECIAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SPECIAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE _Py_SpecialMethods + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _Py_SpecialMethods + // 18: 910023e2 add x2, sp, #0x8 + // 1c: f85f8eb3 ldr x19, [x21, #-0x8]! + // 20: f9002295 str x21, [x20, #0x40] + // 24: 8b283137 add x23, x9, w8, uxth #4 + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _PyObject_LookupSpecialMethod + // 2c: 910043fd add x29, sp, #0x10 + // 30: aa1303e0 mov x0, x19 + // 34: f94002e1 ldr x1, [x23] + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC _PyObject_LookupSpecialMethod + // 3c: d63f0100 blr x8 + // 40: f9402288 ldr x8, [x20, #0x40] + // 44: f900229f str xzr, [x20, #0x40] + // 48: b40000e0 cbz x0, 0x64 <_JIT_ENTRY+0x64> + // 4c: f94007e9 ldr x9, [sp, #0x8] + // 50: a9417bfd ldp x29, x30, [sp, #0x10] + // 54: 91004115 add x21, x8, #0x10 + // 58: a9002500 stp x0, x9, [x8] + // 5c: 910083ff add sp, sp, #0x20 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: f9403ac9 ldr x9, [x22, #0x70] + // 68: b40000e9 cbz x9, 0x84 <_JIT_ENTRY+0x84> + // 6c: f9400529 ldr x9, [x9, #0x8] + // 70: b40000a9 cbz x9, 0x84 <_JIT_ENTRY+0x84> + // 74: a9417bfd ldp x29, x30, [sp, #0x10] + // 78: aa0803f5 mov x21, x8 + // 7c: 910083ff add sp, sp, #0x20 + // 80: 14000000 b 0x80 <_JIT_ENTRY+0x80> + // 0000000000000080: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 84: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE PyExc_TypeError + // 88: aa1603e0 mov x0, x22 + // 8c: f9400129 ldr x9, [x9] + // 000000000000008c: R_AARCH64_LD64_GOT_LO12_NC PyExc_TypeError + // 90: f940066a ldr x10, [x19, #0x8] + // 94: f9002288 str x8, [x20, #0x40] + // 98: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000098: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // 9c: f94006e2 ldr x2, [x23, #0x8] + // a0: f9400121 ldr x1, [x9] + // a4: f9400d43 ldr x3, [x10, #0x18] + // a8: f9400108 ldr x8, [x8] + // 00000000000000a8: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // ac: d63f0100 blr x8 + // b0: f9402288 ldr x8, [x20, #0x40] + // b4: f900229f str xzr, [x20, #0x40] + // b8: a9417bfd ldp x29, x30, [sp, #0x10] + // bc: aa0803f5 mov x21, x8 + // c0: 910083ff add sp, sp, #0x20 + // c4: 14000000 b 0xc4 <_JIT_ENTRY+0xc4> + // 00000000000000c4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[200] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xe2, 0x23, 0x00, 0x91, 0xb3, 0x8e, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x37, 0x31, 0x28, 0x8b, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x43, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x02, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe0, 0x00, 0x00, 0xb4, 0xe9, 0x07, 0x40, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0x15, 0x41, 0x00, 0x91, + 0x00, 0x25, 0x00, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xc9, 0x3a, 0x40, 0xf9, + 0xe9, 0x00, 0x00, 0xb4, 0x29, 0x05, 0x40, 0xf9, + 0xa9, 0x00, 0x00, 0xb4, 0xfd, 0x7b, 0x41, 0xa9, + 0xf5, 0x03, 0x08, 0xaa, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x29, 0x01, 0x40, 0xf9, + 0x6a, 0x06, 0x40, 0xf9, 0x88, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe2, 0x06, 0x40, 0xf9, + 0x21, 0x01, 0x40, 0xf9, 0x43, 0x0d, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xf5, 0x03, 0x08, 0xaa, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_Py_SpecialMethods+0x0 + // 10: &_PyObject_LookupSpecialMethod+0x0 + // 18: &PyExc_TypeError+0x0 + // 20: &_PyErr_Format+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_SpecialMethods); + patch_64(data + 0x10, (uintptr_t)&_PyObject_LookupSpecialMethod); + patch_64(data + 0x18, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x20, (uintptr_t)&_PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x38, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x80, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x84, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x8c, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0x98, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xa8, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0xc4, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_SUPER_ATTR_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_ATTR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 9000001a adrp x26, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PySuper_Type + // 8: f85e82a8 ldur x8, [x21, #-0x18] + // c: 910003fd mov x29, sp + // 10: f940035a ldr x26, [x26] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PySuper_Type + // 14: eb1a011f cmp x8, x26 + // 18: 540000a1 b.ne 0x2c <_JIT_ENTRY+0x2c> + // 1c: f85f02b7 ldur x23, [x21, #-0x10] + // 20: f94006e8 ldr x8, [x23, #0x8] + // 24: 3942ad08 ldrb w8, [x8, #0xab] + // 28: 37380068 tbnz w8, #0x7, 0x34 <_JIT_ENTRY+0x34> + // 2c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 34: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 38: f9400288 ldr x8, [x20] + // 3c: aa1703e0 mov x0, x23 + // 40: f9400129 ldr x9, [x9] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 44: f85f82b8 ldur x24, [x21, #-0x8] + // 48: aa1f03e3 mov x3, xzr + // 4c: f9401108 ldr x8, [x8, #0x20] + // 50: 53023d29 ubfx w9, w9, #2, #14 + // 54: aa1803e1 mov x1, x24 + // 58: 8b294d08 add x8, x8, w9, uxtw #3 + // 5c: f9400d02 ldr x2, [x8, #0x18] + // 60: f9002295 str x21, [x20, #0x40] + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _PySuper_Lookup + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _PySuper_Lookup + // 6c: d63f0100 blr x8 + // 70: b9400348 ldr w8, [x26] + // 74: f9402299 ldr x25, [x20, #0x40] + // 78: aa0003f3 mov x19, x0 + // 7c: f900229f str xzr, [x20, #0x40] + // 80: 37f80128 tbnz w8, #0x1f, 0xa4 <_JIT_ENTRY+0xa4> + // 84: 71000508 subs w8, w8, #0x1 + // 88: b9000348 str w8, [x26] + // 8c: 540000c1 b.ne 0xa4 <_JIT_ENTRY+0xa4> + // 90: 90000000 adrp x0, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_GOT_PAGE PySuper_Type + // 94: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 98: f9400000 ldr x0, [x0] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC PySuper_Type + // 9c: f9400108 ldr x8, [x8] + // 000000000000009c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a0: d63f0100 blr x8 + // a4: b94002e8 ldr w8, [x23] + // a8: 37f80108 tbnz w8, #0x1f, 0xc8 <_JIT_ENTRY+0xc8> + // ac: 71000508 subs w8, w8, #0x1 + // b0: b90002e8 str w8, [x23] + // b4: 540000a1 b.ne 0xc8 <_JIT_ENTRY+0xc8> + // b8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // bc: aa1703e0 mov x0, x23 + // c0: f9400108 ldr x8, [x8] + // 00000000000000c0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c4: d63f0100 blr x8 + // c8: b9400308 ldr w8, [x24] + // cc: 37f80108 tbnz w8, #0x1f, 0xec <_JIT_ENTRY+0xec> + // d0: 71000508 subs w8, w8, #0x1 + // d4: b9000308 str w8, [x24] + // d8: 540000a1 b.ne 0xec <_JIT_ENTRY+0xec> + // dc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000dc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // e0: aa1803e0 mov x0, x24 + // e4: f9400108 ldr x8, [x8] + // 00000000000000e4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // e8: d63f0100 blr x8 + // ec: b40000b3 cbz x19, 0x100 <_JIT_ENTRY+0x100> + // f0: d1004335 sub x21, x25, #0x10 + // f4: f81e8333 stur x19, [x25, #-0x18] + // f8: a8c17bfd ldp x29, x30, [sp], #0x10 + // fc: 14000000 b 0xfc <_JIT_ENTRY+0xfc> + // 00000000000000fc: R_AARCH64_JUMP26 _JIT_CONTINUE + // 100: d1006335 sub x21, x25, #0x18 + // 104: a8c17bfd ldp x29, x30, [sp], #0x10 + // 108: 14000000 b 0x108 <_JIT_ENTRY+0x108> + // 0000000000000108: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 10c: 00 00 00 00 + const unsigned char code_body[272] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x1a, 0x00, 0x00, 0x90, + 0xa8, 0x82, 0x5e, 0xf8, 0xfd, 0x03, 0x00, 0x91, + 0x5a, 0x03, 0x40, 0xf9, 0x1f, 0x01, 0x1a, 0xeb, + 0xa1, 0x00, 0x00, 0x54, 0xb7, 0x02, 0x5f, 0xf8, + 0xe8, 0x06, 0x40, 0xf9, 0x08, 0xad, 0x42, 0x39, + 0x68, 0x00, 0x38, 0x37, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x88, 0x02, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0xb8, 0x82, 0x5f, 0xf8, + 0xe3, 0x03, 0x1f, 0xaa, 0x08, 0x11, 0x40, 0xf9, + 0x29, 0x3d, 0x02, 0x53, 0xe1, 0x03, 0x18, 0xaa, + 0x08, 0x4d, 0x29, 0x8b, 0x02, 0x0d, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x48, 0x03, 0x40, 0xb9, 0x99, 0x22, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x9f, 0x22, 0x00, 0xf9, + 0x28, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x48, 0x03, 0x00, 0xb9, 0xc1, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x90, + 0x00, 0x00, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb3, 0x00, 0x00, 0xb4, + 0x35, 0x43, 0x00, 0xd1, 0x33, 0x83, 0x1e, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x35, 0x63, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: OPARG + // 10: &_PySuper_Lookup+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x30, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x90, (uintptr_t)data); + patch_aarch64_21rx(code + 0x94, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x98, (uintptr_t)data); + patch_aarch64_12x(code + 0x9c, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xb8, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xc0, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xdc, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xe4, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xfc, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x108, state->instruction_starts[instruction->error_target]); +} + +void +emit__LOAD_SUPER_ATTR_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_METHOD.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: a9017bfd stp x29, x30, [sp, #0x10] + // 8: 90000019 adrp x25, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PySuper_Type + // c: f85e82a8 ldur x8, [x21, #-0x18] + // 10: f9400339 ldr x25, [x25] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PySuper_Type + // 14: 910043fd add x29, sp, #0x10 + // 18: eb19011f cmp x8, x25 + // 1c: 540000a1 b.ne 0x30 <_JIT_ENTRY+0x30> + // 20: f85f02b3 ldur x19, [x21, #-0x10] + // 24: f9400668 ldr x8, [x19, #0x8] + // 28: 3942ad08 ldrb w8, [x8, #0xab] + // 2c: 37380088 tbnz w8, #0x7, 0x3c <_JIT_ENTRY+0x3c> + // 30: a9417bfd ldp x29, x30, [sp, #0x10] + // 34: 910083ff add sp, sp, #0x20 + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 3c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000003c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 40: f9400288 ldr x8, [x20] + // 44: aa1303e0 mov x0, x19 + // 48: f9400129 ldr x9, [x9] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 4c: f85f82b7 ldur x23, [x21, #-0x8] + // 50: f9401108 ldr x8, [x8, #0x20] + // 54: 53023d29 ubfx w9, w9, #2, #14 + // 58: f94006ea ldr x10, [x23, #0x8] + // 5c: aa1703e1 mov x1, x23 + // 60: 8b294d08 add x8, x8, w9, uxtw #3 + // 64: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE PyObject_GenericGetAttr + // 68: f9400129 ldr x9, [x9] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC PyObject_GenericGetAttr + // 6c: f940494a ldr x10, [x10, #0x90] + // 70: b81fc3bf stur wzr, [x29, #-0x4] + // 74: f9400d02 ldr x2, [x8, #0x18] + // 78: d10013a8 sub x8, x29, #0x4 + // 7c: f9002295 str x21, [x20, #0x40] + // 80: eb09015f cmp x10, x9 + // 84: 9a9f0103 csel x3, x8, xzr, eq + // 88: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_GOT_PAGE _PySuper_Lookup + // 8c: f9400108 ldr x8, [x8] + // 000000000000008c: R_AARCH64_LD64_GOT_LO12_NC _PySuper_Lookup + // 90: d63f0100 blr x8 + // 94: f9402298 ldr x24, [x20, #0x40] + // 98: f900229f str xzr, [x20, #0x40] + // 9c: b4000620 cbz x0, 0x160 <_JIT_ENTRY+0x160> + // a0: b85fc3a8 ldur w8, [x29, #-0x4] + // a4: 35000248 cbnz w8, 0xec <_JIT_ENTRY+0xec> + // a8: d1002308 sub x8, x24, #0x8 + // ac: f9002288 str x8, [x20, #0x40] + // b0: b94002e8 ldr w8, [x23] + // b4: 37f80148 tbnz w8, #0x1f, 0xdc <_JIT_ENTRY+0xdc> + // b8: 71000508 subs w8, w8, #0x1 + // bc: b90002e8 str w8, [x23] + // c0: 540000e1 b.ne 0xdc <_JIT_ENTRY+0xdc> + // c4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c8: aa0003f5 mov x21, x0 + // cc: aa1703e0 mov x0, x23 + // d0: f9400108 ldr x8, [x8] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d4: d63f0100 blr x8 + // d8: aa1503e0 mov x0, x21 + // dc: f9402288 ldr x8, [x20, #0x40] + // e0: aa1f03f7 mov x23, xzr + // e4: f900229f str xzr, [x20, #0x40] + // e8: 91002118 add x24, x8, #0x8 + // ec: b9400328 ldr w8, [x25] + // f0: 37f80188 tbnz w8, #0x1f, 0x120 <_JIT_ENTRY+0x120> + // f4: 71000508 subs w8, w8, #0x1 + // f8: b9000328 str w8, [x25] + // fc: 54000121 b.ne 0x120 <_JIT_ENTRY+0x120> + // 100: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000100: R_AARCH64_ADR_GOT_PAGE PySuper_Type + // 104: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000104: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 108: aa0003f5 mov x21, x0 + // 10c: f9400108 ldr x8, [x8] + // 000000000000010c: R_AARCH64_LD64_GOT_LO12_NC PySuper_Type + // 110: f9400129 ldr x9, [x9] + // 0000000000000110: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 114: aa0803e0 mov x0, x8 + // 118: d63f0120 blr x9 + // 11c: aa1503e0 mov x0, x21 + // 120: b9400268 ldr w8, [x19] + // 124: 37f80148 tbnz w8, #0x1f, 0x14c <_JIT_ENTRY+0x14c> + // 128: 71000508 subs w8, w8, #0x1 + // 12c: b9000268 str w8, [x19] + // 130: 540000e1 b.ne 0x14c <_JIT_ENTRY+0x14c> + // 134: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000134: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 138: aa0003f5 mov x21, x0 + // 13c: aa1303e0 mov x0, x19 + // 140: f9400108 ldr x8, [x8] + // 0000000000000140: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 144: d63f0100 blr x8 + // 148: aa1503e0 mov x0, x21 + // 14c: a9417bfd ldp x29, x30, [sp, #0x10] + // 150: d1002315 sub x21, x24, #0x8 + // 154: a93edf00 stp x0, x23, [x24, #-0x18] + // 158: 910083ff add sp, sp, #0x20 + // 15c: 14000000 b 0x15c <_JIT_ENTRY+0x15c> + // 000000000000015c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 160: a9417bfd ldp x29, x30, [sp, #0x10] + // 164: aa1803f5 mov x21, x24 + // 168: 910083ff add sp, sp, #0x20 + // 16c: 14000000 b 0x16c <_JIT_ENTRY+0x16c> + // 000000000000016c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[368] = { + 0xff, 0x83, 0x00, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0x19, 0x00, 0x00, 0x90, 0xa8, 0x82, 0x5e, 0xf8, + 0x39, 0x03, 0x40, 0xf9, 0xfd, 0x43, 0x00, 0x91, + 0x1f, 0x01, 0x19, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xb3, 0x02, 0x5f, 0xf8, 0x68, 0x06, 0x40, 0xf9, + 0x08, 0xad, 0x42, 0x39, 0x88, 0x00, 0x38, 0x37, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x90, + 0x88, 0x02, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0xb7, 0x82, 0x5f, 0xf8, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x3d, 0x02, 0x53, + 0xea, 0x06, 0x40, 0xf9, 0xe1, 0x03, 0x17, 0xaa, + 0x08, 0x4d, 0x29, 0x8b, 0x09, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0x4a, 0x49, 0x40, 0xf9, + 0xbf, 0xc3, 0x1f, 0xb8, 0x02, 0x0d, 0x40, 0xf9, + 0xa8, 0x13, 0x00, 0xd1, 0x95, 0x22, 0x00, 0xf9, + 0x5f, 0x01, 0x09, 0xeb, 0x03, 0x01, 0x9f, 0x9a, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x98, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x06, 0x00, 0xb4, + 0xa8, 0xc3, 0x5f, 0xb8, 0x48, 0x02, 0x00, 0x35, + 0x08, 0x23, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0xe8, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0xaa, 0x88, 0x22, 0x40, 0xf9, + 0xf7, 0x03, 0x1f, 0xaa, 0x9f, 0x22, 0x00, 0xf9, + 0x18, 0x21, 0x00, 0x91, 0x28, 0x03, 0x40, 0xb9, + 0x88, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x28, 0x03, 0x00, 0xb9, 0x21, 0x01, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x08, 0xaa, + 0x20, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0xaa, + 0x68, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0xaa, 0xfd, 0x7b, 0x41, 0xa9, + 0x15, 0x23, 0x00, 0xd1, 0x00, 0xdf, 0x3e, 0xa9, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0x41, 0xa9, 0xf5, 0x03, 0x18, 0xaa, + 0xff, 0x83, 0x00, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PySuper_Type+0x0 + // 8: OPARG + // 10: &PyObject_GenericGetAttr+0x0 + // 18: &_PySuper_Lookup+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyObject_GenericGetAttr); + patch_64(data + 0x18, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_26r(code + 0x38, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x88, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xc4, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xd0, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0x100, (uintptr_t)data); + patch_aarch64_21rx(code + 0x104, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x10c, (uintptr_t)data); + patch_aarch64_12x(code + 0x110, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0x134, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x140, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x15c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x16c, state->instruction_starts[instruction->error_target]); +} + +void +emit__MAKE_CALLARGS_A_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CALLARGS_A_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f5eb3 ldp x19, x23, [x21, #-0x10] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyTuple_Type + // c: 910003fd mov x29, sp + // 10: f9400668 ldr x8, [x19, #0x8] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyTuple_Type + // 18: eb09011f cmp x8, x9 + // 1c: 54000480 b.eq 0xac <_JIT_ENTRY+0xac> + // 20: f85e02a1 ldur x1, [x21, #-0x20] + // 24: f9002295 str x21, [x20, #0x40] + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _Py_Check_ArgsIterable + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC _Py_Check_ArgsIterable + // 30: aa1603e0 mov x0, x22 + // 34: aa1303e2 mov x2, x19 + // 38: d63f0100 blr x8 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: 37f803a0 tbnz w0, #0x1f, 0xb8 <_JIT_ENTRY+0xb8> + // 48: f9002295 str x21, [x20, #0x40] + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE PySequence_Tuple + // 50: aa1303e0 mov x0, x19 + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC PySequence_Tuple + // 58: d63f0100 blr x8 + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: b40002a0 cbz x0, 0xb8 <_JIT_ENTRY+0xb8> + // 68: d10042a8 sub x8, x21, #0x10 + // 6c: f9002288 str x8, [x20, #0x40] + // 70: b9400268 ldr w8, [x19] + // 74: 37f80148 tbnz w8, #0x1f, 0x9c <_JIT_ENTRY+0x9c> + // 78: 71000508 subs w8, w8, #0x1 + // 7c: b9000268 str w8, [x19] + // 80: 540000e1 b.ne 0x9c <_JIT_ENTRY+0x9c> + // 84: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 88: aa0003f5 mov x21, x0 + // 8c: aa1303e0 mov x0, x19 + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 94: d63f0100 blr x8 + // 98: aa1503e0 mov x0, x21 + // 9c: f9402288 ldr x8, [x20, #0x40] + // a0: aa0003f3 mov x19, x0 + // a4: f900229f str xzr, [x20, #0x40] + // a8: 91004115 add x21, x8, #0x10 + // ac: a93f5eb3 stp x19, x23, [x21, #-0x10] + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + // b8: a8c17bfd ldp x29, x30, [sp], #0x10 + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x5e, 0x7f, 0xa9, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x80, 0x04, 0x00, 0x54, + 0xa1, 0x02, 0x5e, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x03, 0xf8, 0x37, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xa0, 0x02, 0x00, 0xb4, + 0xa8, 0x42, 0x00, 0xd1, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0xaa, 0x88, 0x22, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x41, 0x00, 0x91, 0xb3, 0x5e, 0x3f, 0xa9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyTuple_Type+0x0 + // 8: &_Py_Check_ArgsIterable+0x0 + // 10: &PySequence_Tuple+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Check_ArgsIterable); + patch_64(data + 0x10, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x84, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x90, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xbc, state->instruction_starts[instruction->error_target]); +} + +void +emit__MAKE_CELL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CELL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 91014293 add x19, x20, #0x50 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 92403d17 and x23, x8, #0xffff + // 18: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000018: R_AARCH64_ADR_GOT_PAGE PyCell_New + // 1c: f8777a60 ldr x0, [x19, x23, lsl #3] + // 20: f9400108 ldr x8, [x8] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC PyCell_New + // 24: d63f0100 blr x8 + // 28: b40001e0 cbz x0, 0x64 <_JIT_ENTRY+0x64> + // 2c: aa0003e8 mov x8, x0 + // 30: f8777a60 ldr x0, [x19, x23, lsl #3] + // 34: f8377a68 str x8, [x19, x23, lsl #3] + // 38: f9002295 str x21, [x20, #0x40] + // 3c: b40000c0 cbz x0, 0x54 <_JIT_ENTRY+0x54> + // 40: b9400008 ldr w8, [x0] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000008 str w8, [x0] + // 50: 540000e0 b.eq 0x6c <_JIT_ENTRY+0x6c> + // 54: f9402295 ldr x21, [x20, #0x40] + // 58: f900229f str xzr, [x20, #0x40] + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: a8c17bfd ldp x29, x30, [sp], #0x10 + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: f9402295 ldr x21, [x20, #0x40] + // 7c: f900229f str xzr, [x20, #0x40] + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 <_JIT_ENTRY+0x84> + // 0000000000000084: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x93, 0x42, 0x01, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x17, 0x3d, 0x40, 0x92, + 0x08, 0x00, 0x00, 0x90, 0x60, 0x7a, 0x77, 0xf8, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x01, 0x00, 0xb4, 0xe8, 0x03, 0x00, 0xaa, + 0x60, 0x7a, 0x77, 0xf8, 0x68, 0x7a, 0x37, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xe0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyCell_New+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCell_New); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MAKE_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_FUNCTION.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyFunction_New + // 10: f9400e81 ldr x1, [x20, #0x18] + // 14: f9400108 ldr x8, [x8] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyFunction_New + // 18: 910003fd mov x29, sp + // 1c: aa1303e0 mov x0, x19 + // 20: d63f0100 blr x8 + // 24: f9402288 ldr x8, [x20, #0x40] + // 28: aa0003f7 mov x23, x0 + // 2c: d1002108 sub x8, x8, #0x8 + // 30: f9002288 str x8, [x20, #0x40] + // 34: b9400268 ldr w8, [x19] + // 38: 37f80088 tbnz w8, #0x1f, 0x48 <_JIT_ENTRY+0x48> + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b9000268 str w8, [x19] + // 44: 54000180 b.eq 0x74 <_JIT_ENTRY+0x74> + // 48: f9402295 ldr x21, [x20, #0x40] + // 4c: f900229f str xzr, [x20, #0x40] + // 50: b4000217 cbz x23, 0x90 <_JIT_ENTRY+0x90> + // 54: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000054: R_AARCH64_ADR_GOT_PAGE _PyFunction_SetVersion + // 58: b9405e61 ldr w1, [x19, #0x5c] + // 5c: aa1703e0 mov x0, x23 + // 60: f9400108 ldr x8, [x8] + // 0000000000000060: R_AARCH64_LD64_GOT_LO12_NC _PyFunction_SetVersion + // 64: d63f0100 blr x8 + // 68: f80086b7 str x23, [x21], #0x8 + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 78: aa1303e0 mov x0, x19 + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 80: d63f0100 blr x8 + // 84: f9402295 ldr x21, [x20, #0x40] + // 88: f900229f str xzr, [x20, #0x40] + // 8c: b5fffe57 cbnz x23, 0x54 <_JIT_ENTRY+0x54> + // 90: a8c17bfd ldp x29, x30, [sp], #0x10 + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x81, 0x0e, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x88, 0x22, 0x40, 0xf9, + 0xf7, 0x03, 0x00, 0xaa, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x80, 0x01, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x17, 0x02, 0x00, 0xb4, 0x08, 0x00, 0x00, 0x90, + 0x61, 0x5e, 0x40, 0xb9, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb7, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x57, 0xfe, 0xff, 0xb5, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyFunction_New+0x0 + // 8: &_PyFunction_SetVersion+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFunction_New); + patch_64(data + 0x8, (uintptr_t)&_PyFunction_SetVersion); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_21rx(code + 0x54, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x60, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x94, state->instruction_starts[instruction->error_target]); +} + +void +emit__MAKE_WARM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_WARM.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400ac8 ldr x8, [x22, #0x10] + // 4: 528ce609 mov w9, #0x6730 // =26416 + // 8: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_EXECUTOR + // c: 72a00069 movk w9, #0x3, lsl #16 + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_EXECUTOR + // 14: 5280002c mov w12, #0x1 // =1 + // 18: f869690b ldr x11, [x8, x9] + // 1c: 39008d4c strb w12, [x10, #0x23] + // 20: f100056a subs x10, x11, #0x1 + // 24: f829690a str x10, [x8, x9] + // 28: 540000c1 b.ne 0x40 <_JIT_ENTRY+0x40> + // 2c: 910062c8 add x8, x22, #0x18 + // 30: c85ffd09 ldaxr x9, [x8] + // 34: b2790129 orr x9, x9, #0x80 + // 38: c80afd09 stlxr w10, x9, [x8] + // 3c: 35ffffaa cbnz w10, 0x30 <_JIT_ENTRY+0x30> + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[64] = { + 0xc8, 0x0a, 0x40, 0xf9, 0x09, 0xe6, 0x8c, 0x52, + 0x0a, 0x00, 0x00, 0x90, 0x69, 0x00, 0xa0, 0x72, + 0x4a, 0x01, 0x40, 0xf9, 0x2c, 0x00, 0x80, 0x52, + 0x0b, 0x69, 0x69, 0xf8, 0x4c, 0x8d, 0x00, 0x39, + 0x6a, 0x05, 0x00, 0xf1, 0x0a, 0x69, 0x29, 0xf8, + 0xc1, 0x00, 0x00, 0x54, 0xc8, 0x62, 0x00, 0x91, + 0x09, 0xfd, 0x5f, 0xc8, 0x29, 0x01, 0x79, 0xb2, + 0x09, 0xfd, 0x0a, 0xc8, 0xaa, 0xff, 0xff, 0x35, + }; + // 0: EXECUTOR + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); +} + +void +emit__MAP_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAP_ADD.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800029 mov x9, #-0x2 // =-2 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: a97f0aa1 ldp x1, x2, [x21, #-0x10] + // 18: cb282128 sub x8, x9, w8, uxth + // 1c: f8687aa0 ldr x0, [x21, x8, lsl #3] + // 20: f9002295 str x21, [x20, #0x40] + // 24: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE _PyDict_SetItem_Take2 + // 28: f9400108 ldr x8, [x8] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC _PyDict_SetItem_Take2 + // 2c: d63f0100 blr x8 + // 30: f9402288 ldr x8, [x20, #0x40] + // 34: f900229f str xzr, [x20, #0x40] + // 38: d1004115 sub x21, x8, #0x10 + // 3c: 34000060 cbz w0, 0x48 <_JIT_ENTRY+0x48> + // 40: a8c17bfd ldp x29, x30, [sp], #0x10 + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[80] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x29, 0x00, 0x80, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xa1, 0x0a, 0x7f, 0xa9, + 0x28, 0x21, 0x28, 0xcb, 0xa0, 0x7a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x41, 0x00, 0xd1, 0x60, 0x00, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyDict_SetItem_Take2+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_SetItem_Take2); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_33rx(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x44, state->instruction_starts[instruction->error_target]); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MATCH_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_CLASS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f66b7 ldp x23, x25, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: f85e82b8 ldur x24, [x21, #-0x18] + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000014: R_AARCH64_ADR_GOT_PAGE _PyEval_MatchClass + // 18: f9002295 str x21, [x20, #0x40] + // 1c: aa1603e0 mov x0, x22 + // 20: 910003fd mov x29, sp + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _PyEval_MatchClass + // 28: 92403d03 and x3, x8, #0xffff + // 2c: aa1803e1 mov x1, x24 + // 30: aa1703e2 mov x2, x23 + // 34: aa1903e4 mov x4, x25 + // 38: d63f0120 blr x9 + // 3c: f940229a ldr x26, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: aa0003f3 mov x19, x0 + // 48: b9400308 ldr w8, [x24] + // 4c: 37f80108 tbnz w8, #0x1f, 0x6c <_JIT_ENTRY+0x6c> + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000308 str w8, [x24] + // 58: 540000a1 b.ne 0x6c <_JIT_ENTRY+0x6c> + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 60: aa1803e0 mov x0, x24 + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 68: d63f0100 blr x8 + // 6c: b94002e8 ldr w8, [x23] + // 70: 37f80108 tbnz w8, #0x1f, 0x90 <_JIT_ENTRY+0x90> + // 74: 71000508 subs w8, w8, #0x1 + // 78: b90002e8 str w8, [x23] + // 7c: 540000a1 b.ne 0x90 <_JIT_ENTRY+0x90> + // 80: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000080: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 84: aa1703e0 mov x0, x23 + // 88: f9400108 ldr x8, [x8] + // 0000000000000088: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 8c: d63f0100 blr x8 + // 90: b9400328 ldr w8, [x25] + // 94: 37f80088 tbnz w8, #0x1f, 0xa4 <_JIT_ENTRY+0xa4> + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b9000328 str w8, [x25] + // a0: 540000c0 b.eq 0xb8 <_JIT_ENTRY+0xb8> + // a4: b4000153 cbz x19, 0xcc <_JIT_ENTRY+0xcc> + // a8: d1004355 sub x21, x26, #0x10 + // ac: f81e8353 stur x19, [x26, #-0x18] + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + // b8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // bc: aa1903e0 mov x0, x25 + // c0: f9400108 ldr x8, [x8] + // 00000000000000c0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c4: d63f0100 blr x8 + // c8: b5ffff13 cbnz x19, 0xa8 <_JIT_ENTRY+0xa8> + // cc: f9403ac8 ldr x8, [x22, #0x70] + // d0: b40000c8 cbz x8, 0xe8 <_JIT_ENTRY+0xe8> + // d4: f9400508 ldr x8, [x8, #0x8] + // d8: b4000088 cbz x8, 0xe8 <_JIT_ENTRY+0xe8> + // dc: d1006355 sub x21, x26, #0x18 + // e0: a8c17bfd ldp x29, x30, [sp], #0x10 + // e4: 14000000 b 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // e8: 90000013 adrp x19, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // ec: f9400273 ldr x19, [x19] + // 00000000000000ec: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // f0: d1004355 sub x21, x26, #0x10 + // f4: f81e8353 stur x19, [x26, #-0x18] + // f8: a8c17bfd ldp x29, x30, [sp], #0x10 + // fc: 14000000 b 0xfc <_JIT_ENTRY+0xfc> + // 00000000000000fc: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[256] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb7, 0x66, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xb8, 0x82, 0x5e, 0xf8, + 0x08, 0x01, 0x40, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0xfd, 0x03, 0x00, 0x91, 0x29, 0x01, 0x40, 0xf9, + 0x03, 0x3d, 0x40, 0x92, 0xe1, 0x03, 0x18, 0xaa, + 0xe2, 0x03, 0x17, 0xaa, 0xe4, 0x03, 0x19, 0xaa, + 0x20, 0x01, 0x3f, 0xd6, 0x9a, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x28, 0x03, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x28, 0x03, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x53, 0x01, 0x00, 0xb4, + 0x55, 0x43, 0x00, 0xd1, 0x53, 0x83, 0x1e, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x19, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x13, 0xff, 0xff, 0xb5, 0xc8, 0x3a, 0x40, 0xf9, + 0xc8, 0x00, 0x00, 0xb4, 0x08, 0x05, 0x40, 0xf9, + 0x88, 0x00, 0x00, 0xb4, 0x55, 0x63, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x13, 0x00, 0x00, 0x90, 0x73, 0x02, 0x40, 0xf9, + 0x55, 0x43, 0x00, 0xd1, 0x53, 0x83, 0x1e, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyEval_MatchClass+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_Py_NoneStruct+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_MatchClass); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x88, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xb8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xc0, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xe4, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0xe8, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xfc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MATCH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_KEYS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f0aa1 ldp x1, x2, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyEval_MatchKeys + // c: f9002295 str x21, [x20, #0x40] + // 10: aa1603e0 mov x0, x22 + // 14: 910003fd mov x29, sp + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _PyEval_MatchKeys + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b4000080 cbz x0, 0x38 <_JIT_ENTRY+0x38> + // 2c: f80086a0 str x0, [x21], #0x8 + // 30: a8c17bfd ldp x29, x30, [sp], #0x10 + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + // 38: a8c17bfd ldp x29, x30, [sp], #0x10 + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[64] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa1, 0x0a, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x16, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0xa0, 0x86, 0x00, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyEval_MatchKeys+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_MatchKeys); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x3c, state->instruction_starts[instruction->error_target]); +} + +void +emit__MATCH_MAPPING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_MAPPING.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a9 ldur x9, [x21, #-0x8] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 8: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // c: aa1503e8 mov x8, x21 + // 10: 910022b5 add x21, x21, #0x8 + // 14: f9400529 ldr x9, [x9, #0x8] + // 18: f940014a ldr x10, [x10] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 1c: f9405529 ldr x9, [x9, #0xa8] + // 20: f940016b ldr x11, [x11] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 24: f27a013f tst x9, #0x40 + // 28: 9a8a0169 csel x9, x11, x10, eq + // 2c: f9000109 str x9, [x8] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa9, 0x82, 0x5f, 0xf8, 0x0a, 0x00, 0x00, 0x90, + 0x0b, 0x00, 0x00, 0x90, 0xe8, 0x03, 0x15, 0xaa, + 0xb5, 0x22, 0x00, 0x91, 0x29, 0x05, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0x29, 0x55, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x7a, 0xf2, + 0x69, 0x01, 0x8a, 0x9a, 0x09, 0x01, 0x00, 0xf9, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); +} + +void +emit__MATCH_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_SEQUENCE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a9 ldur x9, [x21, #-0x8] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 8: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // c: aa1503e8 mov x8, x21 + // 10: 910022b5 add x21, x21, #0x8 + // 14: f9400529 ldr x9, [x9, #0x8] + // 18: f940014a ldr x10, [x10] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 1c: f9405529 ldr x9, [x9, #0xa8] + // 20: f940016b ldr x11, [x11] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 24: f27b013f tst x9, #0x20 + // 28: 9a8a0169 csel x9, x11, x10, eq + // 2c: f9000109 str x9, [x8] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[48] = { + 0xa9, 0x82, 0x5f, 0xf8, 0x0a, 0x00, 0x00, 0x90, + 0x0b, 0x00, 0x00, 0x90, 0xe8, 0x03, 0x15, 0xaa, + 0xb5, 0x22, 0x00, 0x91, 0x29, 0x05, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0x29, 0x55, 0x40, 0xf9, + 0x6b, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x7b, 0xf2, + 0x69, 0x01, 0x8a, 0x9a, 0x09, 0x01, 0x00, 0xf9, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); +} + +void +emit__MAYBE_EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 12800028 mov w8, #-0x2 // =-2 + // 8: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: 12003d2a and w10, w9, #0xffff + // 14: 4b0a0108 sub w8, w8, w10 + // 18: f868daa9 ldr x9, [x21, w8, sxtw #3] + // 1c: f940052b ldr x11, [x9, #0x8] + // 20: f940018c ldr x12, [x12] + // 0000000000000020: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 24: eb0c017f cmp x11, x12 + // 28: 54000040 b.eq 0x30 <_JIT_ENTRY+0x30> + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 30: 2a2a03ea mvn w10, w10 + // 34: f86adaab ldr x11, [x21, w10, sxtw #3] + // 38: b5ffffab cbnz x11, 0x2c <_JIT_ENTRY+0x2c> + // 3c: f9400d2b ldr x11, [x9, #0x18] + // 40: b940016c ldr w12, [x11] + // 44: 37f8006c tbnz w12, #0x1f, 0x50 <_JIT_ENTRY+0x50> + // 48: 1100058c add w12, w12, #0x1 + // 4c: b900016c str w12, [x11] + // 50: f82adaab str x11, [x21, w10, sxtw #3] + // 54: f9400929 ldr x9, [x9, #0x10] + // 58: f868daa0 ldr x0, [x21, w8, sxtw #3] + // 5c: b940012a ldr w10, [x9] + // 60: 37f8006a tbnz w10, #0x1f, 0x6c <_JIT_ENTRY+0x6c> + // 64: 1100054a add w10, w10, #0x1 + // 68: b900012a str w10, [x9] + // 6c: f828daa9 str x9, [x21, w8, sxtw #3] + // 70: f9002295 str x21, [x20, #0x40] + // 74: b9400008 ldr w8, [x0] + // 78: 37f80088 tbnz w8, #0x1f, 0x88 <_JIT_ENTRY+0x88> + // 7c: 71000508 subs w8, w8, #0x1 + // 80: b9000008 str w8, [x0] + // 84: 54000080 b.eq 0x94 <_JIT_ENTRY+0x94> + // 88: f9402295 ldr x21, [x20, #0x40] + // 8c: f900229f str xzr, [x20, #0x40] + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_CONTINUE + // 94: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 98: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000098: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 9c: 910003fd mov x29, sp + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // a4: d63f0100 blr x8 + // a8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ac: f9402295 ldr x21, [x20, #0x40] + // b0: f900229f str xzr, [x20, #0x40] + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[184] = { + 0x09, 0x00, 0x00, 0x90, 0x28, 0x00, 0x80, 0x12, + 0x0c, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x2a, 0x3d, 0x00, 0x12, 0x08, 0x01, 0x0a, 0x4b, + 0xa9, 0xda, 0x68, 0xf8, 0x2b, 0x05, 0x40, 0xf9, + 0x8c, 0x01, 0x40, 0xf9, 0x7f, 0x01, 0x0c, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0xea, 0x03, 0x2a, 0x2a, 0xab, 0xda, 0x6a, 0xf8, + 0xab, 0xff, 0xff, 0xb5, 0x2b, 0x0d, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x6c, 0x01, 0x00, 0xb9, + 0xab, 0xda, 0x2a, 0xf8, 0x29, 0x09, 0x40, 0xf9, + 0xa0, 0xda, 0x68, 0xf8, 0x2a, 0x01, 0x40, 0xb9, + 0x6a, 0x00, 0xf8, 0x37, 0x4a, 0x05, 0x00, 0x11, + 0x2a, 0x01, 0x00, 0xb9, 0xa9, 0xda, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x20, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x90, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x98, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xa0, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__MAYBE_EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD_KW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800048 mov x8, #-0x3 // =-3 + // c: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyMethod_Type + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 910003fd mov x29, sp + // 18: 92403d2a and x10, x9, #0xffff + // 1c: cb0a0108 sub x8, x8, x10 + // 20: f8687aa9 ldr x9, [x21, x8, lsl #3] + // 24: f940052b ldr x11, [x9, #0x8] + // 28: f940018c ldr x12, [x12] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC PyMethod_Type + // 2c: f85f82b3 ldur x19, [x21, #-0x8] + // 30: eb0c017f cmp x11, x12 + // 34: 54000080 b.eq 0x44 <_JIT_ENTRY+0x44> + // 38: f81f82b3 stur x19, [x21, #-0x8] + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 14000000 b 0x40 <_JIT_ENTRY+0x40> + // 0000000000000040: R_AARCH64_JUMP26 _JIT_CONTINUE + // 44: 9280002b mov x11, #-0x2 // =-2 + // 48: cb0a016a sub x10, x11, x10 + // 4c: f86a7aab ldr x11, [x21, x10, lsl #3] + // 50: b5ffff4b cbnz x11, 0x38 <_JIT_ENTRY+0x38> + // 54: f9400d2b ldr x11, [x9, #0x18] + // 58: aa0903e0 mov x0, x9 + // 5c: b940016c ldr w12, [x11] + // 60: 37f8008c tbnz w12, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 64: 1100058c add w12, w12, #0x1 + // 68: b900016c str w12, [x11] + // 6c: f8687aa0 ldr x0, [x21, x8, lsl #3] + // 70: f82a7aab str x11, [x21, x10, lsl #3] + // 74: f9400929 ldr x9, [x9, #0x10] + // 78: b940012a ldr w10, [x9] + // 7c: 37f8006a tbnz w10, #0x1f, 0x88 <_JIT_ENTRY+0x88> + // 80: 1100054a add w10, w10, #0x1 + // 84: b900012a str w10, [x9] + // 88: f8287aa9 str x9, [x21, x8, lsl #3] + // 8c: f9002295 str x21, [x20, #0x40] + // 90: b9400008 ldr w8, [x0] + // 94: 37f80088 tbnz w8, #0x1f, 0xa4 <_JIT_ENTRY+0xa4> + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b9000008 str w8, [x0] + // a0: 540000c0 b.eq 0xb8 <_JIT_ENTRY+0xb8> + // a4: f9402295 ldr x21, [x20, #0x40] + // a8: f900229f str xzr, [x20, #0x40] + // ac: f81f82b3 stur x19, [x21, #-0x8] + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + // b8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c0: d63f0100 blr x8 + // c4: f9402295 ldr x21, [x20, #0x40] + // c8: f900229f str xzr, [x20, #0x40] + // cc: f81f82b3 stur x19, [x21, #-0x8] + // d0: a8c17bfd ldp x29, x30, [sp], #0x10 + // d4: 14000000 b 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d4: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[216] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x48, 0x00, 0x80, 0x92, 0x0c, 0x00, 0x00, 0x90, + 0x29, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x2a, 0x3d, 0x40, 0x92, 0x08, 0x01, 0x0a, 0xcb, + 0xa9, 0x7a, 0x68, 0xf8, 0x2b, 0x05, 0x40, 0xf9, + 0x8c, 0x01, 0x40, 0xf9, 0xb3, 0x82, 0x5f, 0xf8, + 0x7f, 0x01, 0x0c, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0xb3, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x2b, 0x00, 0x80, 0x92, + 0x6a, 0x01, 0x0a, 0xcb, 0xab, 0x7a, 0x6a, 0xf8, + 0x4b, 0xff, 0xff, 0xb5, 0x2b, 0x0d, 0x40, 0xf9, + 0xe0, 0x03, 0x09, 0xaa, 0x6c, 0x01, 0x40, 0xb9, + 0x8c, 0x00, 0xf8, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x6c, 0x01, 0x00, 0xb9, 0xa0, 0x7a, 0x68, 0xf8, + 0xab, 0x7a, 0x2a, 0xf8, 0x29, 0x09, 0x40, 0xf9, + 0x2a, 0x01, 0x40, 0xb9, 0x6a, 0x00, 0xf8, 0x37, + 0x4a, 0x05, 0x00, 0x11, 0x2a, 0x01, 0x00, 0xb9, + 0xa9, 0x7a, 0x28, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb3, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xb3, 0x82, 0x1f, 0xf8, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0xb8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__NOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _NOP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 14000000 b 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_JUMP26 _JIT_CONTINUE +} + +void +emit__POP_EXCEPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_EXCEPT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 4: f85f82a8 ldur x8, [x21, #-0x8] + // 8: f9403ec9 ldr x9, [x22, #0x78] + // c: f940014a ldr x10, [x10] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 10: f9002295 str x21, [x20, #0x40] + // 14: f9400120 ldr x0, [x9] + // 18: eb0a011f cmp x8, x10 + // 1c: 9a8803e8 csel x8, xzr, x8, eq + // 20: f9000128 str x8, [x9] + // 24: b40000c0 cbz x0, 0x3c <_JIT_ENTRY+0x3c> + // 28: b9400008 ldr w8, [x0] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000008 str w8, [x0] + // 38: 540000a0 b.eq 0x4c <_JIT_ENTRY+0x4c> + // 3c: f9402288 ldr x8, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: d1002115 sub x21, x8, #0x8 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 50: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 54: 910003fd mov x29, sp + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 5c: d63f0100 blr x8 + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: f9402288 ldr x8, [x20, #0x40] + // 68: f900229f str xzr, [x20, #0x40] + // 6c: d1002115 sub x21, x8, #0x8 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[112] = { + 0x0a, 0x00, 0x00, 0x90, 0xa8, 0x82, 0x5f, 0xf8, + 0xc9, 0x3e, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x20, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x0a, 0xeb, 0xe8, 0x03, 0x88, 0x9a, + 0x28, 0x01, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x21, 0x00, 0xd1, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x21, 0x00, 0xd1, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x8); +} + +void +emit__POP_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea0 ldr x0, [x21, #-0x8]! + // 4: b9400008 ldr w8, [x0] + // 8: 37f80088 tbnz w8, #0x1f, 0x18 <_JIT_ENTRY+0x18> + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + // 1c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 20: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000020: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 24: 910003fd mov x29, sp + // 28: f9400108 ldr x8, [x8] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 2c: d63f0100 blr x8 + // 30: a8c17bfd ldp x29, x30, [sp], #0x10 + // 34: 14000000 b 0x34 <_JIT_ENTRY+0x34> + // 0000000000000034: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[56] = { + 0xa0, 0x8e, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x20, (uintptr_t)data); + patch_aarch64_12x(code + 0x28, (uintptr_t)data); + patch_aarch64_26r(code + 0x34, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__POP_TOP_LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP_LOAD_CONST_INLINE_BORROW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f8ea0 ldr x0, [x21, #-0x8]! + // 8: f9002295 str x21, [x20, #0x40] + // c: 910003fd mov x29, sp + // 10: b9400008 ldr w8, [x0] + // 14: 37f800e8 tbnz w8, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // 18: 71000508 subs w8, w8, #0x1 + // 1c: b9000008 str w8, [x0] + // 20: 54000081 b.ne 0x30 <_JIT_ENTRY+0x30> + // 24: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 28: f9400108 ldr x8, [x8] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 2c: d63f0100 blr x8 + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 3c: f900229f str xzr, [x20, #0x40] + // 40: f80086a8 str x8, [x21], #0x8 + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa0, 0x8e, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa8, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x24, (uintptr_t)data); + patch_aarch64_21rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x38, (uintptr_t)data + 0x8); +} + +void +emit__PUSH_EXC_INFO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_EXC_INFO.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a9 ldur x9, [x21, #-0x8] + // 4: f9403ecb ldr x11, [x22, #0x78] + // 8: aa1503e8 mov x8, x21 + // c: b940012c ldr w12, [x9] + // 10: f940016a ldr x10, [x11] + // 14: 37f8006c tbnz w12, #0x1f, 0x20 <_JIT_ENTRY+0x20> + // 18: 1100058c add w12, w12, #0x1 + // 1c: b900012c str w12, [x9] + // 20: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 0000000000000020: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 24: f100015f cmp x10, #0x0 + // 28: 91002115 add x21, x8, #0x8 + // 2c: f940018c ldr x12, [x12] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 30: f9000169 str x9, [x11] + // 34: 9a8a018a csel x10, x12, x10, eq + // 38: a93fa50a stp x10, x9, [x8, #-0x8] + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[64] = { + 0xa9, 0x82, 0x5f, 0xf8, 0xcb, 0x3e, 0x40, 0xf9, + 0xe8, 0x03, 0x15, 0xaa, 0x2c, 0x01, 0x40, 0xb9, + 0x6a, 0x01, 0x40, 0xf9, 0x6c, 0x00, 0xf8, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x2c, 0x01, 0x00, 0xb9, + 0x0c, 0x00, 0x00, 0x90, 0x5f, 0x01, 0x00, 0xf1, + 0x15, 0x21, 0x00, 0x91, 0x8c, 0x01, 0x40, 0xf9, + 0x69, 0x01, 0x00, 0xf9, 0x8a, 0x01, 0x8a, 0x9a, + 0x0a, 0xa5, 0x3f, 0xa9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x20, (uintptr_t)data); + patch_aarch64_12x(code + 0x2c, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_FRAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: b9402ec9 ldr w9, [x22, #0x2c] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9402115 ldr x21, [x8, #0x40] + // 10: 51000529 sub w9, w9, #0x1 + // 14: aa0803f4 mov x20, x8 + // 18: f90026c8 str x8, [x22, #0x48] + // 1c: b9002ec9 str w9, [x22, #0x2c] + // 20: f900211f str xzr, [x8, #0x40] + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0xc9, 0x2e, 0x40, 0xb9, + 0x95, 0x22, 0x00, 0xf9, 0x15, 0x21, 0x40, 0xf9, + 0x29, 0x05, 0x00, 0x51, 0xf4, 0x03, 0x08, 0xaa, + 0xc8, 0x26, 0x00, 0xf9, 0xc9, 0x2e, 0x00, 0xb9, + 0x1f, 0x21, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_NULL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f80086bf str xzr, [x21], #0x8 + // 4: 14000000 b 0x4 <_JIT_ENTRY+0x4> + // 0000000000000004: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[8] = { + 0xbf, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x4, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__PUSH_NULL_CONDITIONAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL_CONDITIONAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400129 ldr x9, [x9] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 12000128 and w8, w9, #0x1 + // c: 36000049 tbz w9, #0x0, 0x14 <_JIT_ENTRY+0x14> + // 10: f90002bf str xzr, [x21] + // 14: 8b284eb5 add x21, x21, w8, uxtw #3 + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[24] = { + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x01, 0x00, 0x12, 0x49, 0x00, 0x00, 0x36, + 0xbf, 0x02, 0x00, 0xf9, 0xb5, 0x4e, 0x28, 0x8b, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); +} + +void +emit__PY_FRAME_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_GENERAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800028 mov x8, #-0x2 // =-2 + // c: aa1f03e2 mov x2, xzr + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: 910003fd mov x29, sp + // 18: cb292108 sub x8, x8, w9, uxth + // 1c: 12003d2a and w10, w9, #0xffff + // 20: cb292ea9 sub x9, x21, w9, uxth #3 + // 24: 2a2a03ec mvn w12, w10 + // 28: f8687aab ldr x11, [x21, x8, lsl #3] + // 2c: f86cdaac ldr x12, [x21, w12, sxtw #3] + // 30: f940196d ldr x13, [x11, #0x30] + // 34: f100019f cmp x12, #0x0 + // 38: 928000ec mov x12, #-0x8 // =-8 + // 3c: 1a8a0544 cinc w4, w10, ne + // 40: 9a9f118a csel x10, x12, xzr, ne + // 44: 3940c1ad ldrb w13, [x13, #0x30] + // 48: 370000cd tbnz w13, #0x0, 0x60 <_JIT_ENTRY+0x60> + // 4c: f9400962 ldr x2, [x11, #0x10] + // 50: b940004b ldr w11, [x2] + // 54: 37f8006b tbnz w11, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 58: 1100056b add w11, w11, #0x1 + // 5c: b900004b str w11, [x2] + // 60: d37df113 lsl x19, x8, #3 + // 64: f9002295 str x21, [x20, #0x40] + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _PyEvalFramePushAndInit + // 6c: 8b0a0123 add x3, x9, x10 + // 70: aa1603e0 mov x0, x22 + // 74: aa1f03e5 mov x5, xzr + // 78: f8736aa1 ldr x1, [x21, x19] + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _PyEvalFramePushAndInit + // 80: aa1403e6 mov x6, x20 + // 84: d63f0100 blr x8 + // 88: f9402288 ldr x8, [x20, #0x40] + // 8c: f900229f str xzr, [x20, #0x40] + // 90: 8b130115 add x21, x8, x19 + // 94: b4000080 cbz x0, 0xa4 <_JIT_ENTRY+0xa4> + // 98: f80086a0 str x0, [x21], #0x8 + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 <_JIT_ENTRY+0xa0> + // 00000000000000a0: R_AARCH64_JUMP26 _JIT_CONTINUE + // a4: a8c17bfd ldp x29, x30, [sp], #0x10 + // a8: 14000000 b 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // ac: 00 00 00 00 + const unsigned char code_body[176] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x28, 0x00, 0x80, 0x92, 0xe2, 0x03, 0x1f, 0xaa, + 0x29, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x21, 0x29, 0xcb, 0x2a, 0x3d, 0x00, 0x12, + 0xa9, 0x2e, 0x29, 0xcb, 0xec, 0x03, 0x2a, 0x2a, + 0xab, 0x7a, 0x68, 0xf8, 0xac, 0xda, 0x6c, 0xf8, + 0x6d, 0x19, 0x40, 0xf9, 0x9f, 0x01, 0x00, 0xf1, + 0xec, 0x00, 0x80, 0x92, 0x44, 0x05, 0x8a, 0x1a, + 0x8a, 0x11, 0x9f, 0x9a, 0xad, 0xc1, 0x40, 0x39, + 0xcd, 0x00, 0x00, 0x37, 0x62, 0x09, 0x40, 0xf9, + 0x4b, 0x00, 0x40, 0xb9, 0x6b, 0x00, 0xf8, 0x37, + 0x6b, 0x05, 0x00, 0x11, 0x4b, 0x00, 0x00, 0xb9, + 0x13, 0xf1, 0x7d, 0xd3, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x23, 0x01, 0x0a, 0x8b, + 0xe0, 0x03, 0x16, 0xaa, 0xe5, 0x03, 0x1f, 0xaa, + 0xa1, 0x6a, 0x73, 0xf8, 0x08, 0x01, 0x40, 0xf9, + 0xe6, 0x03, 0x14, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x01, 0x13, 0x8b, 0x80, 0x00, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEvalFramePushAndInit+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x68, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xa0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xa8, state->instruction_starts[instruction->error_target]); +} + +void +emit__PY_FRAME_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_KW.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 92800048 mov x8, #-0x3 // =-3 + // c: 9280002c mov x12, #-0x2 // =-2 + // 10: f9400129 ldr x9, [x9] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f85f82b3 ldur x19, [x21, #-0x8] + // 18: aa1f03e2 mov x2, xzr + // 1c: 910003fd mov x29, sp + // 20: 92403d2b and x11, x9, #0xffff + // 24: 12003d2d and w13, w9, #0xffff + // 28: b940126e ldr w14, [x19, #0x10] + // 2c: cb0b0108 sub x8, x8, x11 + // 30: cb0b0197 sub x23, x12, x11 + // 34: 2a2d03ec mvn w12, w13 + // 38: f8687aaa ldr x10, [x21, x8, lsl #3] + // 3c: f8777aa9 ldr x9, [x21, x23, lsl #3] + // 40: f940194b ldr x11, [x10, #0x30] + // 44: f100013f cmp x9, #0x0 + // 48: 8b2ccea9 add x9, x21, w12, sxtw #3 + // 4c: 1a8d05ac cinc w12, w13, ne + // 50: 3940c16f ldrb w15, [x11, #0x30] + // 54: 928000eb mov x11, #-0x8 // =-8 + // 58: 4b0e018c sub w12, w12, w14 + // 5c: 9a9f116b csel x11, x11, xzr, ne + // 60: 370000cf tbnz w15, #0x0, 0x78 <_JIT_ENTRY+0x78> + // 64: f9400942 ldr x2, [x10, #0x10] + // 68: b940004a ldr w10, [x2] + // 6c: 37f8006a tbnz w10, #0x1f, 0x78 <_JIT_ENTRY+0x78> + // 70: 1100054a add w10, w10, #0x1 + // 74: b900004a str w10, [x2] + // 78: f9002295 str x21, [x20, #0x40] + // 7c: 93407d84 sxtw x4, w12 + // 80: 8b0b0123 add x3, x9, x11 + // 84: f8687aa1 ldr x1, [x21, x8, lsl #3] + // 88: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_GOT_PAGE _PyEvalFramePushAndInit + // 8c: aa1603e0 mov x0, x22 + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC _PyEvalFramePushAndInit + // 94: aa1303e5 mov x5, x19 + // 98: aa1403e6 mov x6, x20 + // 9c: d63f0100 blr x8 + // a0: f9402288 ldr x8, [x20, #0x40] + // a4: d1002108 sub x8, x8, #0x8 + // a8: f9002288 str x8, [x20, #0x40] + // ac: b9400268 ldr w8, [x19] + // b0: 37f80088 tbnz w8, #0x1f, 0xc0 <_JIT_ENTRY+0xc0> + // b4: 71000508 subs w8, w8, #0x1 + // b8: b9000268 str w8, [x19] + // bc: 54000100 b.eq 0xdc <_JIT_ENTRY+0xdc> + // c0: f9402288 ldr x8, [x20, #0x40] + // c4: f900229f str xzr, [x20, #0x40] + // c8: 8b170d15 add x21, x8, x23, lsl #3 + // cc: b40001c0 cbz x0, 0x104 <_JIT_ENTRY+0x104> + // d0: f80086a0 str x0, [x21], #0x8 + // d4: a8c17bfd ldp x29, x30, [sp], #0x10 + // d8: 14000000 b 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d8: R_AARCH64_JUMP26 _JIT_CONTINUE + // dc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000dc: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // e0: aa0003f5 mov x21, x0 + // e4: aa1303e0 mov x0, x19 + // e8: f9400108 ldr x8, [x8] + // 00000000000000e8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // ec: d63f0100 blr x8 + // f0: aa1503e0 mov x0, x21 + // f4: f9402288 ldr x8, [x20, #0x40] + // f8: f900229f str xzr, [x20, #0x40] + // fc: 8b170d15 add x21, x8, x23, lsl #3 + // 100: b5fffe80 cbnz x0, 0xd0 <_JIT_ENTRY+0xd0> + // 104: a8c17bfd ldp x29, x30, [sp], #0x10 + // 108: 14000000 b 0x108 <_JIT_ENTRY+0x108> + // 0000000000000108: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 10c: 00 00 00 00 + const unsigned char code_body[272] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0x48, 0x00, 0x80, 0x92, 0x2c, 0x00, 0x80, 0x92, + 0x29, 0x01, 0x40, 0xf9, 0xb3, 0x82, 0x5f, 0xf8, + 0xe2, 0x03, 0x1f, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x2b, 0x3d, 0x40, 0x92, 0x2d, 0x3d, 0x00, 0x12, + 0x6e, 0x12, 0x40, 0xb9, 0x08, 0x01, 0x0b, 0xcb, + 0x97, 0x01, 0x0b, 0xcb, 0xec, 0x03, 0x2d, 0x2a, + 0xaa, 0x7a, 0x68, 0xf8, 0xa9, 0x7a, 0x77, 0xf8, + 0x4b, 0x19, 0x40, 0xf9, 0x3f, 0x01, 0x00, 0xf1, + 0xa9, 0xce, 0x2c, 0x8b, 0xac, 0x05, 0x8d, 0x1a, + 0x6f, 0xc1, 0x40, 0x39, 0xeb, 0x00, 0x80, 0x92, + 0x8c, 0x01, 0x0e, 0x4b, 0x6b, 0x11, 0x9f, 0x9a, + 0xcf, 0x00, 0x00, 0x37, 0x42, 0x09, 0x40, 0xf9, + 0x4a, 0x00, 0x40, 0xb9, 0x6a, 0x00, 0xf8, 0x37, + 0x4a, 0x05, 0x00, 0x11, 0x4a, 0x00, 0x00, 0xb9, + 0x95, 0x22, 0x00, 0xf9, 0x84, 0x7d, 0x40, 0x93, + 0x23, 0x01, 0x0b, 0x8b, 0xa1, 0x7a, 0x68, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x16, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0xe5, 0x03, 0x13, 0xaa, + 0xe6, 0x03, 0x14, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x21, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0x00, 0x01, 0x00, 0x54, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x0d, 0x17, 0x8b, 0xc0, 0x01, 0x00, 0xb4, + 0xa0, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0xaa, 0x88, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x15, 0x0d, 0x17, 0x8b, + 0x80, 0xfe, 0xff, 0xb5, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x88, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x90, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xd8, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xdc, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xe8, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x108, state->instruction_starts[instruction->error_target]); +} + +void +emit__REPLACE_WITH_TRUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _REPLACE_WITH_TRUE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: b9400008 ldr w8, [x0] + // 8: 37f80088 tbnz w8, #0x1f, 0x18 <_JIT_ENTRY+0x18> + // c: 71000508 subs w8, w8, #0x1 + // 10: b9000008 str w8, [x0] + // 14: 540000a0 b.eq 0x28 <_JIT_ENTRY+0x28> + // 18: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000018: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 20: f81f82a8 stur x8, [x21, #-0x8] + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + // 28: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 30: 910003fd mov x29, sp + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 38: d63f0100 blr x8 + // 3c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 40: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 44: f9400108 ldr x8, [x8] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 48: f81f82a8 stur x8, [x21, #-0x8] + // 4c: 14000000 b 0x4c <_JIT_ENTRY+0x4c> + // 000000000000004c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[80] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x4c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RESUME_CHECK.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400ec8 ldr x8, [x22, #0x18] + // 4: f9400289 ldr x9, [x20] + // 8: f9405529 ldr x9, [x9, #0xa8] + // c: eb09011f cmp x8, x9 + // 10: 54000041 b.ne 0x18 <_JIT_ENTRY+0x18> + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_CONTINUE + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 00 00 00 00 + const unsigned char code_body[32] = { + 0xc8, 0x0e, 0x40, 0xf9, 0x89, 0x02, 0x40, 0xf9, + 0x29, 0x55, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x41, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x14, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); +} + +void +emit__RETURN_GENERATOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_GENERATOR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9002295 str x21, [x20, #0x40] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _Py_MakeCoro + // c: f9400a80 ldr x0, [x20, #0x10] + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _Py_MakeCoro + // 14: 910003fd mov x29, sp + // 18: d63f0100 blr x8 + // 1c: f9402295 ldr x21, [x20, #0x40] + // 20: f900229f str xzr, [x20, #0x40] + // 24: b4000800 cbz x0, 0x124 <_JIT_ENTRY+0x124> + // 28: f9401e88 ldr x8, [x20, #0x38] + // 2c: ad400281 ldp q1, q0, [x20] + // 30: 91000908 add x8, x8, #0x2 + // 34: a903d688 stp x8, x21, [x20, #0x38] + // 38: aa1403e8 mov x8, x20 + // 3c: 3c858000 stur q0, [x0, #0x58] + // 40: 3c848001 stur q1, [x0, #0x48] + // 44: ad410680 ldp q0, q1, [x20, #0x20] + // 48: 3dc01282 ldr q2, [x20, #0x40] + // 4c: f8450d09 ldr x9, [x8, #0x50]! + // 50: 3c888002 stur q2, [x0, #0x88] + // 54: 3c868000 stur q0, [x0, #0x68] + // 58: f9004c09 str x9, [x0, #0x98] + // 5c: 3c878001 stur q1, [x0, #0x78] + // 60: f9402289 ldr x9, [x20, #0x40] + // 64: cb080128 sub x8, x9, x8 + // 68: d343fd09 lsr x9, x8, #3 + // 6c: 8b29cc0a add x10, x0, w9, sxtw #3 + // 70: 7100093f cmp w9, #0x2 + // 74: 9102614a add x10, x10, #0x98 + // 78: f900440a str x10, [x0, #0x88] + // 7c: 5400028b b.lt 0xcc <_JIT_ENTRY+0xcc> + // 80: d3438508 ubfx x8, x8, #3, #31 + // 84: d100050a sub x10, x8, #0x1 + // 88: f100195f cmp x10, #0x6 + // 8c: 540000a3 b.lo 0xa0 <_JIT_ENTRY+0xa0> + // 90: cb140009 sub x9, x0, x20 + // 94: 91012129 add x9, x9, #0x48 + // 98: f100813f cmp x9, #0x20 + // 9c: 54000482 b.hs 0x12c <_JIT_ENTRY+0x12c> + // a0: 52800029 mov w9, #0x1 // =1 + // a4: d37df12a lsl x10, x9, #3 + // a8: cb080128 sub x8, x9, x8 + // ac: 8b14014b add x11, x10, x20 + // b0: 8b00014a add x10, x10, x0 + // b4: 91014169 add x9, x11, #0x50 + // b8: 9102614a add x10, x10, #0x98 + // bc: f840852b ldr x11, [x9], #0x8 + // c0: b1000508 adds x8, x8, #0x1 + // c4: f800854b str x11, [x10], #0x8 + // c8: 54ffffa3 b.lo 0xbc <_JIT_ENTRY+0xbc> + // cc: 52801fa8 mov w8, #0xfd // =253 + // d0: b9402ec9 ldr w9, [x22, #0x2c] + // d4: f900281f str xzr, [x0, #0x50] + // d8: 39010c08 strb w8, [x0, #0x43] + // dc: 52800028 mov w8, #0x1 // =1 + // e0: f9400693 ldr x19, [x20, #0x8] + // e4: 39024808 strb w8, [x0, #0x92] + // e8: 11000528 add w8, w9, #0x1 + // ec: aa0003f7 mov x23, x0 + // f0: b9002ec8 str w8, [x22, #0x2c] + // f4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000f4: R_AARCH64_ADR_GOT_PAGE _PyThreadState_PopFrame + // f8: aa1603e0 mov x0, x22 + // fc: f9400108 ldr x8, [x8] + // 00000000000000fc: R_AARCH64_LD64_GOT_LO12_NC _PyThreadState_PopFrame + // 100: aa1403e1 mov x1, x20 + // 104: d63f0100 blr x8 + // 108: f9402275 ldr x21, [x19, #0x40] + // 10c: f90026d3 str x19, [x22, #0x48] + // 110: aa1303f4 mov x20, x19 + // 114: f900227f str xzr, [x19, #0x40] + // 118: f80086b7 str x23, [x21], #0x8 + // 11c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 120: 14000000 b 0x120 <_JIT_ENTRY+0x120> + // 0000000000000120: R_AARCH64_JUMP26 _JIT_CONTINUE + // 124: a8c17bfd ldp x29, x30, [sp], #0x10 + // 128: 14000000 b 0x128 <_JIT_ENTRY+0x128> + // 0000000000000128: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 12c: 927ef54b and x11, x10, #0xfffffffffffffffc + // 130: 9102c00c add x12, x0, #0xb0 + // 134: 9101a28d add x13, x20, #0x68 + // 138: b2400169 orr x9, x11, #0x1 + // 13c: aa0b03ee mov x14, x11 + // 140: ad7f85a0 ldp q0, q1, [x13, #-0x10] + // 144: f10011ce subs x14, x14, #0x4 + // 148: 910081ad add x13, x13, #0x20 + // 14c: ad3f8580 stp q0, q1, [x12, #-0x10] + // 150: 9100818c add x12, x12, #0x20 + // 154: 54ffff61 b.ne 0x140 <_JIT_ENTRY+0x140> + // 158: eb0b015f cmp x10, x11 + // 15c: 54fffb80 b.eq 0xcc <_JIT_ENTRY+0xcc> + // 160: 17ffffd1 b 0xa4 <_JIT_ENTRY+0xa4> + // 164: 00 00 00 00 + const unsigned char code_body[360] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x80, 0x0a, 0x40, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x08, 0x00, 0xb4, + 0x88, 0x1e, 0x40, 0xf9, 0x81, 0x02, 0x40, 0xad, + 0x08, 0x09, 0x00, 0x91, 0x88, 0xd6, 0x03, 0xa9, + 0xe8, 0x03, 0x14, 0xaa, 0x00, 0x80, 0x85, 0x3c, + 0x01, 0x80, 0x84, 0x3c, 0x80, 0x06, 0x41, 0xad, + 0x82, 0x12, 0xc0, 0x3d, 0x09, 0x0d, 0x45, 0xf8, + 0x02, 0x80, 0x88, 0x3c, 0x00, 0x80, 0x86, 0x3c, + 0x09, 0x4c, 0x00, 0xf9, 0x01, 0x80, 0x87, 0x3c, + 0x89, 0x22, 0x40, 0xf9, 0x28, 0x01, 0x08, 0xcb, + 0x09, 0xfd, 0x43, 0xd3, 0x0a, 0xcc, 0x29, 0x8b, + 0x3f, 0x09, 0x00, 0x71, 0x4a, 0x61, 0x02, 0x91, + 0x0a, 0x44, 0x00, 0xf9, 0x8b, 0x02, 0x00, 0x54, + 0x08, 0x85, 0x43, 0xd3, 0x0a, 0x05, 0x00, 0xd1, + 0x5f, 0x19, 0x00, 0xf1, 0xa3, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x14, 0xcb, 0x29, 0x21, 0x01, 0x91, + 0x3f, 0x81, 0x00, 0xf1, 0x82, 0x04, 0x00, 0x54, + 0x29, 0x00, 0x80, 0x52, 0x2a, 0xf1, 0x7d, 0xd3, + 0x28, 0x01, 0x08, 0xcb, 0x4b, 0x01, 0x14, 0x8b, + 0x4a, 0x01, 0x00, 0x8b, 0x69, 0x41, 0x01, 0x91, + 0x4a, 0x61, 0x02, 0x91, 0x2b, 0x85, 0x40, 0xf8, + 0x08, 0x05, 0x00, 0xb1, 0x4b, 0x85, 0x00, 0xf8, + 0xa3, 0xff, 0xff, 0x54, 0xa8, 0x1f, 0x80, 0x52, + 0xc9, 0x2e, 0x40, 0xb9, 0x1f, 0x28, 0x00, 0xf9, + 0x08, 0x0c, 0x01, 0x39, 0x28, 0x00, 0x80, 0x52, + 0x93, 0x06, 0x40, 0xf9, 0x08, 0x48, 0x02, 0x39, + 0x28, 0x05, 0x00, 0x11, 0xf7, 0x03, 0x00, 0xaa, + 0xc8, 0x2e, 0x00, 0xb9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x14, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x75, 0x22, 0x40, 0xf9, 0xd3, 0x26, 0x00, 0xf9, + 0xf4, 0x03, 0x13, 0xaa, 0x7f, 0x22, 0x00, 0xf9, + 0xb7, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x4b, 0xf5, 0x7e, 0x92, + 0x0c, 0xc0, 0x02, 0x91, 0x8d, 0xa2, 0x01, 0x91, + 0x69, 0x01, 0x40, 0xb2, 0xee, 0x03, 0x0b, 0xaa, + 0xa0, 0x85, 0x7f, 0xad, 0xce, 0x11, 0x00, 0xf1, + 0xad, 0x81, 0x00, 0x91, 0x80, 0x85, 0x3f, 0xad, + 0x8c, 0x81, 0x00, 0x91, 0x61, 0xff, 0xff, 0x54, + 0x5f, 0x01, 0x0b, 0xeb, 0x80, 0xfb, 0xff, 0x54, + 0xd1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_MakeCoro+0x0 + // 8: &_PyThreadState_PopFrame+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_MakeCoro); + patch_64(data + 0x8, (uintptr_t)&_PyThreadState_PopFrame); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0xf4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xfc, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x120, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x128, state->instruction_starts[instruction->error_target]); +} + +void +emit__RETURN_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_VALUE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: b9402ec8 ldr w8, [x22, #0x2c] + // 8: aa1403e1 mov x1, x20 + // c: aa1603e0 mov x0, x22 + // 10: f85f8eb3 ldr x19, [x21, #-0x8]! + // 14: f9002295 str x21, [x20, #0x40] + // 18: f9400694 ldr x20, [x20, #0x8] + // 1c: 11000508 add w8, w8, #0x1 + // 20: 910003fd mov x29, sp + // 24: b9002ec8 str w8, [x22, #0x2c] + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _PyEval_FrameClearAndPop + // 2c: f90026d4 str x20, [x22, #0x48] + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _PyEval_FrameClearAndPop + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: f80086b3 str x19, [x21], #0x8 + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[72] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xc8, 0x2e, 0x40, 0xb9, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0xb3, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x94, 0x06, 0x40, 0xf9, 0x08, 0x05, 0x00, 0x11, + 0xfd, 0x03, 0x00, 0x91, 0xc8, 0x2e, 0x00, 0xb9, + 0x08, 0x00, 0x00, 0x90, 0xd4, 0x26, 0x00, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xb3, 0x86, 0x00, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: &_PyEval_FrameClearAndPop+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FrameClearAndPop); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data); + patch_aarch64_12x(code + 0x30, (uintptr_t)data); +} + +void +emit__SAVE_RETURN_OFFSET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SAVE_RETURN_OFFSET.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: 79009288 strh w8, [x20, #0x48] + // c: 14000000 b 0xc <_JIT_ENTRY+0xc> + // 000000000000000c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[16] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x92, 0x00, 0x79, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SEND_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SEND_GEN_FRAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02a8 ldur x8, [x21, #-0x10] + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyGen_Type + // 8: 9000000b adrp x11, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyCoro_Type + // c: f9400509 ldr x9, [x8, #0x8] + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyGen_Type + // 14: f940016b ldr x11, [x11] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyCoro_Type + // 18: eb0a013f cmp x9, x10 + // 1c: fa4b1124 ccmp x9, x11, #0x4, ne + // 20: 54000061 b.ne 0x2c <_JIT_ENTRY+0x2c> + // 24: 39c10d09 ldrsb w9, [x8, #0x43] + // 28: 37f80049 tbnz w9, #0x1f, 0x30 <_JIT_ENTRY+0x30> + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 30: f85f82a9 ldur x9, [x21, #-0x8] + // 34: f940450a ldr x10, [x8, #0x88] + // 38: 9100a10b add x11, x8, #0x28 + // 3c: f9000149 str x9, [x10] + // 40: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 44: f9400129 ldr x9, [x9] + // 0000000000000044: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 48: f9403eca ldr x10, [x22, #0x78] + // 4c: f9003ecb str x11, [x22, #0x78] + // 50: f940450b ldr x11, [x8, #0x88] + // 54: 39010d1f strb wzr, [x8, #0x43] + // 58: 11000929 add w9, w9, #0x2 + // 5c: f900190a str x10, [x8, #0x30] + // 60: 9101210a add x10, x8, #0x48 + // 64: 79009289 strh w9, [x20, #0x48] + // 68: 91002169 add x9, x11, #0x8 + // 6c: f9002914 str x20, [x8, #0x50] + // 70: f9004509 str x9, [x8, #0x88] + // 74: f81f82aa stur x10, [x21, #-0x8] + // 78: 14000000 b 0x78 <_JIT_ENTRY+0x78> + // 0000000000000078: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[120] = { + 0xa8, 0x02, 0x5f, 0xf8, 0x0a, 0x00, 0x00, 0x90, + 0x0b, 0x00, 0x00, 0x90, 0x09, 0x05, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0x6b, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x24, 0x11, 0x4b, 0xfa, + 0x61, 0x00, 0x00, 0x54, 0x09, 0x0d, 0xc1, 0x39, + 0x49, 0x00, 0xf8, 0x37, 0x00, 0x00, 0x00, 0x14, + 0xa9, 0x82, 0x5f, 0xf8, 0x0a, 0x45, 0x40, 0xf9, + 0x0b, 0xa1, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0xca, 0x3e, 0x40, 0xf9, 0xcb, 0x3e, 0x00, 0xf9, + 0x0b, 0x45, 0x40, 0xf9, 0x1f, 0x0d, 0x01, 0x39, + 0x29, 0x09, 0x00, 0x11, 0x0a, 0x19, 0x00, 0xf9, + 0x0a, 0x21, 0x01, 0x91, 0x89, 0x92, 0x00, 0x79, + 0x69, 0x21, 0x00, 0x91, 0x14, 0x29, 0x00, 0xf9, + 0x09, 0x45, 0x00, 0xf9, 0xaa, 0x82, 0x1f, 0xf8, + }; + // 0: &PyGen_Type+0x0 + // 8: &PyCoro_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyGen_Type); + patch_64(data + 0x8, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x2c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x40, (uintptr_t)data + 0x10); +} + +void +emit__SETUP_ANNOTATIONS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SETUP_ANNOTATIONS.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10083ff sub sp, sp, #0x20 + // 4: f9401680 ldr x0, [x20, #0x28] + // 8: a9017bfd stp x29, x30, [sp, #0x10] + // c: 910043fd add x29, sp, #0x10 + // 10: f9002295 str x21, [x20, #0x40] + // 14: b4000380 cbz x0, 0x84 <_JIT_ENTRY+0x84> + // 18: 90000013 adrp x19, 0x0 <_JIT_ENTRY> + // 0000000000000018: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE PyMapping_GetOptionalItem + // 20: 52921608 mov w8, #0x90b0 // =37040 + // 24: f9400273 ldr x19, [x19] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 28: f9400129 ldr x9, [x9] + // 0000000000000028: R_AARCH64_LD64_GOT_LO12_NC PyMapping_GetOptionalItem + // 2c: 910023e2 add x2, sp, #0x8 + // 30: 8b080261 add x1, x19, x8 + // 34: d63f0120 blr x9 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: 37f80380 tbnz w0, #0x1f, 0xb0 <_JIT_ENTRY+0xb0> + // 44: f94007e0 ldr x0, [sp, #0x8] + // 48: f9002295 str x21, [x20, #0x40] + // 4c: b4000380 cbz x0, 0xbc <_JIT_ENTRY+0xbc> + // 50: b9400008 ldr w8, [x0] + // 54: 37f800e8 tbnz w8, #0x1f, 0x70 <_JIT_ENTRY+0x70> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b9000008 str w8, [x0] + // 60: 54000081 b.ne 0x70 <_JIT_ENTRY+0x70> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: f9400108 ldr x8, [x8] + // 0000000000000068: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 6c: d63f0100 blr x8 + // 70: f9402295 ldr x21, [x20, #0x40] + // 74: f900229f str xzr, [x20, #0x40] + // 78: a9417bfd ldp x29, x30, [sp, #0x10] + // 7c: 910083ff add sp, sp, #0x20 + // 80: 14000000 b 0x80 <_JIT_ENTRY+0x80> + // 0000000000000080: R_AARCH64_JUMP26 _JIT_CONTINUE + // 84: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000084: R_AARCH64_ADR_GOT_PAGE PyExc_SystemError + // 88: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000088: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 8c: 91000042 add x2, x2, #0x0 + // 000000000000008c: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 90: f9400108 ldr x8, [x8] + // 0000000000000090: R_AARCH64_LD64_GOT_LO12_NC PyExc_SystemError + // 94: aa1603e0 mov x0, x22 + // 98: f9400101 ldr x1, [x8] + // 9c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000009c: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // a0: f9400108 ldr x8, [x8] + // 00000000000000a0: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // a4: d63f0100 blr x8 + // a8: f9402295 ldr x21, [x20, #0x40] + // ac: f900229f str xzr, [x20, #0x40] + // b0: a9417bfd ldp x29, x30, [sp, #0x10] + // b4: 910083ff add sp, sp, #0x20 + // b8: 14000000 b 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b8: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // bc: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000bc: R_AARCH64_ADR_GOT_PAGE PyDict_New + // c0: f9400108 ldr x8, [x8] + // 00000000000000c0: R_AARCH64_LD64_GOT_LO12_NC PyDict_New + // c4: d63f0100 blr x8 + // c8: f9402295 ldr x21, [x20, #0x40] + // cc: f900229f str xzr, [x20, #0x40] + // d0: f90007e0 str x0, [sp, #0x8] + // d4: b4fffee0 cbz x0, 0xb0 <_JIT_ENTRY+0xb0> + // d8: f9002295 str x21, [x20, #0x40] + // dc: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 00000000000000dc: R_AARCH64_ADR_GOT_PAGE PyObject_SetItem + // e0: aa0003e2 mov x2, x0 + // e4: f9401680 ldr x0, [x20, #0x28] + // e8: 52921608 mov w8, #0x90b0 // =37040 + // ec: f9400129 ldr x9, [x9] + // 00000000000000ec: R_AARCH64_LD64_GOT_LO12_NC PyObject_SetItem + // f0: 8b080261 add x1, x19, x8 + // f4: d63f0120 blr x9 + // f8: f94007e8 ldr x8, [sp, #0x8] + // fc: b9400109 ldr w9, [x8] + // 100: 37f80149 tbnz w9, #0x1f, 0x128 <_JIT_ENTRY+0x128> + // 104: 71000529 subs w9, w9, #0x1 + // 108: b9000109 str w9, [x8] + // 10c: 540000e1 b.ne 0x128 <_JIT_ENTRY+0x128> + // 110: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000110: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 114: 2a0003f3 mov w19, w0 + // 118: aa0803e0 mov x0, x8 + // 11c: f9400129 ldr x9, [x9] + // 000000000000011c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 120: d63f0120 blr x9 + // 124: 2a1303e0 mov w0, w19 + // 128: f9402295 ldr x21, [x20, #0x40] + // 12c: f900229f str xzr, [x20, #0x40] + // 130: 35fffc00 cbnz w0, 0xb0 <_JIT_ENTRY+0xb0> + // 134: 17ffffd1 b 0x78 <_JIT_ENTRY+0x78> + const unsigned char code_body[312] = { + 0xff, 0x83, 0x00, 0xd1, 0x80, 0x16, 0x40, 0xf9, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, + 0x95, 0x22, 0x00, 0xf9, 0x80, 0x03, 0x00, 0xb4, + 0x13, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x16, 0x92, 0x52, 0x73, 0x02, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0xe2, 0x23, 0x00, 0x91, + 0x61, 0x02, 0x08, 0x8b, 0x20, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x80, 0x03, 0xf8, 0x37, 0xe0, 0x07, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x80, 0x03, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x01, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0x41, 0xa9, 0xff, 0x83, 0x00, 0x91, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0xfe, 0xff, 0xb4, + 0x95, 0x22, 0x00, 0xf9, 0x09, 0x00, 0x00, 0x90, + 0xe2, 0x03, 0x00, 0xaa, 0x80, 0x16, 0x40, 0xf9, + 0x08, 0x16, 0x92, 0x52, 0x29, 0x01, 0x40, 0xf9, + 0x61, 0x02, 0x08, 0x8b, 0x20, 0x01, 0x3f, 0xd6, + 0xe8, 0x07, 0x40, 0xf9, 0x09, 0x01, 0x40, 0xb9, + 0x49, 0x01, 0xf8, 0x37, 0x29, 0x05, 0x00, 0x71, + 0x09, 0x01, 0x00, 0xb9, 0xe1, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x08, 0xaa, 0x29, 0x01, 0x40, 0xf9, + 0x20, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0xfc, 0xff, 0x35, 0xd1, 0xff, 0xff, 0x17, + }; + // 0: 'no locals found when setting up annotations\x00' + // 2c: 00 00 00 00 + // 30: &_PyRuntime+0x0 + // 38: &PyMapping_GetOptionalItem+0x0 + // 40: &_Py_Dealloc+0x0 + // 48: &PyExc_SystemError+0x0 + // 50: &_PyErr_Format+0x0 + // 58: &PyDict_New+0x0 + // 60: &PyObject_SetItem+0x0 + const unsigned char data_body[104] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_PyRuntime); + patch_64(data + 0x38, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x40, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x48, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x50, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x58, (uintptr_t)&PyDict_New); + patch_64(data + 0x60, (uintptr_t)&PyObject_SetItem); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x18, (uintptr_t)data + 0x30); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x38); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x30); + patch_aarch64_12x(code + 0x28, (uintptr_t)data + 0x38); + patch_aarch64_33rx(code + 0x64, (uintptr_t)data + 0x40); + patch_aarch64_26r(code + 0x80, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x84, (uintptr_t)data + 0x48); + patch_aarch64_21r(code + 0x88, (uintptr_t)data); + patch_aarch64_12(code + 0x8c, (uintptr_t)data); + patch_aarch64_12x(code + 0x90, (uintptr_t)data + 0x48); + patch_aarch64_33rx(code + 0x9c, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0xb8, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0xbc, (uintptr_t)data + 0x58); + patch_aarch64_21rx(code + 0xdc, (uintptr_t)data + 0x60); + patch_aarch64_12x(code + 0xec, (uintptr_t)data + 0x60); + patch_aarch64_21rx(code + 0x110, (uintptr_t)data + 0x40); + patch_aarch64_12x(code + 0x11c, (uintptr_t)data + 0x40); +} + +void +emit__SET_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_ADD.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: f85f82b3 ldur x19, [x21, #-0x8] + // 14: 2a2803e8 mvn w8, w8 + // 18: aa1303e1 mov x1, x19 + // 1c: 531d7108 lsl w8, w8, #3 + // 20: b26db108 orr x8, x8, #0xfffffffffff80000 + // 24: f8686aa0 ldr x0, [x21, x8] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PySet_Add + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC PySet_Add + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a0 b.eq 0x64 <_JIT_ENTRY+0x64> + // 54: d10022b5 sub x21, x21, #0x8 + // 58: 34000140 cbz w0, 0x80 <_JIT_ENTRY+0x80> + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 2a0003f7 mov w23, w0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: d10022b5 sub x21, x21, #0x8 + // 7c: 35ffff17 cbnz w23, 0x5c <_JIT_ENTRY+0x5c> + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 <_JIT_ENTRY+0x84> + // 0000000000000084: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0xe8, 0x03, 0x28, 0x2a, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0x40, 0x01, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0x17, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PySet_Add+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySet_Add); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x60, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SET_FUNCTION_ATTRIBUTE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_FUNCTION_ATTRIBUTE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_FunctionAttributeOffsets + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _Py_FunctionAttributeOffsets + // 10: f85f8eaa ldr x10, [x21, #-0x8]! + // 14: 92403d08 and x8, x8, #0xffff + // 18: f8687928 ldr x8, [x9, x8, lsl #3] + // 1c: f85f82a9 ldur x9, [x21, #-0x8] + // 20: f8286949 str x9, [x10, x8] + // 24: f81f82aa stur x10, [x21, #-0x8] + // 28: 14000000 b 0x28 <_JIT_ENTRY+0x28> + // 0000000000000028: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xaa, 0x8e, 0x5f, 0xf8, 0x08, 0x3d, 0x40, 0x92, + 0x28, 0x79, 0x68, 0xf8, 0xa9, 0x82, 0x5f, 0xf8, + 0x49, 0x69, 0x28, 0xf8, 0xaa, 0x82, 0x1f, 0xf8, + }; + // 0: OPARG + // 8: &_Py_FunctionAttributeOffsets+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_FunctionAttributeOffsets); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data + 0x8); +} + +void +emit__SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_IP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 8: f9001e88 str x8, [x20, #0x38] + // c: 14000000 b 0xc <_JIT_ENTRY+0xc> + // 000000000000000c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[16] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x88, 0x1e, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0xc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__SET_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_UPDATE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 10: f85f82b3 ldur x19, [x21, #-0x8] + // 14: 2a2803e8 mvn w8, w8 + // 18: aa1303e1 mov x1, x19 + // 1c: 531d7108 lsl w8, w8, #3 + // 20: b26db108 orr x8, x8, #0xfffffffffff80000 + // 24: f8686aa0 ldr x0, [x21, x8] + // 28: f9002295 str x21, [x20, #0x40] + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _PySet_Update + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _PySet_Update + // 34: d63f0100 blr x8 + // 38: f9402295 ldr x21, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: b9400268 ldr w8, [x19] + // 44: 37f80088 tbnz w8, #0x1f, 0x54 <_JIT_ENTRY+0x54> + // 48: 71000508 subs w8, w8, #0x1 + // 4c: b9000268 str w8, [x19] + // 50: 540000a0 b.eq 0x64 <_JIT_ENTRY+0x64> + // 54: d10022b5 sub x21, x21, #0x8 + // 58: 37f80140 tbnz w0, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 2a0003f7 mov w23, w0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: d10022b5 sub x21, x21, #0x8 + // 7c: 36ffff17 tbz w23, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 80: a8c17bfd ldp x29, x30, [sp], #0x10 + // 84: 14000000 b 0x84 <_JIT_ENTRY+0x84> + // 0000000000000084: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0xe8, 0x03, 0x28, 0x2a, + 0xe1, 0x03, 0x13, 0xaa, 0x08, 0x71, 0x1d, 0x53, + 0x08, 0xb1, 0x6d, 0xb2, 0xa0, 0x6a, 0x68, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0x40, 0x01, 0xf8, 0x37, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x22, 0x00, 0xd1, 0x17, 0xff, 0xff, 0x36, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PySet_Update+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PySet_Update); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x84, state->instruction_starts[instruction->error_target]); +} + +void +emit__START_EXECUTOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _START_EXECUTOR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9002295 str x21, [x20, #0x40] + // 4: f9408ac0 ldr x0, [x22, #0x110] + // 8: b40000e0 cbz x0, 0x24 <_JIT_ENTRY+0x24> + // c: f9008adf str xzr, [x22, #0x110] + // 10: b9400008 ldr w8, [x0] + // 14: 37f80088 tbnz w8, #0x1f, 0x24 <_JIT_ENTRY+0x24> + // 18: 71000508 subs w8, w8, #0x1 + // 1c: b9000008 str w8, [x0] + // 20: 54000080 b.eq 0x30 <_JIT_ENTRY+0x30> + // 24: f9402295 ldr x21, [x20, #0x40] + // 28: f900229f str xzr, [x20, #0x40] + // 2c: 14000000 b 0x2c <_JIT_ENTRY+0x2c> + // 000000000000002c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 38: 910003fd mov x29, sp + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 40: d63f0100 blr x8 + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: f9402295 ldr x21, [x20, #0x40] + // 4c: f900229f str xzr, [x20, #0x40] + // 50: 14000000 b 0x50 <_JIT_ENTRY+0x50> + // 0000000000000050: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[80] = { + 0x95, 0x22, 0x00, 0xf9, 0xc0, 0x8a, 0x40, 0xf9, + 0xe0, 0x00, 0x00, 0xb4, 0xdf, 0x8a, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x2c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data); +} + +void +emit__STORE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 910003fd mov x29, sp + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 18: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 1c: 8b292d08 add x8, x8, w9, uxth #3 + // 20: f9400d01 ldr x1, [x8, #0x18] + // 24: f9002295 str x21, [x20, #0x40] + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE PyObject_SetAttr + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC PyObject_SetAttr + // 30: aa1303e0 mov x0, x19 + // 34: aa1703e2 mov x2, x23 + // 38: d63f0100 blr x8 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: 2a0003f8 mov w24, w0 + // 48: b94002e8 ldr w8, [x23] + // 4c: 37f80108 tbnz w8, #0x1f, 0x6c <_JIT_ENTRY+0x6c> + // 50: 71000508 subs w8, w8, #0x1 + // 54: b90002e8 str w8, [x23] + // 58: 540000a1 b.ne 0x6c <_JIT_ENTRY+0x6c> + // 5c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000005c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 60: aa1703e0 mov x0, x23 + // 64: f9400108 ldr x8, [x8] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 68: d63f0100 blr x8 + // 6c: b9400268 ldr w8, [x19] + // 70: 37f80088 tbnz w8, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 74: 71000508 subs w8, w8, #0x1 + // 78: b9000268 str w8, [x19] + // 7c: 540000a0 b.eq 0x90 <_JIT_ENTRY+0x90> + // 80: d10042b5 sub x21, x21, #0x10 + // 84: 34000138 cbz w24, 0xa8 <_JIT_ENTRY+0xa8> + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: 14000000 b 0x8c <_JIT_ENTRY+0x8c> + // 000000000000008c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 90: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000090: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 94: aa1303e0 mov x0, x19 + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 9c: d63f0100 blr x8 + // a0: d10042b5 sub x21, x21, #0x10 + // a4: 35ffff38 cbnz w24, 0x88 <_JIT_ENTRY+0x88> + // a8: a8c17bfd ldp x29, x30, [sp], #0x10 + // ac: 14000000 b 0xac <_JIT_ENTRY+0xac> + // 00000000000000ac: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[176] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb7, 0x4e, 0x7f, 0xa9, 0x08, 0x2d, 0x29, 0x8b, + 0x01, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe2, 0x03, 0x17, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf8, 0x03, 0x00, 0x2a, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x42, 0x00, 0xd1, 0x38, 0x01, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x42, 0x00, 0xd1, 0x38, 0xff, 0xff, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &PyObject_SetAttr+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetAttr); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_33rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x5c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x8c, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x90, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x98, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xac, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_INSTANCE_VALUE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9ff02a9 ldp x9, x0, [x21, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // c: 8b282008 add x8, x0, w8, uxth + // 10: f9400113 ldr x19, [x8] + // 14: f9000109 str x9, [x8] + // 18: b50001b3 cbnz x19, 0x4c <_JIT_ENTRY+0x4c> + // 1c: f9400409 ldr x9, [x0, #0x8] + // 20: f9401129 ldr x9, [x9, #0x20] + // 24: 8b090009 add x9, x0, x9 + // 28: 3940012a ldrb w10, [x9] + // 2c: 9100212b add x11, x9, #0x8 + // 30: 3940052c ldrb w12, [x9, #0x1] + // 34: 4b0b0108 sub w8, w8, w11 + // 38: 8b0a0d6a add x10, x11, x10, lsl #3 + // 3c: 53037d08 lsr w8, w8, #3 + // 40: 1100058b add w11, w12, #0x1 + // 44: 3900052b strb w11, [x9, #0x1] + // 48: 382c6948 strb w8, [x10, x12] + // 4c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 50: f9002295 str x21, [x20, #0x40] + // 54: 910003fd mov x29, sp + // 58: b9400008 ldr w8, [x0] + // 5c: 37f800e8 tbnz w8, #0x1f, 0x78 <_JIT_ENTRY+0x78> + // 60: 71000508 subs w8, w8, #0x1 + // 64: b9000008 str w8, [x0] + // 68: 54000081 b.ne 0x78 <_JIT_ENTRY+0x78> + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: b40000d3 cbz x19, 0x90 <_JIT_ENTRY+0x90> + // 7c: b9400268 ldr w8, [x19] + // 80: 37f80088 tbnz w8, #0x1f, 0x90 <_JIT_ENTRY+0x90> + // 84: 71000508 subs w8, w8, #0x1 + // 88: b9000268 str w8, [x19] + // 8c: 540000a0 b.eq 0xa0 <_JIT_ENTRY+0xa0> + // 90: f9402295 ldr x21, [x20, #0x40] + // 94: f900229f str xzr, [x20, #0x40] + // 98: a8c17bfd ldp x29, x30, [sp], #0x10 + // 9c: 14000000 b 0x9c <_JIT_ENTRY+0x9c> + // 000000000000009c: R_AARCH64_JUMP26 _JIT_CONTINUE + // a0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a4: aa1303e0 mov x0, x19 + // a8: f9400108 ldr x8, [x8] + // 00000000000000a8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // ac: d63f0100 blr x8 + // b0: f9402295 ldr x21, [x20, #0x40] + // b4: f900229f str xzr, [x20, #0x40] + // b8: a8c17bfd ldp x29, x30, [sp], #0x10 + // bc: 14000000 b 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000bc: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[192] = { + 0xa9, 0x02, 0xff, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x08, 0x20, 0x28, 0x8b, + 0x13, 0x01, 0x40, 0xf9, 0x09, 0x01, 0x00, 0xf9, + 0xb3, 0x01, 0x00, 0xb5, 0x09, 0x04, 0x40, 0xf9, + 0x29, 0x11, 0x40, 0xf9, 0x09, 0x00, 0x09, 0x8b, + 0x2a, 0x01, 0x40, 0x39, 0x2b, 0x21, 0x00, 0x91, + 0x2c, 0x05, 0x40, 0x39, 0x08, 0x01, 0x0b, 0x4b, + 0x6a, 0x0d, 0x0a, 0x8b, 0x08, 0x7d, 0x03, 0x53, + 0x8b, 0x05, 0x00, 0x11, 0x2b, 0x05, 0x00, 0x39, + 0x48, 0x69, 0x2c, 0x38, 0xfd, 0x7b, 0xbf, 0xa9, + 0x95, 0x22, 0x00, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x00, 0x40, 0xb9, 0xe8, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x81, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xd3, 0x00, 0x00, 0xb4, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x4, (uintptr_t)data); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x9c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xa0, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xa8, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xbc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_SLOT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 8: 910003fd mov x29, sp + // c: f9400108 ldr x8, [x8] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 10: a9ff02a9 ldp x9, x0, [x21, #-0x10]! + // 14: 92403d08 and x8, x8, #0xffff + // 18: f8686813 ldr x19, [x0, x8] + // 1c: f8286809 str x9, [x0, x8] + // 20: f9002295 str x21, [x20, #0x40] + // 24: b9400008 ldr w8, [x0] + // 28: 37f800e8 tbnz w8, #0x1f, 0x44 <_JIT_ENTRY+0x44> + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000008 str w8, [x0] + // 34: 54000081 b.ne 0x44 <_JIT_ENTRY+0x44> + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: f9400108 ldr x8, [x8] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 40: d63f0100 blr x8 + // 44: b40000d3 cbz x19, 0x5c <_JIT_ENTRY+0x5c> + // 48: b9400268 ldr w8, [x19] + // 4c: 37f80088 tbnz w8, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 50: 71000508 subs w8, w8, #0x1 + // 54: b9000268 str w8, [x19] + // 58: 540000a0 b.eq 0x6c <_JIT_ENTRY+0x6c> + // 5c: f9402295 ldr x21, [x20, #0x40] + // 60: f900229f str xzr, [x20, #0x40] + // 64: a8c17bfd ldp x29, x30, [sp], #0x10 + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_CONTINUE + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 70: aa1303e0 mov x0, x19 + // 74: f9400108 ldr x8, [x8] + // 0000000000000074: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 78: d63f0100 blr x8 + // 7c: f9402295 ldr x21, [x20, #0x40] + // 80: f900229f str xzr, [x20, #0x40] + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0xa9, 0x02, 0xff, 0xa9, 0x08, 0x3d, 0x40, 0x92, + 0x13, 0x68, 0x68, 0xf8, 0x09, 0x68, 0x28, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x40, 0xb9, + 0xe8, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x81, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xd3, 0x00, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_33rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x68, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x6c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x74, (uintptr_t)data + 0x8); +} + +void +emit__STORE_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_WITH_HINT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82b3 ldur x19, [x21, #-0x8] + // 4: f85e8262 ldur x2, [x19, #-0x18] + // 8: b4000302 cbz x2, 0x68 <_JIT_ENTRY+0x68> + // c: f9401048 ldr x8, [x2, #0x20] + // 10: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000010: R_AARCH64_ADR_GOT_PAGE _JIT_OPERAND0 + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPERAND0 + // 18: f9400d0a ldr x10, [x8, #0x18] + // 1c: 92403d29 and x9, x9, #0xffff + // 20: eb09015f cmp x10, x9 + // 24: 54000229 b.ls 0x68 <_JIT_ENTRY+0x68> + // 28: 3940290a ldrb w10, [x8, #0xa] + // 2c: 340001ea cbz w10, 0x68 <_JIT_ENTRY+0x68> + // 30: 3940250a ldrb w10, [x8, #0x9] + // 34: f940028b ldr x11, [x20] + // 38: 5280002c mov w12, #0x1 // =1 + // 3c: 9aca218a lsl x10, x12, x10 + // 40: 9000000c adrp x12, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 44: f940116b ldr x11, [x11, #0x20] + // 48: f940018c ldr x12, [x12] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 4c: 8b0a0108 add x8, x8, x10 + // 50: 8b2c2d6a add x10, x11, w12, uxth #3 + // 54: 8b091119 add x25, x8, x9, lsl #4 + // 58: f9400d43 ldr x3, [x10, #0x18] + // 5c: f8420f28 ldr x8, [x25, #0x20]! + // 60: eb03011f cmp x8, x3 + // 64: 54000040 b.eq 0x6c <_JIT_ENTRY+0x6c> + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 6c: f9400737 ldr x23, [x25, #0x8] + // 70: b4ffffd7 cbz x23, 0x68 <_JIT_ENTRY+0x68> + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 39406040 ldrb w0, [x2, #0x18] + // 7c: f85f02b8 ldur x24, [x21, #-0x10] + // 80: 910003fd mov x29, sp + // 84: f9002295 str x21, [x20, #0x40] + // 88: 340000e0 cbz w0, 0xa4 <_JIT_ENTRY+0xa4> + // 8c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000008c: R_AARCH64_ADR_GOT_PAGE _PyDict_SendEvent + // 90: 52800021 mov w1, #0x1 // =1 + // 94: aa1803e4 mov x4, x24 + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC _PyDict_SendEvent + // 9c: d63f0100 blr x8 + // a0: f9402295 ldr x21, [x20, #0x40] + // a4: d10042a8 sub x8, x21, #0x10 + // a8: f9000738 str x24, [x25, #0x8] + // ac: f9002288 str x8, [x20, #0x40] + // b0: b9400268 ldr w8, [x19] + // b4: 37f80108 tbnz w8, #0x1f, 0xd4 <_JIT_ENTRY+0xd4> + // b8: 71000508 subs w8, w8, #0x1 + // bc: b9000268 str w8, [x19] + // c0: 540000a1 b.ne 0xd4 <_JIT_ENTRY+0xd4> + // c4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // c8: aa1303e0 mov x0, x19 + // cc: f9400108 ldr x8, [x8] + // 00000000000000cc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d0: d63f0100 blr x8 + // d4: b94002e8 ldr w8, [x23] + // d8: 37f80108 tbnz w8, #0x1f, 0xf8 <_JIT_ENTRY+0xf8> + // dc: 71000508 subs w8, w8, #0x1 + // e0: b90002e8 str w8, [x23] + // e4: 540000a1 b.ne 0xf8 <_JIT_ENTRY+0xf8> + // e8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // ec: aa1703e0 mov x0, x23 + // f0: f9400108 ldr x8, [x8] + // 00000000000000f0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f4: d63f0100 blr x8 + // f8: f9402295 ldr x21, [x20, #0x40] + // fc: f900229f str xzr, [x20, #0x40] + // 100: a8c17bfd ldp x29, x30, [sp], #0x10 + // 104: 14000000 b 0x104 <_JIT_ENTRY+0x104> + // 0000000000000104: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[264] = { + 0xb3, 0x82, 0x5f, 0xf8, 0x62, 0x82, 0x5e, 0xf8, + 0x02, 0x03, 0x00, 0xb4, 0x48, 0x10, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x0a, 0x0d, 0x40, 0xf9, 0x29, 0x3d, 0x40, 0x92, + 0x5f, 0x01, 0x09, 0xeb, 0x29, 0x02, 0x00, 0x54, + 0x0a, 0x29, 0x40, 0x39, 0xea, 0x01, 0x00, 0x34, + 0x0a, 0x25, 0x40, 0x39, 0x8b, 0x02, 0x40, 0xf9, + 0x2c, 0x00, 0x80, 0x52, 0x8a, 0x21, 0xca, 0x9a, + 0x0c, 0x00, 0x00, 0x90, 0x6b, 0x11, 0x40, 0xf9, + 0x8c, 0x01, 0x40, 0xf9, 0x08, 0x01, 0x0a, 0x8b, + 0x6a, 0x2d, 0x2c, 0x8b, 0x19, 0x11, 0x09, 0x8b, + 0x43, 0x0d, 0x40, 0xf9, 0x28, 0x0f, 0x42, 0xf8, + 0x1f, 0x01, 0x03, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x37, 0x07, 0x40, 0xf9, + 0xd7, 0xff, 0xff, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0x40, 0x60, 0x40, 0x39, 0xb8, 0x02, 0x5f, 0xf8, + 0xfd, 0x03, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x90, + 0x21, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0xa8, 0x42, 0x00, 0xd1, + 0x38, 0x07, 0x00, 0xf9, 0x88, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPERAND0 + // 8: OPARG + // 10: &_PyDict_SendEvent+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_PyDict_SendEvent); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x68, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x8c, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x98, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xc4, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xcc, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xe8, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xf0, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x104, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_DEREF.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: f85f82a9 ldur x9, [x21, #-0x8] + // c: f9002295 str x21, [x20, #0x40] + // 10: 8b282e88 add x8, x20, w8, uxth #3 + // 14: f9402908 ldr x8, [x8, #0x50] + // 18: f9400900 ldr x0, [x8, #0x10] + // 1c: f9000909 str x9, [x8, #0x10] + // 20: b40000c0 cbz x0, 0x38 <_JIT_ENTRY+0x38> + // 24: b9400008 ldr w8, [x0] + // 28: 37f80088 tbnz w8, #0x1f, 0x38 <_JIT_ENTRY+0x38> + // 2c: 71000508 subs w8, w8, #0x1 + // 30: b9000008 str w8, [x0] + // 34: 540000a0 b.eq 0x48 <_JIT_ENTRY+0x48> + // 38: f9402288 ldr x8, [x20, #0x40] + // 3c: f900229f str xzr, [x20, #0x40] + // 40: d1002115 sub x21, x8, #0x8 + // 44: 14000000 b 0x44 <_JIT_ENTRY+0x44> + // 0000000000000044: R_AARCH64_JUMP26 _JIT_CONTINUE + // 48: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: 910003fd mov x29, sp + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: d63f0100 blr x8 + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: f9402288 ldr x8, [x20, #0x40] + // 64: f900229f str xzr, [x20, #0x40] + // 68: d1002115 sub x21, x8, #0x8 + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[112] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa9, 0x82, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x08, 0x29, 0x40, 0xf9, + 0x00, 0x09, 0x40, 0xf9, 0x09, 0x09, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x21, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x88, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x15, 0x21, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x44, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: f85f8ea9 ldr x9, [x21, #-0x8]! + // c: f9002295 str x21, [x20, #0x40] + // 10: 8b282e88 add x8, x20, w8, uxth #3 + // 14: f9402900 ldr x0, [x8, #0x50] + // 18: f9002909 str x9, [x8, #0x50] + // 1c: b40000c0 cbz x0, 0x34 <_JIT_ENTRY+0x34> + // 20: b9400008 ldr w8, [x0] + // 24: 37f80088 tbnz w8, #0x1f, 0x34 <_JIT_ENTRY+0x34> + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000008 str w8, [x0] + // 30: 54000080 b.eq 0x40 <_JIT_ENTRY+0x40> + // 34: f9402295 ldr x21, [x20, #0x40] + // 38: f900229f str xzr, [x20, #0x40] + // 3c: 14000000 b 0x3c <_JIT_ENTRY+0x3c> + // 000000000000003c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 40: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 48: 910003fd mov x29, sp + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 50: d63f0100 blr x8 + // 54: a8c17bfd ldp x29, x30, [sp], #0x10 + // 58: f9402295 ldr x21, [x20, #0x40] + // 5c: f900229f str xzr, [x20, #0x40] + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[96] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa9, 0x8e, 0x5f, 0xf8, 0x95, 0x22, 0x00, 0xf9, + 0x88, 0x2e, 0x28, 0x8b, 0x00, 0x29, 0x40, 0xf9, + 0x09, 0x29, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x54, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x3c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); +} + +void +emit__STORE_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_0.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9402a80 ldr x0, [x20, #0x50] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9002a88 str x8, [x20, #0x50] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x2a, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x2a, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_1.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9402e80 ldr x0, [x20, #0x58] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9002e88 str x8, [x20, #0x58] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x2e, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x2e, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_2.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403280 ldr x0, [x20, #0x60] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9003288 str x8, [x20, #0x60] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x32, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x32, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_3.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403680 ldr x0, [x20, #0x68] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9003688 str x8, [x20, #0x68] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x36, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x36, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_4.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403a80 ldr x0, [x20, #0x70] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9003a88 str x8, [x20, #0x70] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x3a, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x3a, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_5.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9403e80 ldr x0, [x20, #0x78] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9003e88 str x8, [x20, #0x78] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x3e, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x3e, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_6.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9404280 ldr x0, [x20, #0x80] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9004288 str x8, [x20, #0x80] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x42, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x42, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_7.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f8ea8 ldr x8, [x21, #-0x8]! + // 4: f9404680 ldr x0, [x20, #0x88] + // 8: f9002295 str x21, [x20, #0x40] + // c: f9004688 str x8, [x20, #0x88] + // 10: b40000c0 cbz x0, 0x28 <_JIT_ENTRY+0x28> + // 14: b9400008 ldr w8, [x0] + // 18: 37f80088 tbnz w8, #0x1f, 0x28 <_JIT_ENTRY+0x28> + // 1c: 71000508 subs w8, w8, #0x1 + // 20: b9000008 str w8, [x0] + // 24: 54000080 b.eq 0x34 <_JIT_ENTRY+0x34> + // 28: f9402295 ldr x21, [x20, #0x40] + // 2c: f900229f str xzr, [x20, #0x40] + // 30: 14000000 b 0x30 <_JIT_ENTRY+0x30> + // 0000000000000030: R_AARCH64_JUMP26 _JIT_CONTINUE + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: f9402295 ldr x21, [x20, #0x40] + // 50: f900229f str xzr, [x20, #0x40] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0xa8, 0x8e, 0x5f, 0xf8, 0x80, 0x46, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x88, 0x46, 0x00, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data); + patch_aarch64_12x(code + 0x40, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_GLOBAL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 910003fd mov x29, sp + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 18: f85f82b3 ldur x19, [x21, #-0x8] + // 1c: f9400e80 ldr x0, [x20, #0x18] + // 20: 8b292d08 add x8, x8, w9, uxth #3 + // 24: aa1303e2 mov x2, x19 + // 28: f9400d01 ldr x1, [x8, #0x18] + // 2c: f9002295 str x21, [x20, #0x40] + // 30: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000030: R_AARCH64_ADR_GOT_PAGE PyDict_SetItem + // 34: f9400108 ldr x8, [x8] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PyDict_SetItem + // 38: d63f0100 blr x8 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540000a0 b.eq 0x68 <_JIT_ENTRY+0x68> + // 58: d10022b5 sub x21, x21, #0x8 + // 5c: 34000140 cbz w0, 0x84 <_JIT_ENTRY+0x84> + // 60: a8c17bfd ldp x29, x30, [sp], #0x10 + // 64: 14000000 b 0x64 <_JIT_ENTRY+0x64> + // 0000000000000064: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 68: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000068: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 6c: 2a0003f7 mov w23, w0 + // 70: aa1303e0 mov x0, x19 + // 74: f9400108 ldr x8, [x8] + // 0000000000000074: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 78: d63f0100 blr x8 + // 7c: d10022b5 sub x21, x21, #0x8 + // 80: 35ffff17 cbnz w23, 0x60 <_JIT_ENTRY+0x60> + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0xb3, 0x82, 0x5f, 0xf8, 0x80, 0x0e, 0x40, 0xf9, + 0x08, 0x2d, 0x29, 0x8b, 0xe2, 0x03, 0x13, 0xaa, + 0x01, 0x0d, 0x40, 0xf9, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0x40, 0x01, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf7, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x22, 0x00, 0xd1, + 0x17, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: OPARG + // 8: &PyDict_SetItem+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_33rx(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x64, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x68, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x74, (uintptr_t)data + 0x10); +} + +void +emit__STORE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_NAME.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f9400288 ldr x8, [x20] + // 8: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // c: 910003fd mov x29, sp + // 10: f9401108 ldr x8, [x8, #0x20] + // 14: f9400129 ldr x9, [x9] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 18: f9401680 ldr x0, [x20, #0x28] + // 1c: f85f82b3 ldur x19, [x21, #-0x8] + // 20: 8b292d08 add x8, x8, w9, uxth #3 + // 24: f9400d03 ldr x3, [x8, #0x18] + // 28: b4000140 cbz x0, 0x50 <_JIT_ENTRY+0x50> + // 2c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // 30: f9400408 ldr x8, [x0, #0x8] + // 34: f9400129 ldr x9, [x9] + // 0000000000000034: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 38: f9002295 str x21, [x20, #0x40] + // 3c: eb09011f cmp x8, x9 + // 40: 54000300 b.eq 0xa0 <_JIT_ENTRY+0xa0> + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE PyObject_SetItem + // 48: f9400108 ldr x8, [x8] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC PyObject_SetItem + // 4c: 14000017 b 0xa8 <_JIT_ENTRY+0xa8> + // 50: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE PyExc_SystemError + // 54: 90000002 adrp x2, 0x0 <_JIT_ENTRY> + // 0000000000000054: R_AARCH64_ADR_PREL_PG_HI21 .rodata.str1.1 + // 58: 91000042 add x2, x2, #0x0 + // 0000000000000058: R_AARCH64_ADD_ABS_LO12_NC .rodata.str1.1 + // 5c: f9400108 ldr x8, [x8] + // 000000000000005c: R_AARCH64_LD64_GOT_LO12_NC PyExc_SystemError + // 60: f9002295 str x21, [x20, #0x40] + // 64: aa1603e0 mov x0, x22 + // 68: f9400101 ldr x1, [x8] + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _PyErr_Format + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _PyErr_Format + // 74: d63f0100 blr x8 + // 78: f9402295 ldr x21, [x20, #0x40] + // 7c: f900229f str xzr, [x20, #0x40] + // 80: b9400268 ldr w8, [x19] + // 84: 37f80088 tbnz w8, #0x1f, 0x94 <_JIT_ENTRY+0x94> + // 88: 71000508 subs w8, w8, #0x1 + // 8c: b9000268 str w8, [x19] + // 90: 540003a0 b.eq 0x104 <_JIT_ENTRY+0x104> + // 94: d10022b5 sub x21, x21, #0x8 + // 98: a8c17bfd ldp x29, x30, [sp], #0x10 + // 9c: 14000000 b 0x9c <_JIT_ENTRY+0x9c> + // 000000000000009c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // a0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a0: R_AARCH64_ADR_GOT_PAGE PyDict_SetItem + // a4: f9400108 ldr x8, [x8] + // 00000000000000a4: R_AARCH64_LD64_GOT_LO12_NC PyDict_SetItem + // a8: aa0303e1 mov x1, x3 + // ac: aa1303e2 mov x2, x19 + // b0: d63f0100 blr x8 + // b4: f9402295 ldr x21, [x20, #0x40] + // b8: f900229f str xzr, [x20, #0x40] + // bc: b9400268 ldr w8, [x19] + // c0: 37f80088 tbnz w8, #0x1f, 0xd0 <_JIT_ENTRY+0xd0> + // c4: 71000508 subs w8, w8, #0x1 + // c8: b9000268 str w8, [x19] + // cc: 540000a0 b.eq 0xe0 <_JIT_ENTRY+0xe0> + // d0: d10022b5 sub x21, x21, #0x8 + // d4: 34000140 cbz w0, 0xfc <_JIT_ENTRY+0xfc> + // d8: a8c17bfd ldp x29, x30, [sp], #0x10 + // dc: 14000000 b 0xdc <_JIT_ENTRY+0xdc> + // 00000000000000dc: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // e0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000e0: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // e4: 2a0003f7 mov w23, w0 + // e8: aa1303e0 mov x0, x19 + // ec: f9400108 ldr x8, [x8] + // 00000000000000ec: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f0: d63f0100 blr x8 + // f4: d10022b5 sub x21, x21, #0x8 + // f8: 35ffff17 cbnz w23, 0xd8 <_JIT_ENTRY+0xd8> + // fc: a8c17bfd ldp x29, x30, [sp], #0x10 + // 100: 14000000 b 0x100 <_JIT_ENTRY+0x100> + // 0000000000000100: R_AARCH64_JUMP26 _JIT_CONTINUE + // 104: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000104: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 108: aa1303e0 mov x0, x19 + // 10c: f9400108 ldr x8, [x8] + // 000000000000010c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 110: d63f0100 blr x8 + // 114: d10022b5 sub x21, x21, #0x8 + // 118: a8c17bfd ldp x29, x30, [sp], #0x10 + // 11c: 14000000 b 0x11c <_JIT_ENTRY+0x11c> + // 000000000000011c: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[288] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x88, 0x02, 0x40, 0xf9, + 0x09, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x11, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x80, 0x16, 0x40, 0xf9, 0xb3, 0x82, 0x5f, 0xf8, + 0x08, 0x2d, 0x29, 0x8b, 0x03, 0x0d, 0x40, 0xf9, + 0x40, 0x01, 0x00, 0xb4, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x04, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x00, 0x03, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x17, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x95, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x01, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x03, 0x00, 0x54, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x03, 0xaa, 0xe2, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x22, 0x00, 0xd1, 0x40, 0x01, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf7, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x22, 0x00, 0xd1, + 0x17, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: 'no locals found when storing %R\x00' + // 20: OPARG + // 28: &PyDict_Type+0x0 + // 30: &PyObject_SetItem+0x0 + // 38: &PyExc_SystemError+0x0 + // 40: &_PyErr_Format+0x0 + // 48: &PyDict_SetItem+0x0 + // 50: &_Py_Dealloc+0x0 + const unsigned char data_body[88] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&PyDict_Type); + patch_64(data + 0x30, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x38, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x40, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x48, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x50, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x14, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0x2c, (uintptr_t)data + 0x28); + patch_aarch64_12x(code + 0x34, (uintptr_t)data + 0x28); + patch_aarch64_33rx(code + 0x44, (uintptr_t)data + 0x30); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x38); + patch_aarch64_21r(code + 0x54, (uintptr_t)data); + patch_aarch64_12(code + 0x58, (uintptr_t)data); + patch_aarch64_12x(code + 0x5c, (uintptr_t)data + 0x38); + patch_aarch64_33rx(code + 0x6c, (uintptr_t)data + 0x40); + patch_aarch64_26r(code + 0x9c, state->instruction_starts[instruction->error_target]); + patch_aarch64_33rx(code + 0xa0, (uintptr_t)data + 0x48); + patch_aarch64_26r(code + 0xdc, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0xe0, (uintptr_t)data + 0x50); + patch_aarch64_12x(code + 0xec, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0x100, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x104, (uintptr_t)data + 0x50); + patch_aarch64_12x(code + 0x10c, (uintptr_t)data + 0x50); + patch_aarch64_26r(code + 0x11c, state->instruction_starts[instruction->error_target]); +} + +void +emit__STORE_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SLICE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f06a0 ldp x0, x1, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE _PyBuildSlice_ConsumeRefs + // c: a97e4eb8 ldp x24, x19, [x21, #-0x20] + // 10: 910003fd mov x29, sp + // 14: f9002295 str x21, [x20, #0x40] + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC _PyBuildSlice_ConsumeRefs + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: aa0003f7 mov x23, x0 + // 28: f900229f str xzr, [x20, #0x40] + // 2c: b4000320 cbz x0, 0x90 <_JIT_ENTRY+0x90> + // 30: d10042a8 sub x8, x21, #0x10 + // 34: aa1303e0 mov x0, x19 + // 38: aa1703e1 mov x1, x23 + // 3c: f9002288 str x8, [x20, #0x40] + // 40: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE PyObject_SetItem + // 44: aa1803e2 mov x2, x24 + // 48: f9400108 ldr x8, [x8] + // 0000000000000048: R_AARCH64_LD64_GOT_LO12_NC PyObject_SetItem + // 4c: d63f0100 blr x8 + // 50: b94002e8 ldr w8, [x23] + // 54: 37f80148 tbnz w8, #0x1f, 0x7c <_JIT_ENTRY+0x7c> + // 58: 71000508 subs w8, w8, #0x1 + // 5c: b90002e8 str w8, [x23] + // 60: 540000e1 b.ne 0x7c <_JIT_ENTRY+0x7c> + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 2a0003f5 mov w21, w0 + // 6c: aa1703e0 mov x0, x23 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: 2a1503e0 mov w0, w21 + // 7c: f9402288 ldr x8, [x20, #0x40] + // 80: 7100001f cmp w0, #0x0 + // 84: f900229f str xzr, [x20, #0x40] + // 88: 1a9f17f7 cset w23, eq + // 8c: 91004115 add x21, x8, #0x10 + // 90: b9400308 ldr w8, [x24] + // 94: 37f80108 tbnz w8, #0x1f, 0xb4 <_JIT_ENTRY+0xb4> + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b9000308 str w8, [x24] + // a0: 540000a1 b.ne 0xb4 <_JIT_ENTRY+0xb4> + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a8: aa1803e0 mov x0, x24 + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // b0: d63f0100 blr x8 + // b4: b9400268 ldr w8, [x19] + // b8: 37f80088 tbnz w8, #0x1f, 0xc8 <_JIT_ENTRY+0xc8> + // bc: 71000508 subs w8, w8, #0x1 + // c0: b9000268 str w8, [x19] + // c4: 540000a0 b.eq 0xd8 <_JIT_ENTRY+0xd8> + // c8: d10082b5 sub x21, x21, #0x20 + // cc: 36000137 tbz w23, #0x0, 0xf0 <_JIT_ENTRY+0xf0> + // d0: a8c17bfd ldp x29, x30, [sp], #0x10 + // d4: 14000000 b 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d4: R_AARCH64_JUMP26 _JIT_CONTINUE + // d8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000d8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // dc: aa1303e0 mov x0, x19 + // e0: f9400108 ldr x8, [x8] + // 00000000000000e0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // e4: d63f0100 blr x8 + // e8: d10082b5 sub x21, x21, #0x20 + // ec: 3707ff37 tbnz w23, #0x0, 0xd0 <_JIT_ENTRY+0xd0> + // f0: a8c17bfd ldp x29, x30, [sp], #0x10 + // f4: 14000000 b 0xf4 <_JIT_ENTRY+0xf4> + // 00000000000000f4: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[248] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xa0, 0x06, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xb8, 0x4e, 0x7e, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0xf7, 0x03, 0x00, 0xaa, + 0x9f, 0x22, 0x00, 0xf9, 0x20, 0x03, 0x00, 0xb4, + 0xa8, 0x42, 0x00, 0xd1, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0x88, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x00, 0x90, 0xe2, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x02, 0x40, 0xb9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0x2a, 0x88, 0x22, 0x40, 0xf9, + 0x1f, 0x00, 0x00, 0x71, 0x9f, 0x22, 0x00, 0xf9, + 0xf7, 0x17, 0x9f, 0x1a, 0x15, 0x41, 0x00, 0x91, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xb5, 0x82, 0x00, 0xd1, 0x37, 0x01, 0x00, 0x36, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xb5, 0x82, 0x00, 0xd1, 0x37, 0xff, 0x07, 0x37, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_PyBuildSlice_ConsumeRefs+0x0 + // 8: &PyObject_SetItem+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_21rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x48, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xd4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0xd8, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0xe0, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xf4, state->instruction_starts[instruction->error_target]); +} + +void +emit__STORE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: a97f4eb7 ldp x23, x19, [x21, #-0x10] + // 8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000008: R_AARCH64_ADR_GOT_PAGE PyObject_SetItem + // c: f85e82b8 ldur x24, [x21, #-0x18] + // 10: f9002295 str x21, [x20, #0x40] + // 14: 910003fd mov x29, sp + // 18: f9400108 ldr x8, [x8] + // 0000000000000018: R_AARCH64_LD64_GOT_LO12_NC PyObject_SetItem + // 1c: aa1703e0 mov x0, x23 + // 20: aa1303e1 mov x1, x19 + // 24: aa1803e2 mov x2, x24 + // 28: d63f0100 blr x8 + // 2c: f9402295 ldr x21, [x20, #0x40] + // 30: f900229f str xzr, [x20, #0x40] + // 34: 2a0003f9 mov w25, w0 + // 38: b9400308 ldr w8, [x24] + // 3c: 37f80108 tbnz w8, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 40: 71000508 subs w8, w8, #0x1 + // 44: b9000308 str w8, [x24] + // 48: 540000a1 b.ne 0x5c <_JIT_ENTRY+0x5c> + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: aa1803e0 mov x0, x24 + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 58: d63f0100 blr x8 + // 5c: b94002e8 ldr w8, [x23] + // 60: 37f80108 tbnz w8, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 64: 71000508 subs w8, w8, #0x1 + // 68: b90002e8 str w8, [x23] + // 6c: 540000a1 b.ne 0x80 <_JIT_ENTRY+0x80> + // 70: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 74: aa1703e0 mov x0, x23 + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 7c: d63f0100 blr x8 + // 80: b9400268 ldr w8, [x19] + // 84: 37f80088 tbnz w8, #0x1f, 0x94 <_JIT_ENTRY+0x94> + // 88: 71000508 subs w8, w8, #0x1 + // 8c: b9000268 str w8, [x19] + // 90: 540000a0 b.eq 0xa4 <_JIT_ENTRY+0xa4> + // 94: d10062b5 sub x21, x21, #0x18 + // 98: 34000139 cbz w25, 0xbc <_JIT_ENTRY+0xbc> + // 9c: a8c17bfd ldp x29, x30, [sp], #0x10 + // a0: 14000000 b 0xa0 <_JIT_ENTRY+0xa0> + // 00000000000000a0: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // a4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // a8: aa1303e0 mov x0, x19 + // ac: f9400108 ldr x8, [x8] + // 00000000000000ac: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // b0: d63f0100 blr x8 + // b4: d10062b5 sub x21, x21, #0x18 + // b8: 35ffff39 cbnz w25, 0x9c <_JIT_ENTRY+0x9c> + // bc: a8c17bfd ldp x29, x30, [sp], #0x10 + // c0: 14000000 b 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000c0: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[192] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb7, 0x4e, 0x7f, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xb8, 0x82, 0x5e, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x13, 0xaa, 0xe2, 0x03, 0x18, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xf9, 0x03, 0x00, 0x2a, + 0x08, 0x03, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x03, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x18, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe8, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xb5, 0x62, 0x00, 0xd1, + 0x39, 0x01, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xb5, 0x62, 0x00, 0xd1, + 0x39, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: &PyObject_SetItem+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x18, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x54, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0xa0, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0xa4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0xac, (uintptr_t)data + 0x8); +} + +void +emit__STORE_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_DICT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f02b3 ldur x19, [x21, #-0x10] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyDict_Type + // 8: f9400668 ldr x8, [x19, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyDict_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 20: f85e82a2 ldur x2, [x21, #-0x18] + // 24: f85f82a1 ldur x1, [x21, #-0x8] + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _PyDict_SetItem_Take2 + // 2c: f9002295 str x21, [x20, #0x40] + // 30: aa1303e0 mov x0, x19 + // 34: 910003fd mov x29, sp + // 38: f9400108 ldr x8, [x8] + // 0000000000000038: R_AARCH64_LD64_GOT_LO12_NC _PyDict_SetItem_Take2 + // 3c: d63f0100 blr x8 + // 40: f9402288 ldr x8, [x20, #0x40] + // 44: d1006108 sub x8, x8, #0x18 + // 48: f9002288 str x8, [x20, #0x40] + // 4c: b9400268 ldr w8, [x19] + // 50: 37f80088 tbnz w8, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 54: 71000508 subs w8, w8, #0x1 + // 58: b9000268 str w8, [x19] + // 5c: 540000c0 b.eq 0x74 <_JIT_ENTRY+0x74> + // 60: f9402295 ldr x21, [x20, #0x40] + // 64: f900229f str xzr, [x20, #0x40] + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 34000180 cbz w0, 0x9c <_JIT_ENTRY+0x9c> + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 78: 2a0003f5 mov w21, w0 + // 7c: aa1303e0 mov x0, x19 + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: 2a1503e0 mov w0, w21 + // 8c: f9402295 ldr x21, [x20, #0x40] + // 90: f900229f str xzr, [x20, #0x40] + // 94: a8c17bfd ldp x29, x30, [sp], #0x10 + // 98: 35fffec0 cbnz w0, 0x70 <_JIT_ENTRY+0x70> + // 9c: 14000000 b 0x9c <_JIT_ENTRY+0x9c> + // 000000000000009c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[160] = { + 0xb3, 0x02, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x68, 0x06, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xa2, 0x82, 0x5e, 0xf8, 0xa1, 0x82, 0x5f, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x95, 0x22, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x88, 0x22, 0x40, 0xf9, 0x08, 0x61, 0x00, 0xd1, + 0x88, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xfd, 0x7b, 0xc1, 0xa8, 0x80, 0x01, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x15, 0x2a, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0xfe, 0xff, 0x35, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyDict_Type+0x0 + // 8: &_PyDict_SetItem_Take2+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x70, state->instruction_starts[instruction->error_target]); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x9c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__STORE_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_LIST_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503f9 mov x25, x21 + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: f85e8f28 ldr x8, [x25, #-0x18]! + // c: f9400b38 ldr x24, [x25, #0x10] + // 10: f9400709 ldr x9, [x24, #0x8] + // 14: f940014a ldr x10, [x10] + // 0000000000000014: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 18: eb0a013f cmp x9, x10 + // 1c: 54000781 b.ne 0x10c <_JIT_ENTRY+0x10c> + // 20: f9400733 ldr x19, [x25, #0x8] + // 24: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE PyList_Type + // 28: f9400669 ldr x9, [x19, #0x8] + // 2c: f940014a ldr x10, [x10] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC PyList_Type + // 30: eb0a013f cmp x9, x10 + // 34: 540006c1 b.ne 0x10c <_JIT_ENTRY+0x10c> + // 38: f9400b09 ldr x9, [x24, #0x10] + // 3c: 927df929 and x9, x9, #0xfffffffffffffffb + // 40: f100253f cmp x9, #0x9 + // 44: 54000642 b.hs 0x10c <_JIT_ENTRY+0x10c> + // 48: b9401b09 ldr w9, [x24, #0x18] + // 4c: f9400a6a ldr x10, [x19, #0x10] + // 50: eb09015f cmp x10, x9 + // 54: 540005cd b.le 0x10c <_JIT_ENTRY+0x10c> + // 58: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 5c: f9400e6a ldr x10, [x19, #0x18] + // 60: 910003fd mov x29, sp + // 64: f8697957 ldr x23, [x10, x9, lsl #3] + // 68: f8297948 str x8, [x10, x9, lsl #3] + // 6c: b9400308 ldr w8, [x24] + // 70: 37f80208 tbnz w8, #0x1f, 0xb0 <_JIT_ENTRY+0xb0> + // 74: 71000508 subs w8, w8, #0x1 + // 78: b9000308 str w8, [x24] + // 7c: 540001a1 b.ne 0xb0 <_JIT_ENTRY+0xb0> + // 80: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000080: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 84: f9400129 ldr x9, [x9] + // 0000000000000084: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 88: f9544928 ldr x8, [x9, #0x2890] + // 8c: b40000a8 cbz x8, 0xa0 <_JIT_ENTRY+0xa0> + // 90: f9544d22 ldr x2, [x9, #0x2898] + // 94: aa1803e0 mov x0, x24 + // 98: 52800021 mov w1, #0x1 // =1 + // 9c: d63f0100 blr x8 + // a0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000a0: R_AARCH64_ADR_GOT_PAGE _PyLong_ExactDealloc + // a4: aa1803e0 mov x0, x24 + // a8: f9400108 ldr x8, [x8] + // 00000000000000a8: R_AARCH64_LD64_GOT_LO12_NC _PyLong_ExactDealloc + // ac: d63f0100 blr x8 + // b0: f9002299 str x25, [x20, #0x40] + // b4: b9400268 ldr w8, [x19] + // b8: 37f80108 tbnz w8, #0x1f, 0xd8 <_JIT_ENTRY+0xd8> + // bc: 71000508 subs w8, w8, #0x1 + // c0: b9000268 str w8, [x19] + // c4: 540000a1 b.ne 0xd8 <_JIT_ENTRY+0xd8> + // c8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000c8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // cc: aa1303e0 mov x0, x19 + // d0: f9400108 ldr x8, [x8] + // 00000000000000d0: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // d4: d63f0100 blr x8 + // d8: b94002e8 ldr w8, [x23] + // dc: 37f80108 tbnz w8, #0x1f, 0xfc <_JIT_ENTRY+0xfc> + // e0: 71000508 subs w8, w8, #0x1 + // e4: b90002e8 str w8, [x23] + // e8: 540000a1 b.ne 0xfc <_JIT_ENTRY+0xfc> + // ec: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000ec: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // f0: aa1703e0 mov x0, x23 + // f4: f9400108 ldr x8, [x8] + // 00000000000000f4: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // f8: d63f0100 blr x8 + // fc: f9402295 ldr x21, [x20, #0x40] + // 100: f900229f str xzr, [x20, #0x40] + // 104: a8c17bfd ldp x29, x30, [sp], #0x10 + // 108: 14000000 b 0x108 <_JIT_ENTRY+0x108> + // 0000000000000108: R_AARCH64_JUMP26 _JIT_CONTINUE + // 10c: 14000000 b 0x10c <_JIT_ENTRY+0x10c> + // 000000000000010c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + const unsigned char code_body[272] = { + 0xf9, 0x03, 0x15, 0xaa, 0x0a, 0x00, 0x00, 0x90, + 0x28, 0x8f, 0x5e, 0xf8, 0x38, 0x0b, 0x40, 0xf9, + 0x09, 0x07, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0x81, 0x07, 0x00, 0x54, + 0x33, 0x07, 0x40, 0xf9, 0x0a, 0x00, 0x00, 0x90, + 0x69, 0x06, 0x40, 0xf9, 0x4a, 0x01, 0x40, 0xf9, + 0x3f, 0x01, 0x0a, 0xeb, 0xc1, 0x06, 0x00, 0x54, + 0x09, 0x0b, 0x40, 0xf9, 0x29, 0xf9, 0x7d, 0x92, + 0x3f, 0x25, 0x00, 0xf1, 0x42, 0x06, 0x00, 0x54, + 0x09, 0x1b, 0x40, 0xb9, 0x6a, 0x0a, 0x40, 0xf9, + 0x5f, 0x01, 0x09, 0xeb, 0xcd, 0x05, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x6a, 0x0e, 0x40, 0xf9, + 0xfd, 0x03, 0x00, 0x91, 0x57, 0x79, 0x69, 0xf8, + 0x48, 0x79, 0x29, 0xf8, 0x08, 0x03, 0x40, 0xb9, + 0x08, 0x02, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x03, 0x00, 0xb9, 0xa1, 0x01, 0x00, 0x54, + 0x09, 0x00, 0x00, 0x90, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x49, 0x54, 0xf9, 0xa8, 0x00, 0x00, 0xb4, + 0x22, 0x4d, 0x54, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x01, 0x3f, 0xd6, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x18, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0x99, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x08, 0x01, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe8, 0x02, 0x40, 0xb9, 0x08, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0xe8, 0x02, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x17, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyList_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x14, (uintptr_t)data); + patch_aarch64_21rx(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0xa0, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0xa8, (uintptr_t)data + 0x18); + patch_aarch64_21rx(code + 0xc8, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xd0, (uintptr_t)data + 0x20); + patch_aarch64_21rx(code + 0xec, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0xf4, (uintptr_t)data + 0x20); + patch_aarch64_26r(code + 0x108, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x10c, state->instruction_starts[instruction->jump_target]); +} + +void +emit__SWAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SWAP.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: f85f82a9 ldur x9, [x21, #-0x8] + // c: cb282ea8 sub x8, x21, w8, uxth #3 + // 10: f940010a ldr x10, [x8] + // 14: f9000109 str x9, [x8] + // 18: f81f82aa stur x10, [x21, #-0x8] + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa9, 0x82, 0x5f, 0xf8, 0xa8, 0x2e, 0x28, 0xcb, + 0x0a, 0x01, 0x40, 0xf9, 0x09, 0x01, 0x00, 0xf9, + 0xaa, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TIER2_RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TIER2_RESUME_CHECK.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f9400ec8 ldr x8, [x22, #0x18] + // 4: f2401d1f tst x8, #0xff + // 8: 54000040 b.eq 0x10 <_JIT_ENTRY+0x10> + // c: 14000000 b 0xc <_JIT_ENTRY+0xc> + // 000000000000000c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 10: 14000000 b 0x10 <_JIT_ENTRY+0x10> + // 0000000000000010: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[16] = { + 0xc8, 0x0e, 0x40, 0xf9, 0x1f, 0x1d, 0x40, 0xf2, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_26r(code + 0xc, state->instruction_starts[instruction->jump_target]); +} + +void +emit__TO_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyObject_IsTrue + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyObject_IsTrue + // 14: 910003fd mov x29, sp + // 18: aa1303e0 mov x0, x19 + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b9400268 ldr w8, [x19] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000268 str w8, [x19] + // 38: 54000160 b.eq 0x64 <_JIT_ENTRY+0x64> + // 3c: 37f80220 tbnz w0, #0x1f, 0x80 <_JIT_ENTRY+0x80> + // 40: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000040: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 44: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 48: 7100001f cmp w0, #0x0 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 50: f9400129 ldr x9, [x9] + // 0000000000000050: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 54: 9a880128 csel x8, x9, x8, eq + // 58: f81f82a8 stur x8, [x21, #-0x8] + // 5c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 60: 14000000 b 0x60 <_JIT_ENTRY+0x60> + // 0000000000000060: R_AARCH64_JUMP26 _JIT_CONTINUE + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 2a0003f7 mov w23, w0 + // 6c: aa1303e0 mov x0, x19 + // 70: f9400108 ldr x8, [x8] + // 0000000000000070: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 74: d63f0100 blr x8 + // 78: 2a1703e0 mov w0, w23 + // 7c: 36fffe37 tbz w23, #0x1f, 0x40 <_JIT_ENTRY+0x40> + // 80: d10022b5 sub x21, x21, #0x8 + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: 14000000 b 0x88 <_JIT_ENTRY+0x88> + // 0000000000000088: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 8c: 00 00 00 00 + const unsigned char code_body[144] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0x60, 0x01, 0x00, 0x54, 0x20, 0x02, 0xf8, 0x37, + 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, + 0x1f, 0x00, 0x00, 0x71, 0x08, 0x01, 0x40, 0xf9, + 0x29, 0x01, 0x40, 0xf9, 0x28, 0x01, 0x88, 0x9a, + 0xa8, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0x2a, 0x37, 0xfe, 0xff, 0x36, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_IsTrue+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_21rx(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x50, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x70, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x88, state->instruction_starts[instruction->error_target]); +} + +void +emit__TO_BOOL_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_BOOL.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a8 ldur x8, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyBool_Type + // 8: f9400508 ldr x8, [x8, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyBool_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 14000000 b 0x1c <_JIT_ENTRY+0x1c> + // 000000000000001c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0xa8, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x05, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyBool_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyBool_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0x1c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_INT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyLong_Type + // 8: f9400408 ldr x8, [x0, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyLong_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: f9400808 ldr x8, [x0, #0x10] + // 20: 92400508 and x8, x8, #0x3 + // 24: f100051f cmp x8, #0x1 + // 28: 540000a1 b.ne 0x3c <_JIT_ENTRY+0x3c> + // 2c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000002c: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 34: f81f82a8 stur x8, [x21, #-0x8] + // 38: 14000000 b 0x38 <_JIT_ENTRY+0x38> + // 0000000000000038: R_AARCH64_JUMP26 _JIT_CONTINUE + // 3c: b9400008 ldr w8, [x0] + // 40: 37f80088 tbnz w8, #0x1f, 0x50 <_JIT_ENTRY+0x50> + // 44: 71000508 subs w8, w8, #0x1 + // 48: b9000008 str w8, [x0] + // 4c: 540000a0 b.eq 0x60 <_JIT_ENTRY+0x60> + // 50: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 54: f9400108 ldr x8, [x8] + // 0000000000000054: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 58: f81f82a8 stur x8, [x21, #-0x8] + // 5c: 14000000 b 0x5c <_JIT_ENTRY+0x5c> + // 000000000000005c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 60: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 64: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000064: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 68: 910003fd mov x29, sp + // 6c: f9400108 ldr x8, [x8] + // 000000000000006c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 70: d63f0100 blr x8 + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 78: f9400108 ldr x8, [x8] + // 0000000000000078: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 7c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 80: f81f82a8 stur x8, [x21, #-0x8] + // 84: 14000000 b 0x84 <_JIT_ENTRY+0x84> + // 0000000000000084: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[136] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x04, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x08, 0x40, 0xf9, + 0x08, 0x05, 0x40, 0x92, 0x1f, 0x05, 0x00, 0xf1, + 0xa1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xa8, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyLong_Type+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: &_Py_TrueStruct+0x0 + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x50, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x5c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x64, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x6c, (uintptr_t)data + 0x18); + patch_aarch64_33rx(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x84, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_LIST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyList_Type + // 8: f9400408 ldr x8, [x0, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyList_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: b9400008 ldr w8, [x0] + // 20: f9400813 ldr x19, [x0, #0x10] + // 24: 37f80148 tbnz w8, #0x1f, 0x4c <_JIT_ENTRY+0x4c> + // 28: 71000508 subs w8, w8, #0x1 + // 2c: b9000008 str w8, [x0] + // 30: 540000e1 b.ne 0x4c <_JIT_ENTRY+0x4c> + // 34: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 38: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000038: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 3c: 910003fd mov x29, sp + // 40: f9400108 ldr x8, [x8] + // 0000000000000040: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 44: d63f0100 blr x8 + // 48: a8c17bfd ldp x29, x30, [sp], #0x10 + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 50: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000050: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 54: f100027f cmp x19, #0x0 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 5c: f9400129 ldr x9, [x9] + // 000000000000005c: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 60: 9a880128 csel x8, x9, x8, eq + // 64: f81f82a8 stur x8, [x21, #-0x8] + // 68: 14000000 b 0x68 <_JIT_ENTRY+0x68> + // 0000000000000068: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[104] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x04, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x40, 0xb9, + 0x13, 0x08, 0x40, 0xf9, 0x48, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xe1, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x00, 0x00, 0x90, 0x7f, 0x02, 0x00, 0xf1, + 0x08, 0x01, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x28, 0x01, 0x88, 0x9a, 0xa8, 0x82, 0x1f, 0xf8, + }; + // 0: &PyList_Type+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_Py_TrueStruct+0x0 + // 18: &_Py_FalseStruct+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyList_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x38, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x40, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x10); + patch_aarch64_21rx(code + 0x50, (uintptr_t)data + 0x18); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x5c, (uintptr_t)data + 0x18); +} + +void +emit__TO_BOOL_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_NONE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 4: f85f82a8 ldur x8, [x21, #-0x8] + // 8: f9400129 ldr x9, [x9] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // c: eb09011f cmp x8, x9 + // 10: 54000040 b.eq 0x18 <_JIT_ENTRY+0x18> + // 14: 14000000 b 0x14 <_JIT_ENTRY+0x14> + // 0000000000000014: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 18: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000018: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 20: f81f82a8 stur x8, [x21, #-0x8] + // 24: 14000000 b 0x24 <_JIT_ENTRY+0x24> + // 0000000000000024: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[40] = { + 0x09, 0x00, 0x00, 0x90, 0xa8, 0x82, 0x5f, 0xf8, + 0x29, 0x01, 0x40, 0xf9, 0x1f, 0x01, 0x09, 0xeb, + 0x40, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_26r(code + 0x14, state->instruction_starts[instruction->jump_target]); + patch_aarch64_33rx(code + 0x18, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x24, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__TO_BOOL_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_STR.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyUnicode_Type + // 8: f9400408 ldr x8, [x0, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyUnicode_Type + // 10: eb09011f cmp x8, x9 + // 14: 54000040 b.eq 0x1c <_JIT_ENTRY+0x1c> + // 18: 14000000 b 0x18 <_JIT_ENTRY+0x18> + // 0000000000000018: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 1c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _PyRuntime + // 20: 52914609 mov w9, #0x8a30 // =35376 + // 24: f9400108 ldr x8, [x8] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _PyRuntime + // 28: 8b090108 add x8, x8, x9 + // 2c: eb08001f cmp x0, x8 + // 30: 54000140 b.eq 0x58 <_JIT_ENTRY+0x58> + // 34: b9400008 ldr w8, [x0] + // 38: 37f80088 tbnz w8, #0x1f, 0x48 <_JIT_ENTRY+0x48> + // 3c: 71000508 subs w8, w8, #0x1 + // 40: b9000008 str w8, [x0] + // 44: 54000120 b.eq 0x68 <_JIT_ENTRY+0x68> + // 48: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000048: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 50: f81f82a8 stur x8, [x21, #-0x8] + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + // 58: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000058: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 5c: f9400108 ldr x8, [x8] + // 000000000000005c: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // 60: f81f82a8 stur x8, [x21, #-0x8] + // 64: 14000000 b 0x64 <_JIT_ENTRY+0x64> + // 0000000000000064: R_AARCH64_JUMP26 _JIT_CONTINUE + // 68: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 6c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000006c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 70: 910003fd mov x29, sp + // 74: f9400108 ldr x8, [x8] + // 0000000000000074: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 78: d63f0100 blr x8 + // 7c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000007c: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 84: a8c17bfd ldp x29, x30, [sp], #0x10 + // 88: f81f82a8 stur x8, [x21, #-0x8] + // 8c: 14000000 b 0x8c <_JIT_ENTRY+0x8c> + // 000000000000008c: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[144] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x04, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0x40, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x09, 0x46, 0x91, 0x52, 0x08, 0x01, 0x40, 0xf9, + 0x08, 0x01, 0x09, 0x8b, 0x1f, 0x00, 0x08, 0xeb, + 0x40, 0x01, 0x00, 0x54, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0x20, 0x01, 0x00, 0x54, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xa8, 0x82, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyUnicode_Type+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_Py_TrueStruct+0x0 + // 18: &_Py_FalseStruct+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x18, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x48, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0x58, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0x64, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x6c, (uintptr_t)data + 0x20); + patch_aarch64_12x(code + 0x74, (uintptr_t)data + 0x20); + patch_aarch64_33rx(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x8c, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__UNARY_INVERT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_INVERT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyNumber_Invert + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyNumber_Invert + // 14: 910003fd mov x29, sp + // 18: aa1303e0 mov x0, x19 + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b9400268 ldr w8, [x19] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000268 str w8, [x19] + // 38: 540000a0 b.eq 0x4c <_JIT_ENTRY+0x4c> + // 3c: b4000160 cbz x0, 0x68 <_JIT_ENTRY+0x68> + // 40: f81f82a0 stur x0, [x21, #-0x8] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: aa0003f7 mov x23, x0 + // 54: aa1303e0 mov x0, x19 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 5c: d63f0100 blr x8 + // 60: aa1703e0 mov x0, x23 + // 64: b5fffef7 cbnz x23, 0x40 <_JIT_ENTRY+0x40> + // 68: d10022b5 sub x21, x21, #0x8 + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 74: 00 00 00 00 + const unsigned char code_body[120] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x60, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0xaa, 0xf7, 0xfe, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyNumber_Invert+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyNumber_Invert); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x70, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNARY_NEGATIVE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NEGATIVE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: f85f82b3 ldur x19, [x21, #-0x8] + // 8: f9002295 str x21, [x20, #0x40] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyNumber_Negative + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyNumber_Negative + // 14: 910003fd mov x29, sp + // 18: aa1303e0 mov x0, x19 + // 1c: d63f0100 blr x8 + // 20: f9402295 ldr x21, [x20, #0x40] + // 24: f900229f str xzr, [x20, #0x40] + // 28: b9400268 ldr w8, [x19] + // 2c: 37f80088 tbnz w8, #0x1f, 0x3c <_JIT_ENTRY+0x3c> + // 30: 71000508 subs w8, w8, #0x1 + // 34: b9000268 str w8, [x19] + // 38: 540000a0 b.eq 0x4c <_JIT_ENTRY+0x4c> + // 3c: b4000160 cbz x0, 0x68 <_JIT_ENTRY+0x68> + // 40: f81f82a0 stur x0, [x21, #-0x8] + // 44: a8c17bfd ldp x29, x30, [sp], #0x10 + // 48: 14000000 b 0x48 <_JIT_ENTRY+0x48> + // 0000000000000048: R_AARCH64_JUMP26 _JIT_CONTINUE + // 4c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000004c: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 50: aa0003f7 mov x23, x0 + // 54: aa1303e0 mov x0, x19 + // 58: f9400108 ldr x8, [x8] + // 0000000000000058: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 5c: d63f0100 blr x8 + // 60: aa1703e0 mov x0, x23 + // 64: b5fffef7 cbnz x23, 0x40 <_JIT_ENTRY+0x40> + // 68: d10022b5 sub x21, x21, #0x8 + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 74: 00 00 00 00 + const unsigned char code_body[120] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0xb3, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x68, 0x02, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0x60, 0x01, 0x00, 0xb4, + 0xa0, 0x82, 0x1f, 0xf8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf7, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xe0, 0x03, 0x17, 0xaa, 0xf7, 0xfe, 0xff, 0xb5, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyNumber_Negative+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyNumber_Negative); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x58, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x70, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNARY_NOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NOT.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _Py_FalseStruct + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _Py_TrueStruct + // 8: f9400108 ldr x8, [x8] + // 0000000000000008: R_AARCH64_LD64_GOT_LO12_NC _Py_FalseStruct + // c: f85f82a9 ldur x9, [x21, #-0x8] + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _Py_TrueStruct + // 14: eb08013f cmp x9, x8 + // 18: 9a880148 csel x8, x10, x8, eq + // 1c: f81f82a8 stur x8, [x21, #-0x8] + // 20: 14000000 b 0x20 <_JIT_ENTRY+0x20> + // 0000000000000020: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[32] = { + 0x08, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xa9, 0x82, 0x5f, 0xf8, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x08, 0xeb, + 0x48, 0x01, 0x88, 0x9a, 0xa8, 0x82, 0x1f, 0xf8, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x0, (uintptr_t)data); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x8, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data + 0x8); +} + +void +emit__UNPACK_EX( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_EX.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: aa1603e0 mov x0, x22 + // c: 910003fd mov x29, sp + // 10: f9400108 ldr x8, [x8] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f85f82b7 ldur x23, [x21, #-0x8] + // 18: f9002295 str x21, [x20, #0x40] + // 1c: 12001d13 and w19, w8, #0xff + // 20: 53083d18 ubfx w24, w8, #8, #8 + // 24: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000024: R_AARCH64_ADR_GOT_PAGE _PyEval_UnpackIterableStackRef + // 28: 8b334ea9 add x9, x21, w19, uxtw #3 + // 2c: f9400108 ldr x8, [x8] + // 000000000000002c: R_AARCH64_LD64_GOT_LO12_NC _PyEval_UnpackIterableStackRef + // 30: aa1703e1 mov x1, x23 + // 34: 2a1303e2 mov w2, w19 + // 38: 2a1803e3 mov w3, w24 + // 3c: 8b384d24 add x4, x9, w24, uxtw #3 + // 40: d63f0100 blr x8 + // 44: f9402295 ldr x21, [x20, #0x40] + // 48: f900229f str xzr, [x20, #0x40] + // 4c: b94002e8 ldr w8, [x23] + // 50: 37f80088 tbnz w8, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 54: 71000508 subs w8, w8, #0x1 + // 58: b90002e8 str w8, [x23] + // 5c: 540000c0 b.eq 0x74 <_JIT_ENTRY+0x74> + // 60: 34000160 cbz w0, 0x8c <_JIT_ENTRY+0x8c> + // 64: 0b180268 add w8, w19, w24 + // 68: 8b284eb5 add x21, x21, w8, uxtw #3 + // 6c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_CONTINUE + // 74: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000074: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 78: 2a0003f9 mov w25, w0 + // 7c: aa1703e0 mov x0, x23 + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: 35fffef9 cbnz w25, 0x64 <_JIT_ENTRY+0x64> + // 8c: d10022b5 sub x21, x21, #0x8 + // 90: a8c17bfd ldp x29, x30, [sp], #0x10 + // 94: 14000000 b 0x94 <_JIT_ENTRY+0x94> + // 0000000000000094: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xe0, 0x03, 0x16, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0xb7, 0x82, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x13, 0x1d, 0x00, 0x12, + 0x18, 0x3d, 0x08, 0x53, 0x08, 0x00, 0x00, 0x90, + 0xa9, 0x4e, 0x33, 0x8b, 0x08, 0x01, 0x40, 0xf9, + 0xe1, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x13, 0x2a, + 0xe3, 0x03, 0x18, 0x2a, 0x24, 0x4d, 0x38, 0x8b, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0xe8, 0x02, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0x60, 0x01, 0x00, 0x34, 0x68, 0x02, 0x18, 0x0b, + 0xb5, 0x4e, 0x28, 0x8b, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0xf9, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x17, 0xaa, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xf9, 0xfe, 0xff, 0x35, 0xb5, 0x22, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x2c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x70, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x74, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x94, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNPACK_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 4: 90000017 adrp x23, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 8: aa1503e8 mov x8, x21 + // c: aa1603e0 mov x0, x22 + // 10: f94002f7 ldr x23, [x23] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 14: f85f8d13 ldr x19, [x8, #-0x8]! + // 18: f9002295 str x21, [x20, #0x40] + // 1c: 12800003 mov w3, #-0x1 // =-1 + // 20: 910003fd mov x29, sp + // 24: 8b372d04 add x4, x8, w23, uxth #3 + // 28: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000028: R_AARCH64_ADR_GOT_PAGE _PyEval_UnpackIterableStackRef + // 2c: 12003ee2 and w2, w23, #0xffff + // 30: f9400108 ldr x8, [x8] + // 0000000000000030: R_AARCH64_LD64_GOT_LO12_NC _PyEval_UnpackIterableStackRef + // 34: aa1303e1 mov x1, x19 + // 38: d63f0100 blr x8 + // 3c: f9402295 ldr x21, [x20, #0x40] + // 40: f900229f str xzr, [x20, #0x40] + // 44: b9400268 ldr w8, [x19] + // 48: 37f80088 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 4c: 71000508 subs w8, w8, #0x1 + // 50: b9000268 str w8, [x19] + // 54: 540000e0 b.eq 0x70 <_JIT_ENTRY+0x70> + // 58: 34000180 cbz w0, 0x88 <_JIT_ENTRY+0x88> + // 5c: 92403ee8 and x8, x23, #0xffff + // 60: 8b080ea8 add x8, x21, x8, lsl #3 + // 64: d1002115 sub x21, x8, #0x8 + // 68: a8c17bfd ldp x29, x30, [sp], #0x10 + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 70: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000070: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 74: 2a0003f8 mov w24, w0 + // 78: aa1303e0 mov x0, x19 + // 7c: f9400108 ldr x8, [x8] + // 000000000000007c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 80: d63f0100 blr x8 + // 84: 35fffed8 cbnz w24, 0x5c <_JIT_ENTRY+0x5c> + // 88: d10022b5 sub x21, x21, #0x8 + // 8c: a8c17bfd ldp x29, x30, [sp], #0x10 + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + // 94: 00 00 00 00 + const unsigned char code_body[152] = { + 0xfd, 0x7b, 0xbf, 0xa9, 0x17, 0x00, 0x00, 0x90, + 0xe8, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0xf7, 0x02, 0x40, 0xf9, 0x13, 0x8d, 0x5f, 0xf8, + 0x95, 0x22, 0x00, 0xf9, 0x03, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0x04, 0x2d, 0x37, 0x8b, + 0x08, 0x00, 0x00, 0x90, 0xe2, 0x3e, 0x00, 0x12, + 0x08, 0x01, 0x40, 0xf9, 0xe1, 0x03, 0x13, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x95, 0x22, 0x40, 0xf9, + 0x9f, 0x22, 0x00, 0xf9, 0x68, 0x02, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x68, 0x02, 0x00, 0xb9, 0xe0, 0x00, 0x00, 0x54, + 0x80, 0x01, 0x00, 0x34, 0xe8, 0x3e, 0x40, 0x92, + 0xa8, 0x0e, 0x08, 0x8b, 0x15, 0x21, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0xf8, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xd8, 0xfe, 0xff, 0x35, + 0xb5, 0x22, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x28, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x30, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_21rx(code + 0x70, (uintptr_t)data + 0x10); + patch_aarch64_12x(code + 0x7c, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->error_target]); +} + +void +emit__UNPACK_SEQUENCE_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_LIST.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyList_Type + // 8: f85f8d00 ldr x0, [x8, #-0x8]! + // c: f9400409 ldr x9, [x0, #0x8] + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyList_Type + // 14: eb0a013f cmp x9, x10 + // 18: 540003c1 b.ne 0x90 <_JIT_ENTRY+0x90> + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 20: f9400813 ldr x19, [x0, #0x10] + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 28: eb29227f cmp x19, w9, uxth + // 2c: 54000321 b.ne 0x90 <_JIT_ENTRY+0x90> + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 38: 910003fd mov x29, sp + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 40: 72003d3f tst w9, #0xffff + // 44: 54000280 b.eq 0x94 <_JIT_ENTRY+0x94> + // 48: f9400c09 ldr x9, [x0, #0x18] + // 4c: 8b130d2a add x10, x9, x19, lsl #3 + // 50: 91000669 add x9, x19, #0x1 + // 54: d100214a sub x10, x10, #0x8 + // 58: 14000008 b 0x78 <_JIT_ENTRY+0x78> + // 5c: d1000529 sub x9, x9, #0x1 + // 60: 9100210c add x12, x8, #0x8 + // 64: f900010b str x11, [x8] + // 68: f100053f cmp x9, #0x1 + // 6c: d100214a sub x10, x10, #0x8 + // 70: aa0c03e8 mov x8, x12 + // 74: 54000109 b.ls 0x94 <_JIT_ENTRY+0x94> + // 78: f940014b ldr x11, [x10] + // 7c: b940016c ldr w12, [x11] + // 80: 37fffeec tbnz w12, #0x1f, 0x5c <_JIT_ENTRY+0x5c> + // 84: 1100058c add w12, w12, #0x1 + // 88: b900016c str w12, [x11] + // 8c: 17fffff4 b 0x5c <_JIT_ENTRY+0x5c> + // 90: 14000000 b 0x90 <_JIT_ENTRY+0x90> + // 0000000000000090: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 94: b9400008 ldr w8, [x0] + // 98: 37f80088 tbnz w8, #0x1f, 0xa8 <_JIT_ENTRY+0xa8> + // 9c: 71000508 subs w8, w8, #0x1 + // a0: b9000008 str w8, [x0] + // a4: 540000a0 b.eq 0xb8 <_JIT_ENTRY+0xb8> + // a8: 8b130ea8 add x8, x21, x19, lsl #3 + // ac: d1002115 sub x21, x8, #0x8 + // b0: a8c17bfd ldp x29, x30, [sp], #0x10 + // b4: 14000000 b 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b4: R_AARCH64_JUMP26 _JIT_CONTINUE + // b8: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b8: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // bc: f9400108 ldr x8, [x8] + // 00000000000000bc: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // c0: d63f0100 blr x8 + // c4: 8b130ea8 add x8, x21, x19, lsl #3 + // c8: d1002115 sub x21, x8, #0x8 + // cc: a8c17bfd ldp x29, x30, [sp], #0x10 + // d0: 14000000 b 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000d0: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[208] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0a, 0x00, 0x00, 0x90, + 0x00, 0x8d, 0x5f, 0xf8, 0x09, 0x04, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0xeb, + 0xc1, 0x03, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x13, 0x08, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x7f, 0x22, 0x29, 0xeb, 0x21, 0x03, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x29, 0x01, 0x40, 0xf9, + 0x3f, 0x3d, 0x00, 0x72, 0x80, 0x02, 0x00, 0x54, + 0x09, 0x0c, 0x40, 0xf9, 0x2a, 0x0d, 0x13, 0x8b, + 0x69, 0x06, 0x00, 0x91, 0x4a, 0x21, 0x00, 0xd1, + 0x08, 0x00, 0x00, 0x14, 0x29, 0x05, 0x00, 0xd1, + 0x0c, 0x21, 0x00, 0x91, 0x0b, 0x01, 0x00, 0xf9, + 0x3f, 0x05, 0x00, 0xf1, 0x4a, 0x21, 0x00, 0xd1, + 0xe8, 0x03, 0x0c, 0xaa, 0x09, 0x01, 0x00, 0x54, + 0x4b, 0x01, 0x40, 0xf9, 0x6c, 0x01, 0x40, 0xb9, + 0xec, 0xfe, 0xff, 0x37, 0x8c, 0x05, 0x00, 0x11, + 0x6c, 0x01, 0x00, 0xb9, 0xf4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xa0, 0x00, 0x00, 0x54, + 0xa8, 0x0e, 0x13, 0x8b, 0x15, 0x21, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xa8, 0x0e, 0x13, 0x8b, + 0x15, 0x21, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + }; + // 0: &PyList_Type+0x0 + // 8: OPARG + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyList_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x90, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0xb4, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0xb8, (uintptr_t)data + 0x10); +} + +void +emit__UNPACK_SEQUENCE_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: aa1503e8 mov x8, x21 + // 4: 9000000a adrp x10, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyTuple_Type + // 8: f85f8d00 ldr x0, [x8, #-0x8]! + // c: f9400409 ldr x9, [x0, #0x8] + // 10: f940014a ldr x10, [x10] + // 0000000000000010: R_AARCH64_LD64_GOT_LO12_NC PyTuple_Type + // 14: eb0a013f cmp x9, x10 + // 18: 540003a1 b.ne 0x8c <_JIT_ENTRY+0x8c> + // 1c: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 000000000000001c: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 20: f9400813 ldr x19, [x0, #0x10] + // 24: f9400129 ldr x9, [x9] + // 0000000000000024: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 28: eb29227f cmp x19, w9, uxth + // 2c: 54000301 b.ne 0x8c <_JIT_ENTRY+0x8c> + // 30: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 34: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000034: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 38: 910003fd mov x29, sp + // 3c: f9400129 ldr x9, [x9] + // 000000000000003c: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 40: 72003d3f tst w9, #0xffff + // 44: 54000260 b.eq 0x90 <_JIT_ENTRY+0x90> + // 48: 8b130c0a add x10, x0, x19, lsl #3 + // 4c: 91000669 add x9, x19, #0x1 + // 50: 9100414a add x10, x10, #0x10 + // 54: 14000008 b 0x74 <_JIT_ENTRY+0x74> + // 58: d1000529 sub x9, x9, #0x1 + // 5c: 9100210c add x12, x8, #0x8 + // 60: f900010b str x11, [x8] + // 64: f100053f cmp x9, #0x1 + // 68: d100214a sub x10, x10, #0x8 + // 6c: aa0c03e8 mov x8, x12 + // 70: 54000109 b.ls 0x90 <_JIT_ENTRY+0x90> + // 74: f940014b ldr x11, [x10] + // 78: b940016c ldr w12, [x11] + // 7c: 37fffeec tbnz w12, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 80: 1100058c add w12, w12, #0x1 + // 84: b900016c str w12, [x11] + // 88: 17fffff4 b 0x58 <_JIT_ENTRY+0x58> + // 8c: 14000000 b 0x8c <_JIT_ENTRY+0x8c> + // 000000000000008c: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 90: b9400008 ldr w8, [x0] + // 94: 37f80088 tbnz w8, #0x1f, 0xa4 <_JIT_ENTRY+0xa4> + // 98: 71000508 subs w8, w8, #0x1 + // 9c: b9000008 str w8, [x0] + // a0: 540000a0 b.eq 0xb4 <_JIT_ENTRY+0xb4> + // a4: 8b130ea8 add x8, x21, x19, lsl #3 + // a8: d1002115 sub x21, x8, #0x8 + // ac: a8c17bfd ldp x29, x30, [sp], #0x10 + // b0: 14000000 b 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000b0: R_AARCH64_JUMP26 _JIT_CONTINUE + // b4: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 00000000000000b4: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // b8: f9400108 ldr x8, [x8] + // 00000000000000b8: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // bc: d63f0100 blr x8 + // c0: 8b130ea8 add x8, x21, x19, lsl #3 + // c4: d1002115 sub x21, x8, #0x8 + // c8: a8c17bfd ldp x29, x30, [sp], #0x10 + // cc: 14000000 b 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000cc: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[208] = { + 0xe8, 0x03, 0x15, 0xaa, 0x0a, 0x00, 0x00, 0x90, + 0x00, 0x8d, 0x5f, 0xf8, 0x09, 0x04, 0x40, 0xf9, + 0x4a, 0x01, 0x40, 0xf9, 0x3f, 0x01, 0x0a, 0xeb, + 0xa1, 0x03, 0x00, 0x54, 0x09, 0x00, 0x00, 0x90, + 0x13, 0x08, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x7f, 0x22, 0x29, 0xeb, 0x01, 0x03, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x09, 0x00, 0x00, 0x90, + 0xfd, 0x03, 0x00, 0x91, 0x29, 0x01, 0x40, 0xf9, + 0x3f, 0x3d, 0x00, 0x72, 0x60, 0x02, 0x00, 0x54, + 0x0a, 0x0c, 0x13, 0x8b, 0x69, 0x06, 0x00, 0x91, + 0x4a, 0x41, 0x00, 0x91, 0x08, 0x00, 0x00, 0x14, + 0x29, 0x05, 0x00, 0xd1, 0x0c, 0x21, 0x00, 0x91, + 0x0b, 0x01, 0x00, 0xf9, 0x3f, 0x05, 0x00, 0xf1, + 0x4a, 0x21, 0x00, 0xd1, 0xe8, 0x03, 0x0c, 0xaa, + 0x09, 0x01, 0x00, 0x54, 0x4b, 0x01, 0x40, 0xf9, + 0x6c, 0x01, 0x40, 0xb9, 0xec, 0xfe, 0xff, 0x37, + 0x8c, 0x05, 0x00, 0x11, 0x6c, 0x01, 0x00, 0xb9, + 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x14, + 0x08, 0x00, 0x40, 0xb9, 0x88, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xa0, 0x00, 0x00, 0x54, 0xa8, 0x0e, 0x13, 0x8b, + 0x15, 0x21, 0x00, 0xd1, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xa8, 0x0e, 0x13, 0x8b, 0x15, 0x21, 0x00, 0xd1, + 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyTuple_Type+0x0 + // 8: OPARG + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0x10, (uintptr_t)data); + patch_aarch64_21rx(code + 0x1c, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x24, (uintptr_t)data + 0x8); + patch_aarch64_21rx(code + 0x34, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x3c, (uintptr_t)data + 0x8); + patch_aarch64_26r(code + 0x8c, state->instruction_starts[instruction->jump_target]); + patch_aarch64_26r(code + 0xb0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_33rx(code + 0xb4, (uintptr_t)data + 0x10); + patch_aarch64_26r(code + 0xcc, (uintptr_t)code + sizeof(code_body)); +} + +void +emit__UNPACK_SEQUENCE_TWO_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TWO_TUPLE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: f85f82a0 ldur x0, [x21, #-0x8] + // 4: 90000009 adrp x9, 0x0 <_JIT_ENTRY> + // 0000000000000004: R_AARCH64_ADR_GOT_PAGE PyTuple_Type + // 8: f9400408 ldr x8, [x0, #0x8] + // c: f9400129 ldr x9, [x9] + // 000000000000000c: R_AARCH64_LD64_GOT_LO12_NC PyTuple_Type + // 10: eb09011f cmp x8, x9 + // 14: 540002e1 b.ne 0x70 <_JIT_ENTRY+0x70> + // 18: f9400808 ldr x8, [x0, #0x10] + // 1c: f100091f cmp x8, #0x2 + // 20: 54000281 b.ne 0x70 <_JIT_ENTRY+0x70> + // 24: f9400c13 ldr x19, [x0, #0x18] + // 28: b9400268 ldr w8, [x19] + // 2c: 37f80068 tbnz w8, #0x1f, 0x38 <_JIT_ENTRY+0x38> + // 30: 11000508 add w8, w8, #0x1 + // 34: b9000268 str w8, [x19] + // 38: f9401017 ldr x23, [x0, #0x20] + // 3c: b94002e8 ldr w8, [x23] + // 40: 37f80068 tbnz w8, #0x1f, 0x4c <_JIT_ENTRY+0x4c> + // 44: 11000508 add w8, w8, #0x1 + // 48: b90002e8 str w8, [x23] + // 4c: b9400008 ldr w8, [x0] + // 50: 37f80088 tbnz w8, #0x1f, 0x60 <_JIT_ENTRY+0x60> + // 54: 71000508 subs w8, w8, #0x1 + // 58: b9000008 str w8, [x0] + // 5c: 540000c0 b.eq 0x74 <_JIT_ENTRY+0x74> + // 60: aa1503e8 mov x8, x21 + // 64: 910022b5 add x21, x21, #0x8 + // 68: a93fcd17 stp x23, x19, [x8, #-0x8] + // 6c: 14000000 b 0x6c <_JIT_ENTRY+0x6c> + // 000000000000006c: R_AARCH64_JUMP26 _JIT_CONTINUE + // 70: 14000000 b 0x70 <_JIT_ENTRY+0x70> + // 0000000000000070: R_AARCH64_JUMP26 _JIT_JUMP_TARGET + // 74: a9bf7bfd stp x29, x30, [sp, #-0x10]! + // 78: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000078: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 7c: 910003fd mov x29, sp + // 80: f9400108 ldr x8, [x8] + // 0000000000000080: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 84: d63f0100 blr x8 + // 88: a8c17bfd ldp x29, x30, [sp], #0x10 + // 8c: aa1503e8 mov x8, x21 + // 90: 910022b5 add x21, x21, #0x8 + // 94: a93fcd17 stp x23, x19, [x8, #-0x8] + // 98: 14000000 b 0x98 <_JIT_ENTRY+0x98> + // 0000000000000098: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[152] = { + 0xa0, 0x82, 0x5f, 0xf8, 0x09, 0x00, 0x00, 0x90, + 0x08, 0x04, 0x40, 0xf9, 0x29, 0x01, 0x40, 0xf9, + 0x1f, 0x01, 0x09, 0xeb, 0xe1, 0x02, 0x00, 0x54, + 0x08, 0x08, 0x40, 0xf9, 0x1f, 0x09, 0x00, 0xf1, + 0x81, 0x02, 0x00, 0x54, 0x13, 0x0c, 0x40, 0xf9, + 0x68, 0x02, 0x40, 0xb9, 0x68, 0x00, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x11, 0x68, 0x02, 0x00, 0xb9, + 0x17, 0x10, 0x40, 0xf9, 0xe8, 0x02, 0x40, 0xb9, + 0x68, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x11, + 0xe8, 0x02, 0x00, 0xb9, 0x08, 0x00, 0x40, 0xb9, + 0x88, 0x00, 0xf8, 0x37, 0x08, 0x05, 0x00, 0x71, + 0x08, 0x00, 0x00, 0xb9, 0xc0, 0x00, 0x00, 0x54, + 0xe8, 0x03, 0x15, 0xaa, 0xb5, 0x22, 0x00, 0x91, + 0x17, 0xcd, 0x3f, 0xa9, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0x08, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x08, 0x01, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0xe8, 0x03, 0x15, 0xaa, + 0xb5, 0x22, 0x00, 0x91, 0x17, 0xcd, 0x3f, 0xa9, + }; + // 0: &PyTuple_Type+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0x4, (uintptr_t)data); + patch_aarch64_12x(code + 0xc, (uintptr_t)data); + patch_aarch64_26r(code + 0x6c, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0x70, state->instruction_starts[instruction->jump_target]); + patch_aarch64_21rx(code + 0x78, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x80, (uintptr_t)data + 0x8); +} + +void +emit__WITH_EXCEPT_START( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _WITH_EXCEPT_START.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: d10103ff sub sp, sp, #0x40 + // 4: f85f82b7 ldur x23, [x21, #-0x8] + // 8: a9037bfd stp x29, x30, [sp, #0x30] + // c: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 000000000000000c: R_AARCH64_ADR_GOT_PAGE PyException_GetTraceback + // 10: a97de2b3 ldp x19, x24, [x21, #-0x28] + // 14: 9100c3fd add x29, sp, #0x30 + // 18: f94006f9 ldr x25, [x23, #0x8] + // 1c: f9400108 ldr x8, [x8] + // 000000000000001c: R_AARCH64_LD64_GOT_LO12_NC PyException_GetTraceback + // 20: aa1703e0 mov x0, x23 + // 24: d63f0100 blr x8 + // 28: b40001c0 cbz x0, 0x60 <_JIT_ENTRY+0x60> + // 2c: f9002295 str x21, [x20, #0x40] + // 30: b9400008 ldr w8, [x0] + // 34: 37f80128 tbnz w8, #0x1f, 0x58 <_JIT_ENTRY+0x58> + // 38: 71000508 subs w8, w8, #0x1 + // 3c: b9000008 str w8, [x0] + // 40: 540000c1 b.ne 0x58 <_JIT_ENTRY+0x58> + // 44: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000044: R_AARCH64_ADR_GOT_PAGE _Py_Dealloc + // 48: aa0003f5 mov x21, x0 + // 4c: f9400108 ldr x8, [x8] + // 000000000000004c: R_AARCH64_LD64_GOT_LO12_NC _Py_Dealloc + // 50: d63f0100 blr x8 + // 54: aa1503e0 mov x0, x21 + // 58: f9402295 ldr x21, [x20, #0x40] + // 5c: 14000003 b 0x68 <_JIT_ENTRY+0x68> + // 60: 90000000 adrp x0, 0x0 <_JIT_ENTRY> + // 0000000000000060: R_AARCH64_ADR_GOT_PAGE _Py_NoneStruct + // 64: f9400000 ldr x0, [x0] + // 0000000000000064: R_AARCH64_LD64_GOT_LO12_NC _Py_NoneStruct + // 68: 910023e8 add x8, sp, #0x8 + // 6c: f100031f cmp x24, #0x0 + // 70: a900e3ff stp xzr, x24, [sp, #0x8] + // 74: 91004108 add x8, x8, #0x10 + // 78: da9f03e9 csetm x9, ne + // 7c: a901dff9 stp x25, x23, [sp, #0x18] + // 80: 8b090d01 add x1, x8, x9, lsl #3 + // 84: b2410be8 mov x8, #-0x7ffffffffffffffd // =-9223372036854775805 + // 88: f90017e0 str x0, [sp, #0x28] + // 8c: 9a880502 cinc x2, x8, ne + // 90: f9002295 str x21, [x20, #0x40] + // 94: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000094: R_AARCH64_ADR_GOT_PAGE PyObject_Vectorcall + // 98: f9400108 ldr x8, [x8] + // 0000000000000098: R_AARCH64_LD64_GOT_LO12_NC PyObject_Vectorcall + // 9c: aa1303e0 mov x0, x19 + // a0: aa1f03e3 mov x3, xzr + // a4: d63f0100 blr x8 + // a8: f9402295 ldr x21, [x20, #0x40] + // ac: f900229f str xzr, [x20, #0x40] + // b0: b40000a0 cbz x0, 0xc4 <_JIT_ENTRY+0xc4> + // b4: a9437bfd ldp x29, x30, [sp, #0x30] + // b8: f80086a0 str x0, [x21], #0x8 + // bc: 910103ff add sp, sp, #0x40 + // c0: 14000000 b 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000c0: R_AARCH64_JUMP26 _JIT_CONTINUE + // c4: a9437bfd ldp x29, x30, [sp, #0x30] + // c8: 910103ff add sp, sp, #0x40 + // cc: 14000000 b 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000cc: R_AARCH64_JUMP26 _JIT_ERROR_TARGET + const unsigned char code_body[208] = { + 0xff, 0x03, 0x01, 0xd1, 0xb7, 0x82, 0x5f, 0xf8, + 0xfd, 0x7b, 0x03, 0xa9, 0x08, 0x00, 0x00, 0x90, + 0xb3, 0xe2, 0x7d, 0xa9, 0xfd, 0xc3, 0x00, 0x91, + 0xf9, 0x06, 0x40, 0xf9, 0x08, 0x01, 0x40, 0xf9, + 0xe0, 0x03, 0x17, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0xc0, 0x01, 0x00, 0xb4, 0x95, 0x22, 0x00, 0xf9, + 0x08, 0x00, 0x40, 0xb9, 0x28, 0x01, 0xf8, 0x37, + 0x08, 0x05, 0x00, 0x71, 0x08, 0x00, 0x00, 0xb9, + 0xc1, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x90, + 0xf5, 0x03, 0x00, 0xaa, 0x08, 0x01, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0xaa, + 0x95, 0x22, 0x40, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x40, 0xf9, + 0xe8, 0x23, 0x00, 0x91, 0x1f, 0x03, 0x00, 0xf1, + 0xff, 0xe3, 0x00, 0xa9, 0x08, 0x41, 0x00, 0x91, + 0xe9, 0x03, 0x9f, 0xda, 0xf9, 0xdf, 0x01, 0xa9, + 0x01, 0x0d, 0x09, 0x8b, 0xe8, 0x0b, 0x41, 0xb2, + 0xe0, 0x17, 0x00, 0xf9, 0x02, 0x05, 0x88, 0x9a, + 0x95, 0x22, 0x00, 0xf9, 0x08, 0x00, 0x00, 0x90, + 0x08, 0x01, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0xe3, 0x03, 0x1f, 0xaa, 0x00, 0x01, 0x3f, 0xd6, + 0x95, 0x22, 0x40, 0xf9, 0x9f, 0x22, 0x00, 0xf9, + 0xa0, 0x00, 0x00, 0xb4, 0xfd, 0x7b, 0x43, 0xa9, + 0xa0, 0x86, 0x00, 0xf8, 0xff, 0x03, 0x01, 0x91, + 0x00, 0x00, 0x00, 0x14, 0xfd, 0x7b, 0x43, 0xa9, + 0xff, 0x03, 0x01, 0x91, 0x00, 0x00, 0x00, 0x14, + }; + // 0: &PyException_GetTraceback+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &PyObject_Vectorcall+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyException_GetTraceback); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&PyObject_Vectorcall); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_21rx(code + 0xc, (uintptr_t)data); + patch_aarch64_12x(code + 0x1c, (uintptr_t)data); + patch_aarch64_21rx(code + 0x44, (uintptr_t)data + 0x8); + patch_aarch64_12x(code + 0x4c, (uintptr_t)data + 0x8); + patch_aarch64_33rx(code + 0x60, (uintptr_t)data + 0x10); + patch_aarch64_33rx(code + 0x94, (uintptr_t)data + 0x18); + patch_aarch64_26r(code + 0xc0, (uintptr_t)code + sizeof(code_body)); + patch_aarch64_26r(code + 0xcc, state->instruction_starts[instruction->error_target]); +} + +void +emit__YIELD_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _YIELD_VALUE.o: file format elf64-littleaarch64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 90000008 adrp x8, 0x0 <_JIT_ENTRY> + // 0000000000000000: R_AARCH64_ADR_GOT_PAGE _JIT_OPARG + // 4: f9400108 ldr x8, [x8] + // 0000000000000004: R_AARCH64_LD64_GOT_LO12_NC _JIT_OPARG + // 8: f9401e89 ldr x9, [x20, #0x38] + // c: f85f8eaa ldr x10, [x21, #-0x8]! + // 10: 51000908 sub w8, w8, #0x2 + // 14: 91000929 add x9, x9, #0x2 + // 18: 381fb288 sturb w8, [x20, #-0x5] + // 1c: f85e8288 ldur x8, [x20, #-0x18] + // 20: a903d689 stp x9, x21, [x20, #0x38] + // 24: b9402ec9 ldr w9, [x22, #0x2c] + // 28: f9003ec8 str x8, [x22, #0x78] + // 2c: f9400688 ldr x8, [x20, #0x8] + // 30: f81e829f stur xzr, [x20, #-0x18] + // 34: 11000529 add w9, w9, #0x1 + // 38: f9402115 ldr x21, [x8, #0x40] + // 3c: f900069f str xzr, [x20, #0x8] + // 40: aa0803f4 mov x20, x8 + // 44: b9002ec9 str w9, [x22, #0x2c] + // 48: f90026c8 str x8, [x22, #0x48] + // 4c: f900211f str xzr, [x8, #0x40] + // 50: f80086aa str x10, [x21], #0x8 + // 54: 14000000 b 0x54 <_JIT_ENTRY+0x54> + // 0000000000000054: R_AARCH64_JUMP26 _JIT_CONTINUE + const unsigned char code_body[88] = { + 0x08, 0x00, 0x00, 0x90, 0x08, 0x01, 0x40, 0xf9, + 0x89, 0x1e, 0x40, 0xf9, 0xaa, 0x8e, 0x5f, 0xf8, + 0x08, 0x09, 0x00, 0x51, 0x29, 0x09, 0x00, 0x91, + 0x88, 0xb2, 0x1f, 0x38, 0x88, 0x82, 0x5e, 0xf8, + 0x89, 0xd6, 0x03, 0xa9, 0xc9, 0x2e, 0x40, 0xb9, + 0xc8, 0x3e, 0x00, 0xf9, 0x88, 0x06, 0x40, 0xf9, + 0x9f, 0x82, 0x1e, 0xf8, 0x29, 0x05, 0x00, 0x11, + 0x15, 0x21, 0x40, 0xf9, 0x9f, 0x06, 0x00, 0xf9, + 0xf4, 0x03, 0x08, 0xaa, 0xc9, 0x2e, 0x00, 0xb9, + 0xc8, 0x26, 0x00, 0xf9, 0x1f, 0x21, 0x00, 0xf9, + 0xaa, 0x86, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x14, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_aarch64_33rx(code + 0x0, (uintptr_t)data); + patch_aarch64_26r(code + 0x54, (uintptr_t)code + sizeof(code_body)); +} + +static_assert(SYMBOL_MASK_WORDS >= 1, "SYMBOL_MASK_WORDS too small"); + +typedef struct { + void (*emit)( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state); + size_t code_size; + size_t data_size; + symbol_mask trampoline_mask; +} StencilGroup; + +static const StencilGroup shim = {emit_shim, 104, 0, {0}}; + +static const StencilGroup stencil_groups[MAX_UOP_ID + 1] = { + [_BINARY_OP] = {emit__BINARY_OP, 176, 24, {0}}, + [_BINARY_OP_ADD_FLOAT] = {emit__BINARY_OP_ADD_FLOAT, 72, 8, {0}}, + [_BINARY_OP_ADD_INT] = {emit__BINARY_OP_ADD_INT, 216, 24, {0}}, + [_BINARY_OP_ADD_UNICODE] = {emit__BINARY_OP_ADD_UNICODE, 216, 24, {0}}, + [_BINARY_OP_EXTEND] = {emit__BINARY_OP_EXTEND, 152, 16, {0}}, + [_BINARY_OP_INPLACE_ADD_UNICODE] = {emit__BINARY_OP_INPLACE_ADD_UNICODE, 256, 32, {0}}, + [_BINARY_OP_MULTIPLY_FLOAT] = {emit__BINARY_OP_MULTIPLY_FLOAT, 72, 8, {0}}, + [_BINARY_OP_MULTIPLY_INT] = {emit__BINARY_OP_MULTIPLY_INT, 216, 24, {0}}, + [_BINARY_OP_SUBSCR_CHECK_FUNC] = {emit__BINARY_OP_SUBSCR_CHECK_FUNC, 104, 0, {0}}, + [_BINARY_OP_SUBSCR_DICT] = {emit__BINARY_OP_SUBSCR_DICT, 256, 32, {0}}, + [_BINARY_OP_SUBSCR_INIT_CALL] = {emit__BINARY_OP_SUBSCR_INIT_CALL, 152, 0, {0}}, + [_BINARY_OP_SUBSCR_LIST_INT] = {emit__BINARY_OP_SUBSCR_LIST_INT, 248, 40, {0}}, + [_BINARY_OP_SUBSCR_STR_INT] = {emit__BINARY_OP_SUBSCR_STR_INT, 392, 40, {0}}, + [_BINARY_OP_SUBSCR_TUPLE_INT] = {emit__BINARY_OP_SUBSCR_TUPLE_INT, 248, 40, {0}}, + [_BINARY_OP_SUBTRACT_FLOAT] = {emit__BINARY_OP_SUBTRACT_FLOAT, 72, 8, {0}}, + [_BINARY_OP_SUBTRACT_INT] = {emit__BINARY_OP_SUBTRACT_INT, 216, 24, {0}}, + [_BINARY_SLICE] = {emit__BINARY_SLICE, 232, 24, {0}}, + [_BUILD_LIST] = {emit__BUILD_LIST, 88, 16, {0}}, + [_BUILD_MAP] = {emit__BUILD_MAP, 216, 24, {0}}, + [_BUILD_SET] = {emit__BUILD_SET, 432, 32, {0}}, + [_BUILD_SLICE] = {emit__BUILD_SLICE, 192, 24, {0}}, + [_BUILD_STRING] = {emit__BUILD_STRING, 184, 32, {0}}, + [_BUILD_TUPLE] = {emit__BUILD_TUPLE, 88, 16, {0}}, + [_CALL_BUILTIN_CLASS] = {emit__CALL_BUILTIN_CLASS, 320, 16, {0}}, + [_CALL_BUILTIN_FAST] = {emit__CALL_BUILTIN_FAST, 336, 24, {0}}, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = {emit__CALL_BUILTIN_FAST_WITH_KEYWORDS, 344, 24, {0}}, + [_CALL_BUILTIN_O] = {emit__CALL_BUILTIN_O, 288, 24, {0}}, + [_CALL_INTRINSIC_1] = {emit__CALL_INTRINSIC_1, 144, 24, {0}}, + [_CALL_INTRINSIC_2] = {emit__CALL_INTRINSIC_2, 184, 24, {0}}, + [_CALL_ISINSTANCE] = {emit__CALL_ISINSTANCE, 360, 40, {0}}, + [_CALL_KW_NON_PY] = {emit__CALL_KW_NON_PY, 392, 24, {0}}, + [_CALL_LEN] = {emit__CALL_LEN, 296, 32, {0}}, + [_CALL_LIST_APPEND] = {emit__CALL_LIST_APPEND, 272, 16, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST] = {emit__CALL_METHOD_DESCRIPTOR_FAST, 368, 24, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 376, 24, {0}}, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = {emit__CALL_METHOD_DESCRIPTOR_NOARGS, 304, 24, {0}}, + [_CALL_METHOD_DESCRIPTOR_O] = {emit__CALL_METHOD_DESCRIPTOR_O, 400, 24, {0}}, + [_CALL_NON_PY_GENERAL] = {emit__CALL_NON_PY_GENERAL, 304, 24, {0}}, + [_CALL_STR_1] = {emit__CALL_STR_1, 160, 24, {0}}, + [_CALL_TUPLE_1] = {emit__CALL_TUPLE_1, 160, 24, {0}}, + [_CALL_TYPE_1] = {emit__CALL_TYPE_1, 136, 16, {0}}, + [_CHECK_AND_ALLOCATE_OBJECT] = {emit__CHECK_AND_ALLOCATE_OBJECT, 264, 40, {0}}, + [_CHECK_ATTR_CLASS] = {emit__CHECK_ATTR_CLASS, 48, 8, {0}}, + [_CHECK_ATTR_METHOD_LAZY_DICT] = {emit__CHECK_ATTR_METHOD_LAZY_DICT, 32, 8, {0}}, + [_CHECK_ATTR_MODULE_PUSH_KEYS] = {emit__CHECK_ATTR_MODULE_PUSH_KEYS, 72, 16, {0}}, + [_CHECK_ATTR_WITH_HINT] = {emit__CHECK_ATTR_WITH_HINT, 24, 0, {0}}, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 64, 16, {0}}, + [_CHECK_EG_MATCH] = {emit__CHECK_EG_MATCH, 376, 40, {0}}, + [_CHECK_EXC_MATCH] = {emit__CHECK_EXC_MATCH, 224, 40, {0}}, + [_CHECK_FUNCTION] = {emit__CHECK_FUNCTION, 32, 8, {0}}, + [_CHECK_FUNCTION_EXACT_ARGS] = {emit__CHECK_FUNCTION_EXACT_ARGS, 64, 8, {0}}, + [_CHECK_FUNCTION_VERSION] = {emit__CHECK_FUNCTION_VERSION, 72, 24, {0}}, + [_CHECK_FUNCTION_VERSION_INLINE] = {emit__CHECK_FUNCTION_VERSION_INLINE, 40, 16, {0}}, + [_CHECK_FUNCTION_VERSION_KW] = {emit__CHECK_FUNCTION_VERSION_KW, 72, 24, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE] = {emit__CHECK_IS_NOT_PY_CALLABLE, 64, 24, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = {emit__CHECK_IS_NOT_PY_CALLABLE_KW, 64, 24, {0}}, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = {emit__CHECK_MANAGED_OBJECT_HAS_VALUES, 32, 0, {0}}, + [_CHECK_METHOD_VERSION] = {emit__CHECK_METHOD_VERSION, 104, 32, {0}}, + [_CHECK_METHOD_VERSION_KW] = {emit__CHECK_METHOD_VERSION_KW, 112, 32, {0}}, + [_CHECK_PEP_523] = {emit__CHECK_PEP_523, 16, 0, {0}}, + [_CHECK_PERIODIC] = {emit__CHECK_PERIODIC, 64, 8, {0}}, + [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = {emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM, 72, 16, {0}}, + [_CHECK_STACK_SPACE] = {emit__CHECK_STACK_SPACE, 72, 8, {0}}, + [_CHECK_STACK_SPACE_OPERAND] = {emit__CHECK_STACK_SPACE_OPERAND, 56, 8, {0}}, + [_CHECK_VALIDITY] = {emit__CHECK_VALIDITY, 24, 8, {0}}, + [_CHECK_VALIDITY_AND_SET_IP] = {emit__CHECK_VALIDITY_AND_SET_IP, 32, 16, {0}}, + [_COMPARE_OP] = {emit__COMPARE_OP, 312, 48, {0}}, + [_COMPARE_OP_FLOAT] = {emit__COMPARE_OP_FLOAT, 232, 40, {0}}, + [_COMPARE_OP_INT] = {emit__COMPARE_OP_INT, 280, 40, {0}}, + [_COMPARE_OP_STR] = {emit__COMPARE_OP_STR, 232, 48, {0}}, + [_CONTAINS_OP] = {emit__CONTAINS_OP, 192, 40, {0}}, + [_CONTAINS_OP_DICT] = {emit__CONTAINS_OP_DICT, 224, 48, {0}}, + [_CONTAINS_OP_SET] = {emit__CONTAINS_OP_SET, 232, 56, {0}}, + [_CONVERT_VALUE] = {emit__CONVERT_VALUE, 152, 24, {0}}, + [_COPY] = {emit__COPY, 40, 8, {0}}, + [_COPY_FREE_VARS] = {emit__COPY_FREE_VARS, 96, 8, {0}}, + [_CREATE_INIT_FRAME] = {emit__CREATE_INIT_FRAME, 264, 40, {0}}, + [_DELETE_ATTR] = {emit__DELETE_ATTR, 136, 24, {0}}, + [_DELETE_DEREF] = {emit__DELETE_DEREF, 152, 24, {0}}, + [_DELETE_FAST] = {emit__DELETE_FAST, 184, 120, {0}}, + [_DELETE_GLOBAL] = {emit__DELETE_GLOBAL, 152, 64, {0}}, + [_DELETE_NAME] = {emit__DELETE_NAME, 192, 104, {0}}, + [_DELETE_SUBSCR] = {emit__DELETE_SUBSCR, 152, 16, {0}}, + [_DEOPT] = {emit__DEOPT, 40, 16, {0}}, + [_DICT_MERGE] = {emit__DICT_MERGE, 240, 32, {0}}, + [_DICT_UPDATE] = {emit__DICT_UPDATE, 288, 96, {0}}, + [_END_FOR] = {emit__END_FOR, 72, 8, {0}}, + [_END_SEND] = {emit__END_SEND, 72, 8, {0}}, + [_ERROR_POP_N] = {emit__ERROR_POP_N, 48, 16, {0}}, + [_EXIT_INIT_CHECK] = {emit__EXIT_INIT_CHECK, 96, 72, {0}}, + [_EXIT_TRACE] = {emit__EXIT_TRACE, 472, 32, {0}}, + [_EXPAND_METHOD] = {emit__EXPAND_METHOD, 152, 16, {0}}, + [_EXPAND_METHOD_KW] = {emit__EXPAND_METHOD_KW, 152, 16, {0}}, + [_FATAL_ERROR] = {emit__FATAL_ERROR, 40, 48, {0}}, + [_FORMAT_SIMPLE] = {emit__FORMAT_SIMPLE, 168, 24, {0}}, + [_FORMAT_WITH_SPEC] = {emit__FORMAT_WITH_SPEC, 160, 16, {0}}, + [_FOR_ITER_GEN_FRAME] = {emit__FOR_ITER_GEN_FRAME, 112, 24, {0}}, + [_FOR_ITER_TIER_TWO] = {emit__FOR_ITER_TIER_TWO, 184, 32, {0}}, + [_GET_AITER] = {emit__GET_AITER, 368, 184, {0}}, + [_GET_ANEXT] = {emit__GET_ANEXT, 64, 8, {0}}, + [_GET_AWAITABLE] = {emit__GET_AWAITABLE, 128, 24, {0}}, + [_GET_ITER] = {emit__GET_ITER, 120, 16, {0}}, + [_GET_LEN] = {emit__GET_LEN, 80, 16, {0}}, + [_GET_YIELD_FROM_ITER] = {emit__GET_YIELD_FROM_ITER, 240, 120, {0}}, + [_GUARD_BINARY_OP_EXTEND] = {emit__GUARD_BINARY_OP_EXTEND, 64, 8, {0}}, + [_GUARD_BOTH_FLOAT] = {emit__GUARD_BOTH_FLOAT, 48, 8, {0}}, + [_GUARD_BOTH_INT] = {emit__GUARD_BOTH_INT, 48, 8, {0}}, + [_GUARD_BOTH_UNICODE] = {emit__GUARD_BOTH_UNICODE, 48, 8, {0}}, + [_GUARD_BUILTINS_VERSION_PUSH_KEYS] = {emit__GUARD_BUILTINS_VERSION_PUSH_KEYS, 64, 16, {0}}, + [_GUARD_DORV_NO_DICT] = {emit__GUARD_DORV_NO_DICT, 40, 0, {0}}, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = {emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 32, 0, {0}}, + [_GUARD_GLOBALS_VERSION] = {emit__GUARD_GLOBALS_VERSION, 56, 16, {0}}, + [_GUARD_GLOBALS_VERSION_PUSH_KEYS] = {emit__GUARD_GLOBALS_VERSION_PUSH_KEYS, 64, 16, {0}}, + [_GUARD_IS_FALSE_POP] = {emit__GUARD_IS_FALSE_POP, 24, 8, {0}}, + [_GUARD_IS_NONE_POP] = {emit__GUARD_IS_NONE_POP, 96, 16, {0}}, + [_GUARD_IS_NOT_NONE_POP] = {emit__GUARD_IS_NOT_NONE_POP, 112, 16, {0}}, + [_GUARD_IS_TRUE_POP] = {emit__GUARD_IS_TRUE_POP, 24, 8, {0}}, + [_GUARD_KEYS_VERSION] = {emit__GUARD_KEYS_VERSION, 40, 8, {0}}, + [_GUARD_NOS_FLOAT] = {emit__GUARD_NOS_FLOAT, 32, 8, {0}}, + [_GUARD_NOS_INT] = {emit__GUARD_NOS_INT, 32, 8, {0}}, + [_GUARD_NOT_EXHAUSTED_LIST] = {emit__GUARD_NOT_EXHAUSTED_LIST, 48, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_RANGE] = {emit__GUARD_NOT_EXHAUSTED_RANGE, 24, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_TUPLE] = {emit__GUARD_NOT_EXHAUSTED_TUPLE, 40, 0, {0}}, + [_GUARD_TOS_FLOAT] = {emit__GUARD_TOS_FLOAT, 32, 8, {0}}, + [_GUARD_TOS_INT] = {emit__GUARD_TOS_INT, 32, 8, {0}}, + [_GUARD_TYPE_VERSION] = {emit__GUARD_TYPE_VERSION, 40, 8, {0}}, + [_GUARD_TYPE_VERSION_AND_LOCK] = {emit__GUARD_TYPE_VERSION_AND_LOCK, 40, 8, {0}}, + [_IMPORT_FROM] = {emit__IMPORT_FROM, 88, 16, {0}}, + [_IMPORT_NAME] = {emit__IMPORT_NAME, 192, 24, {0}}, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS, 152, 16, {0}}, + [_INIT_CALL_PY_EXACT_ARGS] = {emit__INIT_CALL_PY_EXACT_ARGS, 352, 8, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_0] = {emit__INIT_CALL_PY_EXACT_ARGS_0, 152, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_1] = {emit__INIT_CALL_PY_EXACT_ARGS_1, 160, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_2] = {emit__INIT_CALL_PY_EXACT_ARGS_2, 176, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_3] = {emit__INIT_CALL_PY_EXACT_ARGS_3, 184, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_4] = {emit__INIT_CALL_PY_EXACT_ARGS_4, 192, 0, {0}}, + [_IS_NONE] = {emit__IS_NONE, 112, 32, {0}}, + [_IS_OP] = {emit__IS_OP, 144, 32, {0}}, + [_ITER_CHECK_LIST] = {emit__ITER_CHECK_LIST, 32, 8, {0}}, + [_ITER_CHECK_RANGE] = {emit__ITER_CHECK_RANGE, 32, 8, {0}}, + [_ITER_CHECK_TUPLE] = {emit__ITER_CHECK_TUPLE, 32, 8, {0}}, + [_ITER_NEXT_LIST] = {emit__ITER_NEXT_LIST, 48, 0, {0}}, + [_ITER_NEXT_RANGE] = {emit__ITER_NEXT_RANGE, 72, 8, {0}}, + [_ITER_NEXT_TUPLE] = {emit__ITER_NEXT_TUPLE, 48, 0, {0}}, + [_JUMP_TO_TOP] = {emit__JUMP_TO_TOP, 8, 0, {0}}, + [_LIST_APPEND] = {emit__LIST_APPEND, 104, 16, {0}}, + [_LIST_EXTEND] = {emit__LIST_EXTEND, 328, 112, {0}}, + [_LOAD_ATTR] = {emit__LOAD_ATTR, 296, 32, {0}}, + [_LOAD_ATTR_CLASS] = {emit__LOAD_ATTR_CLASS, 88, 16, {0}}, + [_LOAD_ATTR_INSTANCE_VALUE] = {emit__LOAD_ATTR_INSTANCE_VALUE, 120, 16, {0}}, + [_LOAD_ATTR_METHOD_LAZY_DICT] = {emit__LOAD_ATTR_METHOD_LAZY_DICT, 40, 8, {0}}, + [_LOAD_ATTR_METHOD_NO_DICT] = {emit__LOAD_ATTR_METHOD_NO_DICT, 40, 8, {0}}, + [_LOAD_ATTR_METHOD_WITH_VALUES] = {emit__LOAD_ATTR_METHOD_WITH_VALUES, 40, 8, {0}}, + [_LOAD_ATTR_MODULE] = {emit__LOAD_ATTR_MODULE, 128, 16, {0}}, + [_LOAD_ATTR_MODULE_FROM_KEYS] = {emit__LOAD_ATTR_MODULE_FROM_KEYS, 144, 16, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 80, 16, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 80, 16, {0}}, + [_LOAD_ATTR_PROPERTY_FRAME] = {emit__LOAD_ATTR_PROPERTY_FRAME, 224, 8, {0}}, + [_LOAD_ATTR_SLOT] = {emit__LOAD_ATTR_SLOT, 104, 16, {0}}, + [_LOAD_ATTR_WITH_HINT] = {emit__LOAD_ATTR_WITH_HINT, 192, 24, {0}}, + [_LOAD_BUILD_CLASS] = {emit__LOAD_BUILD_CLASS, 152, 64, {0}}, + [_LOAD_COMMON_CONSTANT] = {emit__LOAD_COMMON_CONSTANT, 40, 24, {0}}, + [_LOAD_CONST_IMMORTAL] = {emit__LOAD_CONST_IMMORTAL, 32, 8, {0}}, + [_LOAD_CONST_INLINE] = {emit__LOAD_CONST_INLINE, 32, 8, {0}}, + [_LOAD_CONST_INLINE_BORROW] = {emit__LOAD_CONST_INLINE_BORROW, 16, 8, {0}}, + [_LOAD_CONST_MORTAL] = {emit__LOAD_CONST_MORTAL, 48, 8, {0}}, + [_LOAD_DEREF] = {emit__LOAD_DEREF, 112, 16, {0}}, + [_LOAD_FAST] = {emit__LOAD_FAST, 40, 8, {0}}, + [_LOAD_FAST_0] = {emit__LOAD_FAST_0, 24, 0, {0}}, + [_LOAD_FAST_1] = {emit__LOAD_FAST_1, 24, 0, {0}}, + [_LOAD_FAST_2] = {emit__LOAD_FAST_2, 24, 0, {0}}, + [_LOAD_FAST_3] = {emit__LOAD_FAST_3, 24, 0, {0}}, + [_LOAD_FAST_4] = {emit__LOAD_FAST_4, 24, 0, {0}}, + [_LOAD_FAST_5] = {emit__LOAD_FAST_5, 24, 0, {0}}, + [_LOAD_FAST_6] = {emit__LOAD_FAST_6, 24, 0, {0}}, + [_LOAD_FAST_7] = {emit__LOAD_FAST_7, 24, 0, {0}}, + [_LOAD_FAST_AND_CLEAR] = {emit__LOAD_FAST_AND_CLEAR, 24, 8, {0}}, + [_LOAD_FAST_CHECK] = {emit__LOAD_FAST_CHECK, 144, 112, {0}}, + [_LOAD_FROM_DICT_OR_DEREF] = {emit__LOAD_FROM_DICT_OR_DEREF, 296, 32, {0}}, + [_LOAD_GLOBAL] = {emit__LOAD_GLOBAL, 104, 16, {0}}, + [_LOAD_GLOBAL_BUILTINS] = {emit__LOAD_GLOBAL_BUILTINS, 72, 8, {0}}, + [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = {emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS, 80, 8, {0}}, + [_LOAD_GLOBAL_MODULE] = {emit__LOAD_GLOBAL_MODULE, 72, 8, {0}}, + [_LOAD_GLOBAL_MODULE_FROM_KEYS] = {emit__LOAD_GLOBAL_MODULE_FROM_KEYS, 80, 8, {0}}, + [_LOAD_LOCALS] = {emit__LOAD_LOCALS, 96, 32, {0}}, + [_LOAD_NAME] = {emit__LOAD_NAME, 88, 16, {0}}, + [_LOAD_SMALL_INT] = {emit__LOAD_SMALL_INT, 40, 16, {0}}, + [_LOAD_SMALL_INT_0] = {emit__LOAD_SMALL_INT_0, 24, 8, {0}}, + [_LOAD_SMALL_INT_1] = {emit__LOAD_SMALL_INT_1, 24, 8, {0}}, + [_LOAD_SMALL_INT_2] = {emit__LOAD_SMALL_INT_2, 24, 8, {0}}, + [_LOAD_SMALL_INT_3] = {emit__LOAD_SMALL_INT_3, 24, 8, {0}}, + [_LOAD_SPECIAL] = {emit__LOAD_SPECIAL, 200, 40, {0}}, + [_LOAD_SUPER_ATTR_ATTR] = {emit__LOAD_SUPER_ATTR_ATTR, 272, 32, {0}}, + [_LOAD_SUPER_ATTR_METHOD] = {emit__LOAD_SUPER_ATTR_METHOD, 368, 40, {0}}, + [_MAKE_CALLARGS_A_TUPLE] = {emit__MAKE_CALLARGS_A_TUPLE, 192, 32, {0}}, + [_MAKE_CELL] = {emit__MAKE_CELL, 136, 24, {0}}, + [_MAKE_FUNCTION] = {emit__MAKE_FUNCTION, 152, 24, {0}}, + [_MAKE_WARM] = {emit__MAKE_WARM, 64, 8, {0}}, + [_MAP_ADD] = {emit__MAP_ADD, 80, 16, {0}}, + [_MATCH_CLASS] = {emit__MATCH_CLASS, 256, 32, {0}}, + [_MATCH_KEYS] = {emit__MATCH_KEYS, 64, 8, {0}}, + [_MATCH_MAPPING] = {emit__MATCH_MAPPING, 48, 16, {0}}, + [_MATCH_SEQUENCE] = {emit__MATCH_SEQUENCE, 48, 16, {0}}, + [_MAYBE_EXPAND_METHOD] = {emit__MAYBE_EXPAND_METHOD, 184, 24, {0}}, + [_MAYBE_EXPAND_METHOD_KW] = {emit__MAYBE_EXPAND_METHOD_KW, 216, 24, {0}}, + [_NOP] = {emit__NOP, 0, 0, {0}}, + [_POP_EXCEPT] = {emit__POP_EXCEPT, 112, 16, {0}}, + [_POP_TOP] = {emit__POP_TOP, 56, 8, {0}}, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = {emit__POP_TOP_LOAD_CONST_INLINE_BORROW, 72, 16, {0}}, + [_PUSH_EXC_INFO] = {emit__PUSH_EXC_INFO, 64, 8, {0}}, + [_PUSH_FRAME] = {emit__PUSH_FRAME, 40, 0, {0}}, + [_PUSH_NULL] = {emit__PUSH_NULL, 8, 0, {0}}, + [_PUSH_NULL_CONDITIONAL] = {emit__PUSH_NULL_CONDITIONAL, 24, 8, {0}}, + [_PY_FRAME_GENERAL] = {emit__PY_FRAME_GENERAL, 176, 16, {0}}, + [_PY_FRAME_KW] = {emit__PY_FRAME_KW, 272, 24, {0}}, + [_REPLACE_WITH_TRUE] = {emit__REPLACE_WITH_TRUE, 80, 16, {0}}, + [_RESUME_CHECK] = {emit__RESUME_CHECK, 32, 0, {0}}, + [_RETURN_GENERATOR] = {emit__RETURN_GENERATOR, 360, 16, {0}}, + [_RETURN_VALUE] = {emit__RETURN_VALUE, 72, 8, {0}}, + [_SAVE_RETURN_OFFSET] = {emit__SAVE_RETURN_OFFSET, 16, 8, {0}}, + [_SEND_GEN_FRAME] = {emit__SEND_GEN_FRAME, 120, 24, {0}}, + [_SETUP_ANNOTATIONS] = {emit__SETUP_ANNOTATIONS, 312, 104, {0}}, + [_SET_ADD] = {emit__SET_ADD, 136, 24, {0}}, + [_SET_FUNCTION_ATTRIBUTE] = {emit__SET_FUNCTION_ATTRIBUTE, 40, 16, {0}}, + [_SET_IP] = {emit__SET_IP, 16, 8, {0}}, + [_SET_UPDATE] = {emit__SET_UPDATE, 136, 24, {0}}, + [_START_EXECUTOR] = {emit__START_EXECUTOR, 80, 8, {0}}, + [_STORE_ATTR] = {emit__STORE_ATTR, 176, 24, {0}}, + [_STORE_ATTR_INSTANCE_VALUE] = {emit__STORE_ATTR_INSTANCE_VALUE, 192, 16, {0}}, + [_STORE_ATTR_SLOT] = {emit__STORE_ATTR_SLOT, 136, 16, {0}}, + [_STORE_ATTR_WITH_HINT] = {emit__STORE_ATTR_WITH_HINT, 264, 32, {0}}, + [_STORE_DEREF] = {emit__STORE_DEREF, 112, 16, {0}}, + [_STORE_FAST] = {emit__STORE_FAST, 96, 16, {0}}, + [_STORE_FAST_0] = {emit__STORE_FAST_0, 88, 8, {0}}, + [_STORE_FAST_1] = {emit__STORE_FAST_1, 88, 8, {0}}, + [_STORE_FAST_2] = {emit__STORE_FAST_2, 88, 8, {0}}, + [_STORE_FAST_3] = {emit__STORE_FAST_3, 88, 8, {0}}, + [_STORE_FAST_4] = {emit__STORE_FAST_4, 88, 8, {0}}, + [_STORE_FAST_5] = {emit__STORE_FAST_5, 88, 8, {0}}, + [_STORE_FAST_6] = {emit__STORE_FAST_6, 88, 8, {0}}, + [_STORE_FAST_7] = {emit__STORE_FAST_7, 88, 8, {0}}, + [_STORE_GLOBAL] = {emit__STORE_GLOBAL, 136, 24, {0}}, + [_STORE_NAME] = {emit__STORE_NAME, 288, 88, {0}}, + [_STORE_SLICE] = {emit__STORE_SLICE, 248, 24, {0}}, + [_STORE_SUBSCR] = {emit__STORE_SUBSCR, 192, 16, {0}}, + [_STORE_SUBSCR_DICT] = {emit__STORE_SUBSCR_DICT, 160, 24, {0}}, + [_STORE_SUBSCR_LIST_INT] = {emit__STORE_SUBSCR_LIST_INT, 272, 40, {0}}, + [_SWAP] = {emit__SWAP, 32, 8, {0}}, + [_TIER2_RESUME_CHECK] = {emit__TIER2_RESUME_CHECK, 16, 0, {0}}, + [_TO_BOOL] = {emit__TO_BOOL, 144, 32, {0}}, + [_TO_BOOL_BOOL] = {emit__TO_BOOL_BOOL, 32, 8, {0}}, + [_TO_BOOL_INT] = {emit__TO_BOOL_INT, 136, 32, {0}}, + [_TO_BOOL_LIST] = {emit__TO_BOOL_LIST, 104, 32, {0}}, + [_TO_BOOL_NONE] = {emit__TO_BOOL_NONE, 40, 16, {0}}, + [_TO_BOOL_STR] = {emit__TO_BOOL_STR, 144, 40, {0}}, + [_UNARY_INVERT] = {emit__UNARY_INVERT, 120, 16, {0}}, + [_UNARY_NEGATIVE] = {emit__UNARY_NEGATIVE, 120, 16, {0}}, + [_UNARY_NOT] = {emit__UNARY_NOT, 32, 16, {0}}, + [_UNPACK_EX] = {emit__UNPACK_EX, 152, 24, {0}}, + [_UNPACK_SEQUENCE] = {emit__UNPACK_SEQUENCE, 152, 24, {0}}, + [_UNPACK_SEQUENCE_LIST] = {emit__UNPACK_SEQUENCE_LIST, 208, 24, {0}}, + [_UNPACK_SEQUENCE_TUPLE] = {emit__UNPACK_SEQUENCE_TUPLE, 208, 24, {0}}, + [_UNPACK_SEQUENCE_TWO_TUPLE] = {emit__UNPACK_SEQUENCE_TWO_TUPLE, 152, 16, {0}}, + [_WITH_EXCEPT_START] = {emit__WITH_EXCEPT_START, 208, 32, {0}}, + [_YIELD_VALUE] = {emit__YIELD_VALUE, 88, 8, {0}}, +}; + +static const void * const symbols_map[1] = { + 0 +}; diff --git a/Tools/jit/stencils/i686-pc-windows-msvc.h b/Tools/jit/stencils/i686-pc-windows-msvc.h new file mode 100644 index 00000000000000..95657406f7d61f --- /dev/null +++ b/Tools/jit/stencils/i686-pc-windows-msvc.h @@ -0,0 +1,25513 @@ +void +emit_shim( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // shim.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: e9 00 00 00 00 jmp 0x5 <__JIT_ENTRY+0x5> + // 00000001: IMAGE_REL_I386_REL32 __JIT_CONTINUE +} + +void +emit__BINARY_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: b9 00 00 00 00 movl $0x0, %ecx + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 c9 movzwl %cx, %ecx + // 1c: 8b 70 f8 movl -0x8(%eax), %esi + // 1f: 8b 58 fc movl -0x4(%eax), %ebx + // 22: 89 47 20 movl %eax, 0x20(%edi) + // 25: 53 pushl %ebx + // 26: 56 pushl %esi + // 27: ff 14 8d 00 00 00 00 calll *(,%ecx,4) + // 0000002a: IMAGE_REL_I386_DIR32 __PyEval_BinaryOps + // 2e: 83 c4 08 addl $0x8, %esp + // 31: 8b 6f 20 movl 0x20(%edi), %ebp + // 34: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 3b: 8b 0e movl (%esi), %ecx + // 3d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 43: 7f 05 jg 0x4a <__JIT_ENTRY+0x4a> + // 45: 49 decl %ecx + // 46: 89 0e movl %ecx, (%esi) + // 48: 74 1e je 0x68 <__JIT_ENTRY+0x68> + // 4a: 8b 0b movl (%ebx), %ecx + // 4c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 52: 7f 2b jg 0x7f <__JIT_ENTRY+0x7f> + // 54: 49 decl %ecx + // 55: 89 0b movl %ecx, (%ebx) + // 57: 75 26 jne 0x7f <__JIT_ENTRY+0x7f> + // 59: 53 pushl %ebx + // 5a: 89 c6 movl %eax, %esi + // 5c: e8 00 00 00 00 calll 0x61 <__JIT_ENTRY+0x61> + // 0000005d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 61: 89 f0 movl %esi, %eax + // 63: 83 c4 04 addl $0x4, %esp + // 66: eb 17 jmp 0x7f <__JIT_ENTRY+0x7f> + // 68: 56 pushl %esi + // 69: 89 c6 movl %eax, %esi + // 6b: e8 00 00 00 00 calll 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 70: 89 f0 movl %esi, %eax + // 72: 83 c4 04 addl $0x4, %esp + // 75: 8b 0b movl (%ebx), %ecx + // 77: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 7d: 7e d5 jle 0x54 <__JIT_ENTRY+0x54> + // 7f: 85 c0 testl %eax, %eax + // 81: 74 21 je 0xa4 <__JIT_ENTRY+0xa4> + // 83: 89 45 f8 movl %eax, -0x8(%ebp) + // 86: 83 c5 fc addl $-0x4, %ebp + // 89: 8b 04 24 movl (%esp), %eax + // 8c: 89 44 24 20 movl %eax, 0x20(%esp) + // 90: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 94: 89 7c 24 18 movl %edi, 0x18(%esp) + // 98: 83 c4 04 addl $0x4, %esp + // 9b: 5e popl %esi + // 9c: 5f popl %edi + // 9d: 5b popl %ebx + // 9e: 5d popl %ebp + // 9f: e9 00 00 00 00 jmp 0xa4 <__JIT_ENTRY+0xa4> + // 000000a0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // a4: 83 c5 f8 addl $-0x8, %ebp + // a7: 8b 04 24 movl (%esp), %eax + // aa: 89 44 24 20 movl %eax, 0x20(%esp) + // ae: 89 7c 24 18 movl %edi, 0x18(%esp) + // b2: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // b6: 83 c4 04 addl $0x4, %esp + // b9: 5e popl %esi + // ba: 5f popl %edi + // bb: 5b popl %ebx + // bc: 5d popl %ebp + // bd: e9 00 00 00 00 jmp 0xc2 <__JIT_ENTRY+0xc2> + // 000000be: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[194] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xc9, 0x8b, 0x70, 0xf8, 0x8b, + 0x58, 0xfc, 0x89, 0x47, 0x20, 0x53, 0x56, 0xff, + 0x14, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x08, 0x8b, 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, + 0x74, 0x1e, 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x2b, 0x49, 0x89, 0x0b, 0x75, + 0x26, 0x53, 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0xeb, 0x17, + 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, 0xd5, 0x85, + 0xc0, 0x74, 0x21, 0x89, 0x45, 0xf8, 0x83, 0xc5, + 0xfc, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, + 0x89, 0x6c, 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc5, 0xf8, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x6c, 0x24, 0x1c, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_32(code + 0x2a, (uintptr_t)&_PyEval_BinaryOps); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xbe, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_ADD_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 7c 24 2c movl 0x2c(%esp), %edi + // b: 8b 74 24 24 movl 0x24(%esp), %esi + // f: 8b 5c 24 28 movl 0x28(%esp), %ebx + // 13: 8b 43 f8 movl -0x8(%ebx), %eax + // 16: 8b 4b fc movl -0x4(%ebx), %ecx + // 19: 8d 6b f8 leal -0x8(%ebx), %ebp + // 1c: f2 0f 10 40 08 movsd 0x8(%eax), %xmm0 + // 21: f2 0f 58 41 08 addsd 0x8(%ecx), %xmm0 + // 26: f2 0f 11 44 24 08 movsd %xmm0, 0x8(%esp) + // 2c: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 30: 89 04 24 movl %eax, (%esp) + // 33: e8 00 00 00 00 calll 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 __PyFloat_FromDouble_ConsumeInputs + // 38: 85 c0 testl %eax, %eax + // 3a: 74 1e je 0x5a <__JIT_ENTRY+0x5a> + // 3c: 83 c3 fc addl $-0x4, %ebx + // 3f: 89 45 00 movl %eax, (%ebp) + // 42: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 46: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 4a: 89 74 24 24 movl %esi, 0x24(%esp) + // 4e: 83 c4 10 addl $0x10, %esp + // 51: 5e popl %esi + // 52: 5f popl %edi + // 53: 5b popl %ebx + // 54: 5d popl %ebp + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5a: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 5e: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 62: 89 74 24 24 movl %esi, 0x24(%esp) + // 66: 83 c4 10 addl $0x10, %esp + // 69: 5e popl %esi + // 6a: 5f popl %edi + // 6b: 5b popl %ebx + // 6c: 5d popl %ebp + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[114] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x7c, 0x24, 0x2c, 0x8b, 0x74, 0x24, 0x24, 0x8b, + 0x5c, 0x24, 0x28, 0x8b, 0x43, 0xf8, 0x8b, 0x4b, + 0xfc, 0x8d, 0x6b, 0xf8, 0xf2, 0x0f, 0x10, 0x40, + 0x08, 0xf2, 0x0f, 0x58, 0x41, 0x08, 0xf2, 0x0f, + 0x11, 0x44, 0x24, 0x08, 0x89, 0x4c, 0x24, 0x04, + 0x89, 0x04, 0x24, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x1e, 0x83, 0xc3, 0xfc, 0x89, + 0x45, 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x5c, + 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x6c, + 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x34, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs + -0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_ADD_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 44 24 1c movl 0x1c(%esp), %eax + // 12: 89 44 24 04 movl %eax, 0x4(%esp) + // 16: 8b 6c 24 20 movl 0x20(%esp), %ebp + // 1a: 8b 7d f8 movl -0x8(%ebp), %edi + // 1d: 8b 5d fc movl -0x4(%ebp), %ebx + // 20: 53 pushl %ebx + // 21: 57 pushl %edi + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __PyLong_Add + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 89 c6 movl %eax, %esi + // 2c: 8b 03 movl (%ebx), %eax + // 2e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 33: 7f 05 jg 0x3a <__JIT_ENTRY+0x3a> + // 35: 48 decl %eax + // 36: 89 03 movl %eax, (%ebx) + // 38: 74 30 je 0x6a <__JIT_ENTRY+0x6a> + // 3a: 8b 07 movl (%edi), %eax + // 3c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 41: 7f 50 jg 0x93 <__JIT_ENTRY+0x93> + // 43: 48 decl %eax + // 44: 89 07 movl %eax, (%edi) + // 46: 75 4b jne 0x93 <__JIT_ENTRY+0x93> + // 48: a1 50 14 00 00 movl 0x1450, %eax + // 00000049: IMAGE_REL_I386_DIR32 __PyRuntime + // 4d: 85 c0 testl %eax, %eax + // 4f: 74 0e je 0x5f <__JIT_ENTRY+0x5f> + // 51: ff 35 54 14 00 00 pushl 0x1454 + // 00000053: IMAGE_REL_I386_DIR32 __PyRuntime + // 57: 6a 01 pushl $0x1 + // 59: 57 pushl %edi + // 5a: ff d0 calll *%eax + // 5c: 83 c4 0c addl $0xc, %esp + // 5f: 57 pushl %edi + // 60: e8 00 00 00 00 calll 0x65 <__JIT_ENTRY+0x65> + // 00000061: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 65: 83 c4 04 addl $0x4, %esp + // 68: eb 29 jmp 0x93 <__JIT_ENTRY+0x93> + // 6a: a1 50 14 00 00 movl 0x1450, %eax + // 0000006b: IMAGE_REL_I386_DIR32 __PyRuntime + // 6f: 85 c0 testl %eax, %eax + // 71: 74 0e je 0x81 <__JIT_ENTRY+0x81> + // 73: ff 35 54 14 00 00 pushl 0x1454 + // 00000075: IMAGE_REL_I386_DIR32 __PyRuntime + // 79: 6a 01 pushl $0x1 + // 7b: 53 pushl %ebx + // 7c: ff d0 calll *%eax + // 7e: 83 c4 0c addl $0xc, %esp + // 81: 53 pushl %ebx + // 82: e8 00 00 00 00 calll 0x87 <__JIT_ENTRY+0x87> + // 00000083: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 07 movl (%edi), %eax + // 8c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 91: 7e b0 jle 0x43 <__JIT_ENTRY+0x43> + // 93: 8d 45 f8 leal -0x8(%ebp), %eax + // 96: 85 f6 testl %esi, %esi + // 98: 74 24 je 0xbe <__JIT_ENTRY+0xbe> + // 9a: 83 c5 fc addl $-0x4, %ebp + // 9d: 89 30 movl %esi, (%eax) + // 9f: 8b 04 24 movl (%esp), %eax + // a2: 89 44 24 24 movl %eax, 0x24(%esp) + // a6: 89 6c 24 20 movl %ebp, 0x20(%esp) + // aa: 8b 44 24 04 movl 0x4(%esp), %eax + // ae: 89 44 24 1c movl %eax, 0x1c(%esp) + // b2: 83 c4 08 addl $0x8, %esp + // b5: 5e popl %esi + // b6: 5f popl %edi + // b7: 5b popl %ebx + // b8: 5d popl %ebp + // b9: e9 00 00 00 00 jmp 0xbe <__JIT_ENTRY+0xbe> + // 000000ba: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // be: 8b 0c 24 movl (%esp), %ecx + // c1: 89 4c 24 24 movl %ecx, 0x24(%esp) + // c5: 89 44 24 20 movl %eax, 0x20(%esp) + // c9: 8b 44 24 04 movl 0x4(%esp), %eax + // cd: 89 44 24 1c movl %eax, 0x1c(%esp) + // d1: 83 c4 08 addl $0x8, %esp + // d4: 5e popl %esi + // d5: 5f popl %edi + // d6: 5b popl %ebx + // d7: 5d popl %ebp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 000000d9: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[221] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x44, + 0x24, 0x1c, 0x89, 0x44, 0x24, 0x04, 0x8b, 0x6c, + 0x24, 0x20, 0x8b, 0x7d, 0xf8, 0x8b, 0x5d, 0xfc, + 0x53, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x89, 0xc6, 0x8b, 0x03, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, 0x03, + 0x74, 0x30, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x50, 0x48, 0x89, 0x07, 0x75, 0x4b, + 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, + 0x01, 0x57, 0xff, 0xd0, 0x83, 0xc4, 0x0c, 0x57, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0xeb, 0x29, 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, + 0x00, 0x6a, 0x01, 0x53, 0xff, 0xd0, 0x83, 0xc4, + 0x0c, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0xb0, 0x8d, 0x45, 0xf8, 0x85, 0xf6, + 0x74, 0x24, 0x83, 0xc5, 0xfc, 0x89, 0x30, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, 0x89, 0x6c, + 0x24, 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, + 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_PyLong_Add + -0x4); + patch_32(code + 0x49, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x53, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x61, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_32(code + 0x6b, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x75, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x83, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xba, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd9, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_UNICODE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 44 24 1c movl 0x1c(%esp), %eax + // 12: 89 44 24 04 movl %eax, 0x4(%esp) + // 16: 8b 6c 24 20 movl 0x20(%esp), %ebp + // 1a: 8b 7d f8 movl -0x8(%ebp), %edi + // 1d: 8b 5d fc movl -0x4(%ebp), %ebx + // 20: 53 pushl %ebx + // 21: 57 pushl %edi + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 _PyUnicode_Concat + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 89 c6 movl %eax, %esi + // 2c: 8b 03 movl (%ebx), %eax + // 2e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 33: 7f 05 jg 0x3a <__JIT_ENTRY+0x3a> + // 35: 48 decl %eax + // 36: 89 03 movl %eax, (%ebx) + // 38: 74 30 je 0x6a <__JIT_ENTRY+0x6a> + // 3a: 8b 07 movl (%edi), %eax + // 3c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 41: 7f 50 jg 0x93 <__JIT_ENTRY+0x93> + // 43: 48 decl %eax + // 44: 89 07 movl %eax, (%edi) + // 46: 75 4b jne 0x93 <__JIT_ENTRY+0x93> + // 48: a1 50 14 00 00 movl 0x1450, %eax + // 00000049: IMAGE_REL_I386_DIR32 __PyRuntime + // 4d: 85 c0 testl %eax, %eax + // 4f: 74 0e je 0x5f <__JIT_ENTRY+0x5f> + // 51: ff 35 54 14 00 00 pushl 0x1454 + // 00000053: IMAGE_REL_I386_DIR32 __PyRuntime + // 57: 6a 01 pushl $0x1 + // 59: 57 pushl %edi + // 5a: ff d0 calll *%eax + // 5c: 83 c4 0c addl $0xc, %esp + // 5f: 57 pushl %edi + // 60: e8 00 00 00 00 calll 0x65 <__JIT_ENTRY+0x65> + // 00000061: IMAGE_REL_I386_REL32 __PyUnicode_ExactDealloc + // 65: 83 c4 04 addl $0x4, %esp + // 68: eb 29 jmp 0x93 <__JIT_ENTRY+0x93> + // 6a: a1 50 14 00 00 movl 0x1450, %eax + // 0000006b: IMAGE_REL_I386_DIR32 __PyRuntime + // 6f: 85 c0 testl %eax, %eax + // 71: 74 0e je 0x81 <__JIT_ENTRY+0x81> + // 73: ff 35 54 14 00 00 pushl 0x1454 + // 00000075: IMAGE_REL_I386_DIR32 __PyRuntime + // 79: 6a 01 pushl $0x1 + // 7b: 53 pushl %ebx + // 7c: ff d0 calll *%eax + // 7e: 83 c4 0c addl $0xc, %esp + // 81: 53 pushl %ebx + // 82: e8 00 00 00 00 calll 0x87 <__JIT_ENTRY+0x87> + // 00000083: IMAGE_REL_I386_REL32 __PyUnicode_ExactDealloc + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 07 movl (%edi), %eax + // 8c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 91: 7e b0 jle 0x43 <__JIT_ENTRY+0x43> + // 93: 8d 45 f8 leal -0x8(%ebp), %eax + // 96: 85 f6 testl %esi, %esi + // 98: 74 24 je 0xbe <__JIT_ENTRY+0xbe> + // 9a: 83 c5 fc addl $-0x4, %ebp + // 9d: 89 30 movl %esi, (%eax) + // 9f: 8b 04 24 movl (%esp), %eax + // a2: 89 44 24 24 movl %eax, 0x24(%esp) + // a6: 89 6c 24 20 movl %ebp, 0x20(%esp) + // aa: 8b 44 24 04 movl 0x4(%esp), %eax + // ae: 89 44 24 1c movl %eax, 0x1c(%esp) + // b2: 83 c4 08 addl $0x8, %esp + // b5: 5e popl %esi + // b6: 5f popl %edi + // b7: 5b popl %ebx + // b8: 5d popl %ebp + // b9: e9 00 00 00 00 jmp 0xbe <__JIT_ENTRY+0xbe> + // 000000ba: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // be: 8b 0c 24 movl (%esp), %ecx + // c1: 89 4c 24 24 movl %ecx, 0x24(%esp) + // c5: 89 44 24 20 movl %eax, 0x20(%esp) + // c9: 8b 44 24 04 movl 0x4(%esp), %eax + // cd: 89 44 24 1c movl %eax, 0x1c(%esp) + // d1: 83 c4 08 addl $0x8, %esp + // d4: 5e popl %esi + // d5: 5f popl %edi + // d6: 5b popl %ebx + // d7: 5d popl %ebp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 000000d9: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[221] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x44, + 0x24, 0x1c, 0x89, 0x44, 0x24, 0x04, 0x8b, 0x6c, + 0x24, 0x20, 0x8b, 0x7d, 0xf8, 0x8b, 0x5d, 0xfc, + 0x53, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x89, 0xc6, 0x8b, 0x03, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, 0x03, + 0x74, 0x30, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x50, 0x48, 0x89, 0x07, 0x75, 0x4b, + 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, + 0x01, 0x57, 0xff, 0xd0, 0x83, 0xc4, 0x0c, 0x57, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0xeb, 0x29, 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, + 0x00, 0x6a, 0x01, 0x53, 0xff, 0xd0, 0x83, 0xc4, + 0x0c, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0xb0, 0x8d, 0x45, 0xf8, 0x85, 0xf6, + 0x74, 0x24, 0x83, 0xc5, 0xfc, 0x89, 0x30, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, 0x89, 0x6c, + 0x24, 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, + 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&PyUnicode_Concat + -0x4); + patch_32(code + 0x49, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x53, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x61, (uintptr_t)&_PyUnicode_ExactDealloc + -0x4); + patch_32(code + 0x6b, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x75, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x83, (uintptr_t)&_PyUnicode_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xba, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd9, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_EXTEND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: 8b 70 f8 movl -0x8(%eax), %esi + // 17: 8b 68 fc movl -0x4(%eax), %ebp + // 1a: 89 47 20 movl %eax, 0x20(%edi) + // 1d: 55 pushl %ebp + // 1e: 56 pushl %esi + // 1f: ff 15 08 00 00 00 calll *0x8 + // 00000021: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 25: 83 c4 08 addl $0x8, %esp + // 28: 8b 5f 20 movl 0x20(%edi), %ebx + // 2b: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 32: 8b 0e movl (%esi), %ecx + // 34: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3a: 7f 05 jg 0x41 <__JIT_ENTRY+0x41> + // 3c: 49 decl %ecx + // 3d: 89 0e movl %ecx, (%esi) + // 3f: 74 20 je 0x61 <__JIT_ENTRY+0x61> + // 41: 8b 4d 00 movl (%ebp), %ecx + // 44: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4a: 7f 2d jg 0x79 <__JIT_ENTRY+0x79> + // 4c: 49 decl %ecx + // 4d: 89 4d 00 movl %ecx, (%ebp) + // 50: 75 27 jne 0x79 <__JIT_ENTRY+0x79> + // 52: 55 pushl %ebp + // 53: 89 c6 movl %eax, %esi + // 55: e8 00 00 00 00 calll 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5a: 89 f0 movl %esi, %eax + // 5c: 83 c4 04 addl $0x4, %esp + // 5f: eb 18 jmp 0x79 <__JIT_ENTRY+0x79> + // 61: 56 pushl %esi + // 62: 89 c6 movl %eax, %esi + // 64: e8 00 00 00 00 calll 0x69 <__JIT_ENTRY+0x69> + // 00000065: IMAGE_REL_I386_REL32 __Py_Dealloc + // 69: 89 f0 movl %esi, %eax + // 6b: 83 c4 04 addl $0x4, %esp + // 6e: 8b 4d 00 movl (%ebp), %ecx + // 71: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 77: 7e d3 jle 0x4c <__JIT_ENTRY+0x4c> + // 79: 89 43 f8 movl %eax, -0x8(%ebx) + // 7c: 83 c3 fc addl $-0x4, %ebx + // 7f: 8b 04 24 movl (%esp), %eax + // 82: 89 44 24 20 movl %eax, 0x20(%esp) + // 86: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 8a: 89 7c 24 18 movl %edi, 0x18(%esp) + // 8e: 83 c4 04 addl $0x4, %esp + // 91: 5e popl %esi + // 92: 5f popl %edi + // 93: 5b popl %ebx + // 94: 5d popl %ebp + // 95: e9 00 00 00 00 jmp 0x9a <__JIT_ENTRY+0x9a> + // 00000096: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[149] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x70, 0xf8, 0x8b, + 0x68, 0xfc, 0x89, 0x47, 0x20, 0x55, 0x56, 0xff, + 0x15, 0x08, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x8b, 0x5f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, 0x74, + 0x20, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x2d, 0x49, 0x89, 0x4d, 0x00, + 0x75, 0x27, 0x55, 0x89, 0xc6, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0xeb, + 0x18, 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x8b, 0x4d, + 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, + 0xd3, 0x89, 0x43, 0xf8, 0x83, 0xc3, 0xfc, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x5c, + 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x21, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_x86_64_32rx(code + 0x56, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x65, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__BINARY_OP_INPLACE_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_INPLACE_ADD_UNICODE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 5c 24 24 movl 0x24(%esp), %ebx + // b: 8b 74 24 20 movl 0x20(%esp), %esi + // f: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 13: 8b 6e f8 movl -0x8(%esi), %ebp + // 16: b8 00 00 00 00 movl $0x0, %eax + // 00000017: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1b: 39 6c 87 28 cmpl %ebp, 0x28(%edi,%eax,4) + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 89 5c 24 24 movl %ebx, 0x24(%esp) + // 25: 89 74 24 20 movl %esi, 0x20(%esp) + // 29: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 2d: 83 c4 08 addl $0x8, %esp + // 30: 5e popl %esi + // 31: 5f popl %edi + // 32: 5b popl %ebx + // 33: 5d popl %ebp + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 00000035: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 39: 8b 4e fc movl -0x4(%esi), %ecx + // 3c: 8b 45 00 movl (%ebp), %eax + // 3f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 44: 89 0c 24 movl %ecx, (%esp) + // 47: 7f 29 jg 0x72 <__JIT_ENTRY+0x72> + // 49: 48 decl %eax + // 4a: 89 45 00 movl %eax, (%ebp) + // 4d: 75 23 jne 0x72 <__JIT_ENTRY+0x72> + // 4f: a1 50 14 00 00 movl 0x1450, %eax + // 00000050: IMAGE_REL_I386_DIR32 __PyRuntime + // 54: 85 c0 testl %eax, %eax + // 56: 74 0e je 0x66 <__JIT_ENTRY+0x66> + // 58: ff 35 54 14 00 00 pushl 0x1454 + // 0000005a: IMAGE_REL_I386_DIR32 __PyRuntime + // 5e: 6a 01 pushl $0x1 + // 60: 55 pushl %ebp + // 61: ff d0 calll *%eax + // 63: 83 c4 0c addl $0xc, %esp + // 66: 55 pushl %ebp + // 67: e8 00 00 00 00 calll 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __PyUnicode_ExactDealloc + // 6c: 83 c4 04 addl $0x4, %esp + // 6f: 8b 0c 24 movl (%esp), %ecx + // 72: bd 00 00 00 00 movl $0x0, %ebp + // 00000073: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 77: 8b 44 af 28 movl 0x28(%edi,%ebp,4), %eax + // 7b: 89 44 24 04 movl %eax, 0x4(%esp) + // 7f: 8d 44 24 04 leal 0x4(%esp), %eax + // 83: 51 pushl %ecx + // 84: 50 pushl %eax + // 85: e8 00 00 00 00 calll 0x8a <__JIT_ENTRY+0x8a> + // 00000086: IMAGE_REL_I386_REL32 _PyUnicode_Append + // 8a: 8b 54 24 08 movl 0x8(%esp), %edx + // 8e: 83 c4 08 addl $0x8, %esp + // 91: 8b 44 24 04 movl 0x4(%esp), %eax + // 95: 89 44 af 28 movl %eax, 0x28(%edi,%ebp,4) + // 99: 8b 0a movl (%edx), %ecx + // 9b: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a1: 7f 32 jg 0xd5 <__JIT_ENTRY+0xd5> + // a3: 49 decl %ecx + // a4: 89 0a movl %ecx, (%edx) + // a6: 75 24 jne 0xcc <__JIT_ENTRY+0xcc> + // a8: a1 50 14 00 00 movl 0x1450, %eax + // 000000a9: IMAGE_REL_I386_DIR32 __PyRuntime + // ad: 85 c0 testl %eax, %eax + // af: 74 12 je 0xc3 <__JIT_ENTRY+0xc3> + // b1: ff 35 54 14 00 00 pushl 0x1454 + // 000000b3: IMAGE_REL_I386_DIR32 __PyRuntime + // b7: 6a 01 pushl $0x1 + // b9: 52 pushl %edx + // ba: ff d0 calll *%eax + // bc: 8b 54 24 0c movl 0xc(%esp), %edx + // c0: 83 c4 0c addl $0xc, %esp + // c3: 52 pushl %edx + // c4: e8 00 00 00 00 calll 0xc9 <__JIT_ENTRY+0xc9> + // 000000c5: IMAGE_REL_I386_REL32 __PyUnicode_ExactDealloc + // c9: 83 c4 04 addl $0x4, %esp + // cc: b8 00 00 00 00 movl $0x0, %eax + // 000000cd: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // d1: 8b 44 87 28 movl 0x28(%edi,%eax,4), %eax + // d5: 83 c6 f8 addl $-0x8, %esi + // d8: 85 c0 testl %eax, %eax + // da: 74 18 je 0xf4 <__JIT_ENTRY+0xf4> + // dc: 89 7c 24 1c movl %edi, 0x1c(%esp) + // e0: 89 74 24 20 movl %esi, 0x20(%esp) + // e4: 89 5c 24 24 movl %ebx, 0x24(%esp) + // e8: 83 c4 08 addl $0x8, %esp + // eb: 5e popl %esi + // ec: 5f popl %edi + // ed: 5b popl %ebx + // ee: 5d popl %ebp + // ef: e9 00 00 00 00 jmp 0xf4 <__JIT_ENTRY+0xf4> + // 000000f0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // f4: 89 5c 24 24 movl %ebx, 0x24(%esp) + // f8: 89 74 24 20 movl %esi, 0x20(%esp) + // fc: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 100: 83 c4 08 addl $0x8, %esp + // 103: 5e popl %esi + // 104: 5f popl %edi + // 105: 5b popl %ebx + // 106: 5d popl %ebp + // 107: e9 00 00 00 00 jmp 0x10c <__JIT_ENTRY+0x10c> + // 00000108: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[268] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x5c, 0x24, 0x24, 0x8b, 0x74, 0x24, 0x20, 0x8b, + 0x7c, 0x24, 0x1c, 0x8b, 0x6e, 0xf8, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0x39, 0x6c, 0x87, 0x28, 0x74, + 0x18, 0x89, 0x5c, 0x24, 0x24, 0x89, 0x74, 0x24, + 0x20, 0x89, 0x7c, 0x24, 0x1c, 0x83, 0xc4, 0x08, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4e, 0xfc, 0x8b, 0x45, 0x00, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x89, 0x0c, 0x24, 0x7f, + 0x29, 0x48, 0x89, 0x45, 0x00, 0x75, 0x23, 0xa1, + 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x0e, + 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, 0x01, + 0x55, 0xff, 0xd0, 0x83, 0xc4, 0x0c, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x0c, 0x24, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x44, 0xaf, 0x28, 0x89, 0x44, 0x24, 0x04, 0x8d, + 0x44, 0x24, 0x04, 0x51, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x54, 0x24, 0x08, 0x83, 0xc4, + 0x08, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0xaf, + 0x28, 0x8b, 0x0a, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x32, 0x49, 0x89, 0x0a, 0x75, 0x24, + 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x12, 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, + 0x01, 0x52, 0xff, 0xd0, 0x8b, 0x54, 0x24, 0x0c, + 0x83, 0xc4, 0x0c, 0x52, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x44, 0x87, 0x28, 0x83, 0xc6, 0xf8, + 0x85, 0xc0, 0x74, 0x18, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x74, 0x24, 0x20, 0x89, 0x5c, 0x24, 0x24, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x5c, 0x24, 0x24, + 0x89, 0x74, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x1c, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x35, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x50, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x5a, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x68, (uintptr_t)&_PyUnicode_ExactDealloc + -0x4); + patch_32(code + 0x73, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x86, (uintptr_t)&PyUnicode_Append + -0x4); + patch_32(code + 0xa9, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0xb3, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)&_PyUnicode_ExactDealloc + -0x4); + patch_32(code + 0xcd, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0xf0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x108, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_MULTIPLY_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 7c 24 2c movl 0x2c(%esp), %edi + // b: 8b 74 24 24 movl 0x24(%esp), %esi + // f: 8b 5c 24 28 movl 0x28(%esp), %ebx + // 13: 8b 43 f8 movl -0x8(%ebx), %eax + // 16: 8b 4b fc movl -0x4(%ebx), %ecx + // 19: 8d 6b f8 leal -0x8(%ebx), %ebp + // 1c: f2 0f 10 40 08 movsd 0x8(%eax), %xmm0 + // 21: f2 0f 59 41 08 mulsd 0x8(%ecx), %xmm0 + // 26: f2 0f 11 44 24 08 movsd %xmm0, 0x8(%esp) + // 2c: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 30: 89 04 24 movl %eax, (%esp) + // 33: e8 00 00 00 00 calll 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 __PyFloat_FromDouble_ConsumeInputs + // 38: 85 c0 testl %eax, %eax + // 3a: 74 1e je 0x5a <__JIT_ENTRY+0x5a> + // 3c: 83 c3 fc addl $-0x4, %ebx + // 3f: 89 45 00 movl %eax, (%ebp) + // 42: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 46: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 4a: 89 74 24 24 movl %esi, 0x24(%esp) + // 4e: 83 c4 10 addl $0x10, %esp + // 51: 5e popl %esi + // 52: 5f popl %edi + // 53: 5b popl %ebx + // 54: 5d popl %ebp + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5a: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 5e: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 62: 89 74 24 24 movl %esi, 0x24(%esp) + // 66: 83 c4 10 addl $0x10, %esp + // 69: 5e popl %esi + // 6a: 5f popl %edi + // 6b: 5b popl %ebx + // 6c: 5d popl %ebp + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[114] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x7c, 0x24, 0x2c, 0x8b, 0x74, 0x24, 0x24, 0x8b, + 0x5c, 0x24, 0x28, 0x8b, 0x43, 0xf8, 0x8b, 0x4b, + 0xfc, 0x8d, 0x6b, 0xf8, 0xf2, 0x0f, 0x10, 0x40, + 0x08, 0xf2, 0x0f, 0x59, 0x41, 0x08, 0xf2, 0x0f, + 0x11, 0x44, 0x24, 0x08, 0x89, 0x4c, 0x24, 0x04, + 0x89, 0x04, 0x24, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x1e, 0x83, 0xc3, 0xfc, 0x89, + 0x45, 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x5c, + 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x6c, + 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x34, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs + -0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_MULTIPLY_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 44 24 1c movl 0x1c(%esp), %eax + // 12: 89 44 24 04 movl %eax, 0x4(%esp) + // 16: 8b 6c 24 20 movl 0x20(%esp), %ebp + // 1a: 8b 7d f8 movl -0x8(%ebp), %edi + // 1d: 8b 5d fc movl -0x4(%ebp), %ebx + // 20: 53 pushl %ebx + // 21: 57 pushl %edi + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __PyLong_Multiply + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 89 c6 movl %eax, %esi + // 2c: 8b 03 movl (%ebx), %eax + // 2e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 33: 7f 05 jg 0x3a <__JIT_ENTRY+0x3a> + // 35: 48 decl %eax + // 36: 89 03 movl %eax, (%ebx) + // 38: 74 30 je 0x6a <__JIT_ENTRY+0x6a> + // 3a: 8b 07 movl (%edi), %eax + // 3c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 41: 7f 50 jg 0x93 <__JIT_ENTRY+0x93> + // 43: 48 decl %eax + // 44: 89 07 movl %eax, (%edi) + // 46: 75 4b jne 0x93 <__JIT_ENTRY+0x93> + // 48: a1 50 14 00 00 movl 0x1450, %eax + // 00000049: IMAGE_REL_I386_DIR32 __PyRuntime + // 4d: 85 c0 testl %eax, %eax + // 4f: 74 0e je 0x5f <__JIT_ENTRY+0x5f> + // 51: ff 35 54 14 00 00 pushl 0x1454 + // 00000053: IMAGE_REL_I386_DIR32 __PyRuntime + // 57: 6a 01 pushl $0x1 + // 59: 57 pushl %edi + // 5a: ff d0 calll *%eax + // 5c: 83 c4 0c addl $0xc, %esp + // 5f: 57 pushl %edi + // 60: e8 00 00 00 00 calll 0x65 <__JIT_ENTRY+0x65> + // 00000061: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 65: 83 c4 04 addl $0x4, %esp + // 68: eb 29 jmp 0x93 <__JIT_ENTRY+0x93> + // 6a: a1 50 14 00 00 movl 0x1450, %eax + // 0000006b: IMAGE_REL_I386_DIR32 __PyRuntime + // 6f: 85 c0 testl %eax, %eax + // 71: 74 0e je 0x81 <__JIT_ENTRY+0x81> + // 73: ff 35 54 14 00 00 pushl 0x1454 + // 00000075: IMAGE_REL_I386_DIR32 __PyRuntime + // 79: 6a 01 pushl $0x1 + // 7b: 53 pushl %ebx + // 7c: ff d0 calll *%eax + // 7e: 83 c4 0c addl $0xc, %esp + // 81: 53 pushl %ebx + // 82: e8 00 00 00 00 calll 0x87 <__JIT_ENTRY+0x87> + // 00000083: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 07 movl (%edi), %eax + // 8c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 91: 7e b0 jle 0x43 <__JIT_ENTRY+0x43> + // 93: 8d 45 f8 leal -0x8(%ebp), %eax + // 96: 85 f6 testl %esi, %esi + // 98: 74 24 je 0xbe <__JIT_ENTRY+0xbe> + // 9a: 83 c5 fc addl $-0x4, %ebp + // 9d: 89 30 movl %esi, (%eax) + // 9f: 8b 04 24 movl (%esp), %eax + // a2: 89 44 24 24 movl %eax, 0x24(%esp) + // a6: 89 6c 24 20 movl %ebp, 0x20(%esp) + // aa: 8b 44 24 04 movl 0x4(%esp), %eax + // ae: 89 44 24 1c movl %eax, 0x1c(%esp) + // b2: 83 c4 08 addl $0x8, %esp + // b5: 5e popl %esi + // b6: 5f popl %edi + // b7: 5b popl %ebx + // b8: 5d popl %ebp + // b9: e9 00 00 00 00 jmp 0xbe <__JIT_ENTRY+0xbe> + // 000000ba: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // be: 8b 0c 24 movl (%esp), %ecx + // c1: 89 4c 24 24 movl %ecx, 0x24(%esp) + // c5: 89 44 24 20 movl %eax, 0x20(%esp) + // c9: 8b 44 24 04 movl 0x4(%esp), %eax + // cd: 89 44 24 1c movl %eax, 0x1c(%esp) + // d1: 83 c4 08 addl $0x8, %esp + // d4: 5e popl %esi + // d5: 5f popl %edi + // d6: 5b popl %ebx + // d7: 5d popl %ebp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 000000d9: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[221] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x44, + 0x24, 0x1c, 0x89, 0x44, 0x24, 0x04, 0x8b, 0x6c, + 0x24, 0x20, 0x8b, 0x7d, 0xf8, 0x8b, 0x5d, 0xfc, + 0x53, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x89, 0xc6, 0x8b, 0x03, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, 0x03, + 0x74, 0x30, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x50, 0x48, 0x89, 0x07, 0x75, 0x4b, + 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, + 0x01, 0x57, 0xff, 0xd0, 0x83, 0xc4, 0x0c, 0x57, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0xeb, 0x29, 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, + 0x00, 0x6a, 0x01, 0x53, 0xff, 0xd0, 0x83, 0xc4, + 0x0c, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0xb0, 0x8d, 0x45, 0xf8, 0x85, 0xf6, + 0x74, 0x24, 0x83, 0xc5, 0xfc, 0x89, 0x30, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, 0x89, 0x6c, + 0x24, 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, + 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_PyLong_Multiply + -0x4); + patch_32(code + 0x49, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x53, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x61, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_32(code + 0x6b, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x75, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x83, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xba, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd9, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_CHECK_FUNC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_CHECK_FUNC.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 54 24 1c movl 0x1c(%esp), %edx + // 8: 8b 4c 24 18 movl 0x18(%esp), %ecx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 71 f8 movl -0x8(%ecx), %esi + // 13: 8b 7e 04 movl 0x4(%esi), %edi + // 16: f6 47 55 02 testb $0x2, 0x55(%edi) + // 1a: 74 59 je 0x75 <__JIT_ENTRY+0x75> + // 1c: 8b b7 c8 01 00 00 movl 0x1c8(%edi), %esi + // 22: 85 f6 testl %esi, %esi + // 24: 74 4f je 0x75 <__JIT_ENTRY+0x75> + // 26: 8b 5e 48 movl 0x48(%esi), %ebx + // 29: 3b 9f cc 01 00 00 cmpl 0x1cc(%edi), %ebx + // 2f: 75 44 jne 0x75 <__JIT_ENTRY+0x75> + // 31: 8b ba 94 00 00 00 movl 0x94(%edx), %edi + // 37: 85 ff testl %edi, %edi + // 39: 74 3a je 0x75 <__JIT_ENTRY+0x75> + // 3b: 8b 5e 18 movl 0x18(%esi), %ebx + // 3e: 8b aa 98 00 00 00 movl 0x98(%edx), %ebp + // 44: 29 fd subl %edi, %ebp + // 46: c1 fd 02 sarl $0x2, %ebp + // 49: 3b 6b 34 cmpl 0x34(%ebx), %ebp + // 4c: 7e 27 jle 0x75 <__JIT_ENTRY+0x75> + // 4e: 8b 3e movl (%esi), %edi + // 50: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 56: 7f 03 jg 0x5b <__JIT_ENTRY+0x5b> + // 58: 47 incl %edi + // 59: 89 3e movl %edi, (%esi) + // 5b: 89 31 movl %esi, (%ecx) + // 5d: 83 c1 04 addl $0x4, %ecx + // 60: 89 54 24 1c movl %edx, 0x1c(%esp) + // 64: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 68: 89 44 24 14 movl %eax, 0x14(%esp) + // 6c: 5e popl %esi + // 6d: 5f popl %edi + // 6e: 5b popl %ebx + // 6f: 5d popl %ebp + // 70: e9 00 00 00 00 jmp 0x75 <__JIT_ENTRY+0x75> + // 00000071: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 75: 89 54 24 1c movl %edx, 0x1c(%esp) + // 79: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 7d: 89 44 24 14 movl %eax, 0x14(%esp) + // 81: 5e popl %esi + // 82: 5f popl %edi + // 83: 5b popl %ebx + // 84: 5d popl %ebp + // 85: e9 00 00 00 00 jmp 0x8a <__JIT_ENTRY+0x8a> + // 00000086: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[138] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x54, 0x24, 0x1c, + 0x8b, 0x4c, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x71, 0xf8, 0x8b, 0x7e, 0x04, 0xf6, 0x47, + 0x55, 0x02, 0x74, 0x59, 0x8b, 0xb7, 0xc8, 0x01, + 0x00, 0x00, 0x85, 0xf6, 0x74, 0x4f, 0x8b, 0x5e, + 0x48, 0x3b, 0x9f, 0xcc, 0x01, 0x00, 0x00, 0x75, + 0x44, 0x8b, 0xba, 0x94, 0x00, 0x00, 0x00, 0x85, + 0xff, 0x74, 0x3a, 0x8b, 0x5e, 0x18, 0x8b, 0xaa, + 0x98, 0x00, 0x00, 0x00, 0x29, 0xfd, 0xc1, 0xfd, + 0x02, 0x3b, 0x6b, 0x34, 0x7e, 0x27, 0x8b, 0x3e, + 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x47, 0x89, 0x3e, 0x89, 0x31, 0x83, 0xc1, 0x04, + 0x89, 0x54, 0x24, 0x1c, 0x89, 0x4c, 0x24, 0x18, + 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x1c, 0x89, 0x4c, 0x24, 0x18, 0x89, 0x44, 0x24, + 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x71, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x86, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 4c 24 24 movl 0x24(%esp), %ecx + // b: 8b 44 24 20 movl 0x20(%esp), %eax + // f: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 13: 8b 78 f8 movl -0x8(%eax), %edi + // 16: 81 7f 04 00 00 00 00 cmpl $0x0, 0x4(%edi) + // 00000019: IMAGE_REL_I386_DIR32 _PyDict_Type + // 1d: 74 18 je 0x37 <__JIT_ENTRY+0x37> + // 1f: 89 4c 24 24 movl %ecx, 0x24(%esp) + // 23: 89 44 24 20 movl %eax, 0x20(%esp) + // 27: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 2b: 83 c4 08 addl $0x8, %esp + // 2e: 5e popl %esi + // 2f: 5f popl %edi + // 30: 5b popl %ebx + // 31: 5d popl %ebp + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 37: 89 0c 24 movl %ecx, (%esp) + // 3a: 8b 70 fc movl -0x4(%eax), %esi + // 3d: 89 43 20 movl %eax, 0x20(%ebx) + // 40: 8d 44 24 04 leal 0x4(%esp), %eax + // 44: 50 pushl %eax + // 45: 56 pushl %esi + // 46: 57 pushl %edi + // 47: e8 00 00 00 00 calll 0x4c <__JIT_ENTRY+0x4c> + // 00000048: IMAGE_REL_I386_REL32 _PyDict_GetItemRef + // 4c: 83 c4 0c addl $0xc, %esp + // 4f: 8b 6b 20 movl 0x20(%ebx), %ebp + // 52: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // 59: 85 c0 testl %eax, %eax + // 5b: 74 0c je 0x69 <__JIT_ENTRY+0x69> + // 5d: 8b 0f movl (%edi), %ecx + // 5f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 65: 7e 26 jle 0x8d <__JIT_ENTRY+0x8d> + // 67: eb 36 jmp 0x9f <__JIT_ENTRY+0x9f> + // 69: 89 6b 20 movl %ebp, 0x20(%ebx) + // 6c: 56 pushl %esi + // 6d: 89 c5 movl %eax, %ebp + // 6f: e8 00 00 00 00 calll 0x74 <__JIT_ENTRY+0x74> + // 00000070: IMAGE_REL_I386_REL32 __PyErr_SetKeyError + // 74: 89 e8 movl %ebp, %eax + // 76: 83 c4 04 addl $0x4, %esp + // 79: 8b 6b 20 movl 0x20(%ebx), %ebp + // 7c: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // 83: 8b 0f movl (%edi), %ecx + // 85: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 8b: 7f 12 jg 0x9f <__JIT_ENTRY+0x9f> + // 8d: 49 decl %ecx + // 8e: 89 0f movl %ecx, (%edi) + // 90: 75 0d jne 0x9f <__JIT_ENTRY+0x9f> + // 92: 57 pushl %edi + // 93: 89 c7 movl %eax, %edi + // 95: e8 00 00 00 00 calll 0x9a <__JIT_ENTRY+0x9a> + // 00000096: IMAGE_REL_I386_REL32 __Py_Dealloc + // 9a: 89 f8 movl %edi, %eax + // 9c: 83 c4 04 addl $0x4, %esp + // 9f: 8b 0e movl (%esi), %ecx + // a1: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a7: 7f 05 jg 0xae <__JIT_ENTRY+0xae> + // a9: 49 decl %ecx + // aa: 89 0e movl %ecx, (%esi) + // ac: 74 29 je 0xd7 <__JIT_ENTRY+0xd7> + // ae: 85 c0 testl %eax, %eax + // b0: 7e 36 jle 0xe8 <__JIT_ENTRY+0xe8> + // b2: 8b 44 24 04 movl 0x4(%esp), %eax + // b6: 89 45 f8 movl %eax, -0x8(%ebp) + // b9: 83 c5 fc addl $-0x4, %ebp + // bc: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // c0: 89 6c 24 20 movl %ebp, 0x20(%esp) + // c4: 8b 04 24 movl (%esp), %eax + // c7: 89 44 24 24 movl %eax, 0x24(%esp) + // cb: 83 c4 08 addl $0x8, %esp + // ce: 5e popl %esi + // cf: 5f popl %edi + // d0: 5b popl %ebx + // d1: 5d popl %ebp + // d2: e9 00 00 00 00 jmp 0xd7 <__JIT_ENTRY+0xd7> + // 000000d3: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // d7: 56 pushl %esi + // d8: 89 c6 movl %eax, %esi + // da: e8 00 00 00 00 calll 0xdf <__JIT_ENTRY+0xdf> + // 000000db: IMAGE_REL_I386_REL32 __Py_Dealloc + // df: 89 f0 movl %esi, %eax + // e1: 83 c4 04 addl $0x4, %esp + // e4: 85 c0 testl %eax, %eax + // e6: 7f ca jg 0xb2 <__JIT_ENTRY+0xb2> + // e8: 83 c5 f8 addl $-0x8, %ebp + // eb: 8b 04 24 movl (%esp), %eax + // ee: 89 44 24 24 movl %eax, 0x24(%esp) + // f2: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // f6: 89 6c 24 20 movl %ebp, 0x20(%esp) + // fa: 83 c4 08 addl $0x8, %esp + // fd: 5e popl %esi + // fe: 5f popl %edi + // ff: 5b popl %ebx + // 100: 5d popl %ebp + // 101: e9 00 00 00 00 jmp 0x106 <__JIT_ENTRY+0x106> + // 00000102: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[262] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x4c, 0x24, 0x24, 0x8b, 0x44, 0x24, 0x20, 0x8b, + 0x5c, 0x24, 0x1c, 0x8b, 0x78, 0xf8, 0x81, 0x7f, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, 0x18, 0x89, + 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, + 0x5c, 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x0c, 0x24, 0x8b, 0x70, 0xfc, 0x89, 0x43, 0x20, + 0x8d, 0x44, 0x24, 0x04, 0x50, 0x56, 0x57, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, + 0x6b, 0x20, 0xc7, 0x43, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x74, 0x0c, 0x8b, 0x0f, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, 0x26, 0xeb, + 0x36, 0x89, 0x6b, 0x20, 0x56, 0x89, 0xc5, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xe8, 0x83, 0xc4, + 0x04, 0x8b, 0x6b, 0x20, 0xc7, 0x43, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0f, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x0f, + 0x75, 0x0d, 0x57, 0x89, 0xc7, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf8, 0x83, 0xc4, 0x04, 0x8b, + 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x05, 0x49, 0x89, 0x0e, 0x74, 0x29, 0x85, 0xc0, + 0x7e, 0x36, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x45, + 0xf8, 0x83, 0xc5, 0xfc, 0x89, 0x5c, 0x24, 0x1c, + 0x89, 0x6c, 0x24, 0x20, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x24, 0x83, 0xc4, 0x08, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x56, + 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x7f, 0xca, + 0x83, 0xc5, 0xf8, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x24, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x6c, + 0x24, 0x20, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyDict_Type); + patch_x86_64_32rx(code + 0x33, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)&PyDict_GetItemRef + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)&_PyErr_SetKeyError + -0x4); + patch_x86_64_32rx(code + 0x96, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x102, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_INIT_CALL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_INIT_CALL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // 8: 8b 54 24 18 movl 0x18(%esp), %edx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 5a fc movl -0x4(%edx), %ebx + // 13: f2 0f 10 42 f4 movsd -0xc(%edx), %xmm0 + // 18: 8b 7b 18 movl 0x18(%ebx), %edi + // 1b: 8b b1 94 00 00 00 movl 0x94(%ecx), %esi + // 21: 8b 6f 34 movl 0x34(%edi), %ebp + // 24: 8d 2c ae leal (%esi,%ebp,4), %ebp + // 27: 89 a9 94 00 00 00 movl %ebp, 0x94(%ecx) + // 2d: 89 46 04 movl %eax, 0x4(%esi) + // 30: 89 5e 08 movl %ebx, 0x8(%esi) + // 33: 8b 2f movl (%edi), %ebp + // 35: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 3b: 7f 03 jg 0x40 <__JIT_ENTRY+0x40> + // 3d: 45 incl %ebp + // 3e: 89 2f movl %ebp, (%edi) + // 40: 89 3e movl %edi, (%esi) + // 42: 8b 6b 0c movl 0xc(%ebx), %ebp + // 45: 89 6e 10 movl %ebp, 0x10(%esi) + // 48: 8b 5b 08 movl 0x8(%ebx), %ebx + // 4b: 89 5e 0c movl %ebx, 0xc(%esi) + // 4e: c7 46 14 00 00 00 00 movl $0x0, 0x14(%esi) + // 55: 8b 5f 30 movl 0x30(%edi), %ebx + // 58: 8d 5c 9e 28 leal 0x28(%esi,%ebx,4), %ebx + // 5c: 89 5e 20 movl %ebx, 0x20(%esi) + // 5f: c7 46 18 00 00 00 00 movl $0x0, 0x18(%esi) + // 66: 8d 9f 80 00 00 00 leal 0x80(%edi), %ebx + // 6c: 89 5e 1c movl %ebx, 0x1c(%esi) + // 6f: c7 46 24 00 00 00 00 movl $0x0, 0x24(%esi) + // 76: 83 7f 30 03 cmpl $0x3, 0x30(%edi) + // 7a: 7c 28 jl 0xa4 <__JIT_ENTRY+0xa4> + // 7c: bb 0c 00 00 00 movl $0xc, %ebx + // 81: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 90: c7 04 9e 00 00 00 00 movl $0x0, (%esi,%ebx,4) + // 97: 8d 6b 01 leal 0x1(%ebx), %ebp + // 9a: 83 c3 f7 addl $-0x9, %ebx + // 9d: 3b 5f 30 cmpl 0x30(%edi), %ebx + // a0: 89 eb movl %ebp, %ebx + // a2: 7c ec jl 0x90 <__JIT_ENTRY+0x90> + // a4: 0f 13 46 28 movlps %xmm0, 0x28(%esi) + // a8: 66 c7 40 24 06 00 movw $0x6, 0x24(%eax) + // ae: 89 72 f4 movl %esi, -0xc(%edx) + // b1: 83 c2 f8 addl $-0x8, %edx + // b4: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // b8: 89 54 24 18 movl %edx, 0x18(%esp) + // bc: 89 44 24 14 movl %eax, 0x14(%esp) + // c0: 5e popl %esi + // c1: 5f popl %edi + // c2: 5b popl %ebx + // c3: 5d popl %ebp + // c4: e9 00 00 00 00 jmp 0xc9 <__JIT_ENTRY+0xc9> + // 000000c5: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[196] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x1c, + 0x8b, 0x54, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x5a, 0xfc, 0xf2, 0x0f, 0x10, 0x42, 0xf4, + 0x8b, 0x7b, 0x18, 0x8b, 0xb1, 0x94, 0x00, 0x00, + 0x00, 0x8b, 0x6f, 0x34, 0x8d, 0x2c, 0xae, 0x89, + 0xa9, 0x94, 0x00, 0x00, 0x00, 0x89, 0x46, 0x04, + 0x89, 0x5e, 0x08, 0x8b, 0x2f, 0x81, 0xfd, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x45, 0x89, 0x2f, + 0x89, 0x3e, 0x8b, 0x6b, 0x0c, 0x89, 0x6e, 0x10, + 0x8b, 0x5b, 0x08, 0x89, 0x5e, 0x0c, 0xc7, 0x46, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x5f, 0x30, + 0x8d, 0x5c, 0x9e, 0x28, 0x89, 0x5e, 0x20, 0xc7, + 0x46, 0x18, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x9f, + 0x80, 0x00, 0x00, 0x00, 0x89, 0x5e, 0x1c, 0xc7, + 0x46, 0x24, 0x00, 0x00, 0x00, 0x00, 0x83, 0x7f, + 0x30, 0x03, 0x7c, 0x28, 0xbb, 0x0c, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc7, 0x04, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x8d, + 0x6b, 0x01, 0x83, 0xc3, 0xf7, 0x3b, 0x5f, 0x30, + 0x89, 0xeb, 0x7c, 0xec, 0x0f, 0x13, 0x46, 0x28, + 0x66, 0xc7, 0x40, 0x24, 0x06, 0x00, 0x89, 0x72, + 0xf4, 0x83, 0xc2, 0xf8, 0x89, 0x4c, 0x24, 0x1c, + 0x89, 0x54, 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_LIST_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 7c 24 24 movl 0x24(%esp), %edi + // b: 8b 5c 24 20 movl 0x20(%esp), %ebx + // f: 8b 74 24 1c movl 0x1c(%esp), %esi + // 13: 8b 6b fc movl -0x4(%ebx), %ebp + // 16: 81 7d 04 00 00 00 00 cmpl $0x0, 0x4(%ebp) + // 00000019: IMAGE_REL_I386_DIR32 _PyLong_Type + // 1d: 0f 85 c3 00 00 00 jne 0xe6 <__JIT_ENTRY+0xe6> + // 23: 8b 53 f8 movl -0x8(%ebx), %edx + // 26: 81 7a 04 00 00 00 00 cmpl $0x0, 0x4(%edx) + // 00000029: IMAGE_REL_I386_DIR32 _PyList_Type + // 2d: 0f 85 b3 00 00 00 jne 0xe6 <__JIT_ENTRY+0xe6> + // 33: 8b 45 08 movl 0x8(%ebp), %eax + // 36: 83 e0 fb andl $-0x5, %eax + // 39: 83 f8 09 cmpl $0x9, %eax + // 3c: 0f 83 a4 00 00 00 jae 0xe6 <__JIT_ENTRY+0xe6> + // 42: 8b 45 0c movl 0xc(%ebp), %eax + // 45: 3b 42 08 cmpl 0x8(%edx), %eax + // 48: 0f 8d 98 00 00 00 jge 0xe6 <__JIT_ENTRY+0xe6> + // 4e: 8b 4a 0c movl 0xc(%edx), %ecx + // 51: 8b 0c 81 movl (%ecx,%eax,4), %ecx + // 54: 8b 01 movl (%ecx), %eax + // 56: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 5b: 7f 03 jg 0x60 <__JIT_ENTRY+0x60> + // 5d: 40 incl %eax + // 5e: 89 01 movl %eax, (%ecx) + // 60: 83 c3 f8 addl $-0x8, %ebx + // 63: 8b 45 00 movl (%ebp), %eax + // 66: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 6b: 7f 34 jg 0xa1 <__JIT_ENTRY+0xa1> + // 6d: 48 decl %eax + // 6e: 89 45 00 movl %eax, (%ebp) + // 71: 75 2e jne 0xa1 <__JIT_ENTRY+0xa1> + // 73: 89 0c 24 movl %ecx, (%esp) + // 76: 89 54 24 04 movl %edx, 0x4(%esp) + // 7a: a1 50 14 00 00 movl 0x1450, %eax + // 0000007b: IMAGE_REL_I386_DIR32 __PyRuntime + // 7f: 85 c0 testl %eax, %eax + // 81: 74 0e je 0x91 <__JIT_ENTRY+0x91> + // 83: ff 35 54 14 00 00 pushl 0x1454 + // 00000085: IMAGE_REL_I386_DIR32 __PyRuntime + // 89: 6a 01 pushl $0x1 + // 8b: 55 pushl %ebp + // 8c: ff d0 calll *%eax + // 8e: 83 c4 0c addl $0xc, %esp + // 91: 55 pushl %ebp + // 92: e8 00 00 00 00 calll 0x97 <__JIT_ENTRY+0x97> + // 00000093: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 97: 83 c4 04 addl $0x4, %esp + // 9a: 8b 54 24 04 movl 0x4(%esp), %edx + // 9e: 8b 0c 24 movl (%esp), %ecx + // a1: 89 5e 20 movl %ebx, 0x20(%esi) + // a4: 8b 02 movl (%edx), %eax + // a6: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // ab: 7f 12 jg 0xbf <__JIT_ENTRY+0xbf> + // ad: 48 decl %eax + // ae: 89 02 movl %eax, (%edx) + // b0: 75 0d jne 0xbf <__JIT_ENTRY+0xbf> + // b2: 52 pushl %edx + // b3: 89 cb movl %ecx, %ebx + // b5: e8 00 00 00 00 calll 0xba <__JIT_ENTRY+0xba> + // 000000b6: IMAGE_REL_I386_REL32 __Py_Dealloc + // ba: 89 d9 movl %ebx, %ecx + // bc: 83 c4 04 addl $0x4, %esp + // bf: 8b 46 20 movl 0x20(%esi), %eax + // c2: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // c9: 89 08 movl %ecx, (%eax) + // cb: 83 c0 04 addl $0x4, %eax + // ce: 89 7c 24 24 movl %edi, 0x24(%esp) + // d2: 89 44 24 20 movl %eax, 0x20(%esp) + // d6: 89 74 24 1c movl %esi, 0x1c(%esp) + // da: 83 c4 08 addl $0x8, %esp + // dd: 5e popl %esi + // de: 5f popl %edi + // df: 5b popl %ebx + // e0: 5d popl %ebp + // e1: e9 00 00 00 00 jmp 0xe6 <__JIT_ENTRY+0xe6> + // 000000e2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // e6: 89 7c 24 24 movl %edi, 0x24(%esp) + // ea: 89 5c 24 20 movl %ebx, 0x20(%esp) + // ee: 89 74 24 1c movl %esi, 0x1c(%esp) + // f2: 83 c4 08 addl $0x8, %esp + // f5: 5e popl %esi + // f6: 5f popl %edi + // f7: 5b popl %ebx + // f8: 5d popl %ebp + // f9: e9 00 00 00 00 jmp 0xfe <__JIT_ENTRY+0xfe> + // 000000fa: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[254] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x7c, 0x24, 0x24, 0x8b, 0x5c, 0x24, 0x20, 0x8b, + 0x74, 0x24, 0x1c, 0x8b, 0x6b, 0xfc, 0x81, 0x7d, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xc3, + 0x00, 0x00, 0x00, 0x8b, 0x53, 0xf8, 0x81, 0x7a, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xb3, + 0x00, 0x00, 0x00, 0x8b, 0x45, 0x08, 0x83, 0xe0, + 0xfb, 0x83, 0xf8, 0x09, 0x0f, 0x83, 0xa4, 0x00, + 0x00, 0x00, 0x8b, 0x45, 0x0c, 0x3b, 0x42, 0x08, + 0x0f, 0x8d, 0x98, 0x00, 0x00, 0x00, 0x8b, 0x4a, + 0x0c, 0x8b, 0x0c, 0x81, 0x8b, 0x01, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x40, 0x89, 0x01, + 0x83, 0xc3, 0xf8, 0x8b, 0x45, 0x00, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x34, 0x48, 0x89, 0x45, + 0x00, 0x75, 0x2e, 0x89, 0x0c, 0x24, 0x89, 0x54, + 0x24, 0x04, 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, + 0x00, 0x6a, 0x01, 0x55, 0xff, 0xd0, 0x83, 0xc4, + 0x0c, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x54, 0x24, 0x04, 0x8b, 0x0c, + 0x24, 0x89, 0x5e, 0x20, 0x8b, 0x02, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x48, 0x89, 0x02, + 0x75, 0x0d, 0x52, 0x89, 0xcb, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd9, 0x83, 0xc4, 0x04, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x08, 0x83, 0xc0, 0x04, 0x89, 0x7c, + 0x24, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x74, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x24, 0x89, 0x5c, 0x24, 0x20, 0x89, 0x74, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyLong_Type); + patch_32(code + 0x29, (uintptr_t)&PyList_Type); + patch_32(code + 0x7b, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x85, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x93, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xb6, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xfa, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_STR_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_STR_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 7c 24 24 movl 0x24(%esp), %edi + // b: 8b 5c 24 20 movl 0x20(%esp), %ebx + // f: 8b 74 24 1c movl 0x1c(%esp), %esi + // 13: 8b 6b fc movl -0x4(%ebx), %ebp + // 16: 81 7d 04 00 00 00 00 cmpl $0x0, 0x4(%ebp) + // 00000019: IMAGE_REL_I386_DIR32 _PyLong_Type + // 1d: 0f 85 c3 00 00 00 jne 0xe6 <__JIT_ENTRY+0xe6> + // 23: 8b 4b f8 movl -0x8(%ebx), %ecx + // 26: 81 79 04 00 00 00 00 cmpl $0x0, 0x4(%ecx) + // 00000029: IMAGE_REL_I386_DIR32 _PyUnicode_Type + // 2d: 0f 85 b3 00 00 00 jne 0xe6 <__JIT_ENTRY+0xe6> + // 33: 8b 45 08 movl 0x8(%ebp), %eax + // 36: 83 e0 fb andl $-0x5, %eax + // 39: 83 f8 09 cmpl $0x9, %eax + // 3c: 0f 83 a4 00 00 00 jae 0xe6 <__JIT_ENTRY+0xe6> + // 42: 8b 45 0c movl 0xc(%ebp), %eax + // 45: 39 41 08 cmpl %eax, 0x8(%ecx) + // 48: 0f 8e 98 00 00 00 jle 0xe6 <__JIT_ENTRY+0xe6> + // 4e: 89 0c 24 movl %ecx, (%esp) + // 51: 0f b7 49 12 movzwl 0x12(%ecx), %ecx + // 55: 89 ca movl %ecx, %edx + // 57: 83 e2 07 andl $0x7, %edx + // 5a: 83 fa 02 cmpl $0x2, %edx + // 5d: 74 16 je 0x75 <__JIT_ENTRY+0x75> + // 5f: 83 fa 01 cmpl $0x1, %edx + // 62: 75 22 jne 0x86 <__JIT_ENTRY+0x86> + // 64: f6 c1 08 testb $0x8, %cl + // 67: 75 2a jne 0x93 <__JIT_ENTRY+0x93> + // 69: 8b 14 24 movl (%esp), %edx + // 6c: 8b 4a 1c movl 0x1c(%edx), %ecx + // 6f: 0f b6 0c 01 movzbl (%ecx,%eax), %ecx + // 73: eb 69 jmp 0xde <__JIT_ENTRY+0xde> + // 75: f6 c1 08 testb $0x8, %cl + // 78: 75 33 jne 0xad <__JIT_ENTRY+0xad> + // 7a: 8b 14 24 movl (%esp), %edx + // 7d: 8b 4a 1c movl 0x1c(%edx), %ecx + // 80: 0f b7 0c 41 movzwl (%ecx,%eax,2), %ecx + // 84: eb 58 jmp 0xde <__JIT_ENTRY+0xde> + // 86: f6 c1 08 testb $0x8, %cl + // 89: 75 3c jne 0xc7 <__JIT_ENTRY+0xc7> + // 8b: 8b 14 24 movl (%esp), %edx + // 8e: 8b 4a 1c movl 0x1c(%edx), %ecx + // 91: eb 48 jmp 0xdb <__JIT_ENTRY+0xdb> + // 93: 31 d2 xorl %edx, %edx + // 95: f6 c1 10 testb $0x10, %cl + // 98: 0f 94 c2 sete %dl + // 9b: 8b 0c 24 movl (%esp), %ecx + // 9e: 8d 0c d1 leal (%ecx,%edx,8), %ecx + // a1: 83 c1 14 addl $0x14, %ecx + // a4: 8b 14 24 movl (%esp), %edx + // a7: 0f b6 0c 01 movzbl (%ecx,%eax), %ecx + // ab: eb 31 jmp 0xde <__JIT_ENTRY+0xde> + // ad: 31 d2 xorl %edx, %edx + // af: f6 c1 10 testb $0x10, %cl + // b2: 0f 94 c2 sete %dl + // b5: 8b 0c 24 movl (%esp), %ecx + // b8: 8d 0c d1 leal (%ecx,%edx,8), %ecx + // bb: 83 c1 14 addl $0x14, %ecx + // be: 8b 14 24 movl (%esp), %edx + // c1: 0f b7 0c 41 movzwl (%ecx,%eax,2), %ecx + // c5: eb 17 jmp 0xde <__JIT_ENTRY+0xde> + // c7: 31 d2 xorl %edx, %edx + // c9: f6 c1 10 testb $0x10, %cl + // cc: 0f 94 c2 sete %dl + // cf: 8b 0c 24 movl (%esp), %ecx + // d2: 8d 0c d1 leal (%ecx,%edx,8), %ecx + // d5: 83 c1 14 addl $0x14, %ecx + // d8: 8b 14 24 movl (%esp), %edx + // db: 8b 0c 81 movl (%ecx,%eax,4), %ecx + // de: 81 f9 80 00 00 00 cmpl $0x80, %ecx + // e4: 72 18 jb 0xfe <__JIT_ENTRY+0xfe> + // e6: 89 7c 24 24 movl %edi, 0x24(%esp) + // ea: 89 5c 24 20 movl %ebx, 0x20(%esp) + // ee: 89 74 24 1c movl %esi, 0x1c(%esp) + // f2: 83 c4 08 addl $0x8, %esp + // f5: 5e popl %esi + // f6: 5f popl %edi + // f7: 5b popl %ebx + // f8: 5d popl %ebp + // f9: e9 00 00 00 00 jmp 0xfe <__JIT_ENTRY+0xfe> + // 000000fa: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // fe: 83 c3 f8 addl $-0x8, %ebx + // 101: 8b 45 00 movl (%ebp), %eax + // 104: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 109: 7f 31 jg 0x13c <__JIT_ENTRY+0x13c> + // 10b: 48 decl %eax + // 10c: 89 45 00 movl %eax, (%ebp) + // 10f: 75 2b jne 0x13c <__JIT_ENTRY+0x13c> + // 111: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 115: a1 50 14 00 00 movl 0x1450, %eax + // 00000116: IMAGE_REL_I386_DIR32 __PyRuntime + // 11a: 85 c0 testl %eax, %eax + // 11c: 74 0e je 0x12c <__JIT_ENTRY+0x12c> + // 11e: ff 35 54 14 00 00 pushl 0x1454 + // 00000120: IMAGE_REL_I386_DIR32 __PyRuntime + // 124: 6a 01 pushl $0x1 + // 126: 55 pushl %ebp + // 127: ff d0 calll *%eax + // 129: 83 c4 0c addl $0xc, %esp + // 12c: 55 pushl %ebp + // 12d: e8 00 00 00 00 calll 0x132 <__JIT_ENTRY+0x132> + // 0000012e: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 132: 83 c4 04 addl $0x4, %esp + // 135: 8b 14 24 movl (%esp), %edx + // 138: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 13c: 89 5e 20 movl %ebx, 0x20(%esi) + // 13f: 8b 02 movl (%edx), %eax + // 141: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 146: 7f 12 jg 0x15a <__JIT_ENTRY+0x15a> + // 148: 48 decl %eax + // 149: 89 02 movl %eax, (%edx) + // 14b: 75 0d jne 0x15a <__JIT_ENTRY+0x15a> + // 14d: 52 pushl %edx + // 14e: 89 cb movl %ecx, %ebx + // 150: e8 00 00 00 00 calll 0x155 <__JIT_ENTRY+0x155> + // 00000151: IMAGE_REL_I386_REL32 __Py_Dealloc + // 155: 89 d9 movl %ebx, %ecx + // 157: 83 c4 04 addl $0x4, %esp + // 15a: 8d 04 49 leal (%ecx,%ecx,2), %eax + // 15d: 8d 04 c5 3c a6 00 00 leal 0xa63c(,%eax,8), %eax + // 00000160: IMAGE_REL_I386_DIR32 __PyRuntime + // 164: 8b 4e 20 movl 0x20(%esi), %ecx + // 167: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 16e: 89 01 movl %eax, (%ecx) + // 170: 83 c1 04 addl $0x4, %ecx + // 173: 89 7c 24 24 movl %edi, 0x24(%esp) + // 177: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 17b: 89 74 24 1c movl %esi, 0x1c(%esp) + // 17f: 83 c4 08 addl $0x8, %esp + // 182: 5e popl %esi + // 183: 5f popl %edi + // 184: 5b popl %ebx + // 185: 5d popl %ebp + // 186: e9 00 00 00 00 jmp 0x18b <__JIT_ENTRY+0x18b> + // 00000187: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[390] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x7c, 0x24, 0x24, 0x8b, 0x5c, 0x24, 0x20, 0x8b, + 0x74, 0x24, 0x1c, 0x8b, 0x6b, 0xfc, 0x81, 0x7d, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xc3, + 0x00, 0x00, 0x00, 0x8b, 0x4b, 0xf8, 0x81, 0x79, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xb3, + 0x00, 0x00, 0x00, 0x8b, 0x45, 0x08, 0x83, 0xe0, + 0xfb, 0x83, 0xf8, 0x09, 0x0f, 0x83, 0xa4, 0x00, + 0x00, 0x00, 0x8b, 0x45, 0x0c, 0x39, 0x41, 0x08, + 0x0f, 0x8e, 0x98, 0x00, 0x00, 0x00, 0x89, 0x0c, + 0x24, 0x0f, 0xb7, 0x49, 0x12, 0x89, 0xca, 0x83, + 0xe2, 0x07, 0x83, 0xfa, 0x02, 0x74, 0x16, 0x83, + 0xfa, 0x01, 0x75, 0x22, 0xf6, 0xc1, 0x08, 0x75, + 0x2a, 0x8b, 0x14, 0x24, 0x8b, 0x4a, 0x1c, 0x0f, + 0xb6, 0x0c, 0x01, 0xeb, 0x69, 0xf6, 0xc1, 0x08, + 0x75, 0x33, 0x8b, 0x14, 0x24, 0x8b, 0x4a, 0x1c, + 0x0f, 0xb7, 0x0c, 0x41, 0xeb, 0x58, 0xf6, 0xc1, + 0x08, 0x75, 0x3c, 0x8b, 0x14, 0x24, 0x8b, 0x4a, + 0x1c, 0xeb, 0x48, 0x31, 0xd2, 0xf6, 0xc1, 0x10, + 0x0f, 0x94, 0xc2, 0x8b, 0x0c, 0x24, 0x8d, 0x0c, + 0xd1, 0x83, 0xc1, 0x14, 0x8b, 0x14, 0x24, 0x0f, + 0xb6, 0x0c, 0x01, 0xeb, 0x31, 0x31, 0xd2, 0xf6, + 0xc1, 0x10, 0x0f, 0x94, 0xc2, 0x8b, 0x0c, 0x24, + 0x8d, 0x0c, 0xd1, 0x83, 0xc1, 0x14, 0x8b, 0x14, + 0x24, 0x0f, 0xb7, 0x0c, 0x41, 0xeb, 0x17, 0x31, + 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, 0xc2, 0x8b, + 0x0c, 0x24, 0x8d, 0x0c, 0xd1, 0x83, 0xc1, 0x14, + 0x8b, 0x14, 0x24, 0x8b, 0x0c, 0x81, 0x81, 0xf9, + 0x80, 0x00, 0x00, 0x00, 0x72, 0x18, 0x89, 0x7c, + 0x24, 0x24, 0x89, 0x5c, 0x24, 0x20, 0x89, 0x74, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc3, + 0xf8, 0x8b, 0x45, 0x00, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x31, 0x48, 0x89, 0x45, 0x00, 0x75, + 0x2b, 0x89, 0x4c, 0x24, 0x04, 0xa1, 0x50, 0x14, + 0x00, 0x00, 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, + 0x54, 0x14, 0x00, 0x00, 0x6a, 0x01, 0x55, 0xff, + 0xd0, 0x83, 0xc4, 0x0c, 0x55, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x14, 0x24, + 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x5e, 0x20, 0x8b, + 0x02, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x48, 0x89, 0x02, 0x75, 0x0d, 0x52, 0x89, 0xcb, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd9, 0x83, + 0xc4, 0x04, 0x8d, 0x04, 0x49, 0x8d, 0x04, 0xc5, + 0x3c, 0xa6, 0x00, 0x00, 0x8b, 0x4e, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x01, + 0x83, 0xc1, 0x04, 0x89, 0x7c, 0x24, 0x24, 0x89, + 0x4c, 0x24, 0x20, 0x89, 0x74, 0x24, 0x1c, 0x83, + 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyLong_Type); + patch_32(code + 0x29, (uintptr_t)&PyUnicode_Type); + patch_x86_64_32rx(code + 0xfa, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x116, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x120, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x12e, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0x151, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x160, (uintptr_t)&_PyRuntime + 0xa63c); +} + +void +emit__BINARY_OP_SUBSCR_TUPLE_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_TUPLE_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 7c 24 24 movl 0x24(%esp), %edi + // b: 8b 5c 24 20 movl 0x20(%esp), %ebx + // f: 8b 74 24 1c movl 0x1c(%esp), %esi + // 13: 8b 6b fc movl -0x4(%ebx), %ebp + // 16: 81 7d 04 00 00 00 00 cmpl $0x0, 0x4(%ebp) + // 00000019: IMAGE_REL_I386_DIR32 _PyLong_Type + // 1d: 0f 85 c1 00 00 00 jne 0xe4 <__JIT_ENTRY+0xe4> + // 23: 8b 4b f8 movl -0x8(%ebx), %ecx + // 26: 81 79 04 00 00 00 00 cmpl $0x0, 0x4(%ecx) + // 00000029: IMAGE_REL_I386_DIR32 _PyTuple_Type + // 2d: 0f 85 b1 00 00 00 jne 0xe4 <__JIT_ENTRY+0xe4> + // 33: 8b 45 08 movl 0x8(%ebp), %eax + // 36: 83 e0 fb andl $-0x5, %eax + // 39: 83 f8 09 cmpl $0x9, %eax + // 3c: 0f 83 a2 00 00 00 jae 0xe4 <__JIT_ENTRY+0xe4> + // 42: 8b 45 0c movl 0xc(%ebp), %eax + // 45: 3b 41 08 cmpl 0x8(%ecx), %eax + // 48: 0f 8d 96 00 00 00 jge 0xe4 <__JIT_ENTRY+0xe4> + // 4e: 8b 54 81 0c movl 0xc(%ecx,%eax,4), %edx + // 52: 8b 02 movl (%edx), %eax + // 54: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 59: 7f 03 jg 0x5e <__JIT_ENTRY+0x5e> + // 5b: 40 incl %eax + // 5c: 89 02 movl %eax, (%edx) + // 5e: 83 c3 f8 addl $-0x8, %ebx + // 61: 8b 45 00 movl (%ebp), %eax + // 64: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 69: 7f 34 jg 0x9f <__JIT_ENTRY+0x9f> + // 6b: 48 decl %eax + // 6c: 89 45 00 movl %eax, (%ebp) + // 6f: 75 2e jne 0x9f <__JIT_ENTRY+0x9f> + // 71: 89 14 24 movl %edx, (%esp) + // 74: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 78: a1 50 14 00 00 movl 0x1450, %eax + // 00000079: IMAGE_REL_I386_DIR32 __PyRuntime + // 7d: 85 c0 testl %eax, %eax + // 7f: 74 0e je 0x8f <__JIT_ENTRY+0x8f> + // 81: ff 35 54 14 00 00 pushl 0x1454 + // 00000083: IMAGE_REL_I386_DIR32 __PyRuntime + // 87: 6a 01 pushl $0x1 + // 89: 55 pushl %ebp + // 8a: ff d0 calll *%eax + // 8c: 83 c4 0c addl $0xc, %esp + // 8f: 55 pushl %ebp + // 90: e8 00 00 00 00 calll 0x95 <__JIT_ENTRY+0x95> + // 00000091: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 95: 83 c4 04 addl $0x4, %esp + // 98: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 9c: 8b 14 24 movl (%esp), %edx + // 9f: 89 5e 20 movl %ebx, 0x20(%esi) + // a2: 8b 01 movl (%ecx), %eax + // a4: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // a9: 7f 12 jg 0xbd <__JIT_ENTRY+0xbd> + // ab: 48 decl %eax + // ac: 89 01 movl %eax, (%ecx) + // ae: 75 0d jne 0xbd <__JIT_ENTRY+0xbd> + // b0: 51 pushl %ecx + // b1: 89 d3 movl %edx, %ebx + // b3: e8 00 00 00 00 calll 0xb8 <__JIT_ENTRY+0xb8> + // 000000b4: IMAGE_REL_I386_REL32 __Py_Dealloc + // b8: 89 da movl %ebx, %edx + // ba: 83 c4 04 addl $0x4, %esp + // bd: 8b 46 20 movl 0x20(%esi), %eax + // c0: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // c7: 89 10 movl %edx, (%eax) + // c9: 83 c0 04 addl $0x4, %eax + // cc: 89 7c 24 24 movl %edi, 0x24(%esp) + // d0: 89 44 24 20 movl %eax, 0x20(%esp) + // d4: 89 74 24 1c movl %esi, 0x1c(%esp) + // d8: 83 c4 08 addl $0x8, %esp + // db: 5e popl %esi + // dc: 5f popl %edi + // dd: 5b popl %ebx + // de: 5d popl %ebp + // df: e9 00 00 00 00 jmp 0xe4 <__JIT_ENTRY+0xe4> + // 000000e0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // e4: 89 7c 24 24 movl %edi, 0x24(%esp) + // e8: 89 5c 24 20 movl %ebx, 0x20(%esp) + // ec: 89 74 24 1c movl %esi, 0x1c(%esp) + // f0: 83 c4 08 addl $0x8, %esp + // f3: 5e popl %esi + // f4: 5f popl %edi + // f5: 5b popl %ebx + // f6: 5d popl %ebp + // f7: e9 00 00 00 00 jmp 0xfc <__JIT_ENTRY+0xfc> + // 000000f8: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[252] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x7c, 0x24, 0x24, 0x8b, 0x5c, 0x24, 0x20, 0x8b, + 0x74, 0x24, 0x1c, 0x8b, 0x6b, 0xfc, 0x81, 0x7d, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xc1, + 0x00, 0x00, 0x00, 0x8b, 0x4b, 0xf8, 0x81, 0x79, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xb1, + 0x00, 0x00, 0x00, 0x8b, 0x45, 0x08, 0x83, 0xe0, + 0xfb, 0x83, 0xf8, 0x09, 0x0f, 0x83, 0xa2, 0x00, + 0x00, 0x00, 0x8b, 0x45, 0x0c, 0x3b, 0x41, 0x08, + 0x0f, 0x8d, 0x96, 0x00, 0x00, 0x00, 0x8b, 0x54, + 0x81, 0x0c, 0x8b, 0x02, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x40, 0x89, 0x02, 0x83, 0xc3, + 0xf8, 0x8b, 0x45, 0x00, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x34, 0x48, 0x89, 0x45, 0x00, 0x75, + 0x2e, 0x89, 0x14, 0x24, 0x89, 0x4c, 0x24, 0x04, + 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, + 0x01, 0x55, 0xff, 0xd0, 0x83, 0xc4, 0x0c, 0x55, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x4c, 0x24, 0x04, 0x8b, 0x14, 0x24, 0x89, + 0x5e, 0x20, 0x8b, 0x01, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x12, 0x48, 0x89, 0x01, 0x75, 0x0d, + 0x51, 0x89, 0xd3, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xda, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x10, 0x83, 0xc0, 0x04, 0x89, 0x7c, 0x24, 0x24, + 0x89, 0x44, 0x24, 0x20, 0x89, 0x74, 0x24, 0x1c, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x24, + 0x89, 0x5c, 0x24, 0x20, 0x89, 0x74, 0x24, 0x1c, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyLong_Type); + patch_32(code + 0x29, (uintptr_t)&PyTuple_Type); + patch_32(code + 0x79, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x83, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x91, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xe0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xf8, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__BINARY_OP_SUBTRACT_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 7c 24 2c movl 0x2c(%esp), %edi + // b: 8b 74 24 24 movl 0x24(%esp), %esi + // f: 8b 5c 24 28 movl 0x28(%esp), %ebx + // 13: 8b 43 f8 movl -0x8(%ebx), %eax + // 16: 8b 4b fc movl -0x4(%ebx), %ecx + // 19: 8d 6b f8 leal -0x8(%ebx), %ebp + // 1c: f2 0f 10 40 08 movsd 0x8(%eax), %xmm0 + // 21: f2 0f 5c 41 08 subsd 0x8(%ecx), %xmm0 + // 26: f2 0f 11 44 24 08 movsd %xmm0, 0x8(%esp) + // 2c: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 30: 89 04 24 movl %eax, (%esp) + // 33: e8 00 00 00 00 calll 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 __PyFloat_FromDouble_ConsumeInputs + // 38: 85 c0 testl %eax, %eax + // 3a: 74 1e je 0x5a <__JIT_ENTRY+0x5a> + // 3c: 83 c3 fc addl $-0x4, %ebx + // 3f: 89 45 00 movl %eax, (%ebp) + // 42: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 46: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 4a: 89 74 24 24 movl %esi, 0x24(%esp) + // 4e: 83 c4 10 addl $0x10, %esp + // 51: 5e popl %esi + // 52: 5f popl %edi + // 53: 5b popl %ebx + // 54: 5d popl %ebp + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5a: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 5e: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 62: 89 74 24 24 movl %esi, 0x24(%esp) + // 66: 83 c4 10 addl $0x10, %esp + // 69: 5e popl %esi + // 6a: 5f popl %edi + // 6b: 5b popl %ebx + // 6c: 5d popl %ebp + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[114] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x7c, 0x24, 0x2c, 0x8b, 0x74, 0x24, 0x24, 0x8b, + 0x5c, 0x24, 0x28, 0x8b, 0x43, 0xf8, 0x8b, 0x4b, + 0xfc, 0x8d, 0x6b, 0xf8, 0xf2, 0x0f, 0x10, 0x40, + 0x08, 0xf2, 0x0f, 0x5c, 0x41, 0x08, 0xf2, 0x0f, + 0x11, 0x44, 0x24, 0x08, 0x89, 0x4c, 0x24, 0x04, + 0x89, 0x04, 0x24, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x1e, 0x83, 0xc3, 0xfc, 0x89, + 0x45, 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x5c, + 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x6c, + 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x34, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs + -0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_SUBTRACT_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 44 24 1c movl 0x1c(%esp), %eax + // 12: 89 44 24 04 movl %eax, 0x4(%esp) + // 16: 8b 6c 24 20 movl 0x20(%esp), %ebp + // 1a: 8b 7d f8 movl -0x8(%ebp), %edi + // 1d: 8b 5d fc movl -0x4(%ebp), %ebx + // 20: 53 pushl %ebx + // 21: 57 pushl %edi + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __PyLong_Subtract + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 89 c6 movl %eax, %esi + // 2c: 8b 03 movl (%ebx), %eax + // 2e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 33: 7f 05 jg 0x3a <__JIT_ENTRY+0x3a> + // 35: 48 decl %eax + // 36: 89 03 movl %eax, (%ebx) + // 38: 74 30 je 0x6a <__JIT_ENTRY+0x6a> + // 3a: 8b 07 movl (%edi), %eax + // 3c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 41: 7f 50 jg 0x93 <__JIT_ENTRY+0x93> + // 43: 48 decl %eax + // 44: 89 07 movl %eax, (%edi) + // 46: 75 4b jne 0x93 <__JIT_ENTRY+0x93> + // 48: a1 50 14 00 00 movl 0x1450, %eax + // 00000049: IMAGE_REL_I386_DIR32 __PyRuntime + // 4d: 85 c0 testl %eax, %eax + // 4f: 74 0e je 0x5f <__JIT_ENTRY+0x5f> + // 51: ff 35 54 14 00 00 pushl 0x1454 + // 00000053: IMAGE_REL_I386_DIR32 __PyRuntime + // 57: 6a 01 pushl $0x1 + // 59: 57 pushl %edi + // 5a: ff d0 calll *%eax + // 5c: 83 c4 0c addl $0xc, %esp + // 5f: 57 pushl %edi + // 60: e8 00 00 00 00 calll 0x65 <__JIT_ENTRY+0x65> + // 00000061: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 65: 83 c4 04 addl $0x4, %esp + // 68: eb 29 jmp 0x93 <__JIT_ENTRY+0x93> + // 6a: a1 50 14 00 00 movl 0x1450, %eax + // 0000006b: IMAGE_REL_I386_DIR32 __PyRuntime + // 6f: 85 c0 testl %eax, %eax + // 71: 74 0e je 0x81 <__JIT_ENTRY+0x81> + // 73: ff 35 54 14 00 00 pushl 0x1454 + // 00000075: IMAGE_REL_I386_DIR32 __PyRuntime + // 79: 6a 01 pushl $0x1 + // 7b: 53 pushl %ebx + // 7c: ff d0 calll *%eax + // 7e: 83 c4 0c addl $0xc, %esp + // 81: 53 pushl %ebx + // 82: e8 00 00 00 00 calll 0x87 <__JIT_ENTRY+0x87> + // 00000083: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 07 movl (%edi), %eax + // 8c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 91: 7e b0 jle 0x43 <__JIT_ENTRY+0x43> + // 93: 8d 45 f8 leal -0x8(%ebp), %eax + // 96: 85 f6 testl %esi, %esi + // 98: 74 24 je 0xbe <__JIT_ENTRY+0xbe> + // 9a: 83 c5 fc addl $-0x4, %ebp + // 9d: 89 30 movl %esi, (%eax) + // 9f: 8b 04 24 movl (%esp), %eax + // a2: 89 44 24 24 movl %eax, 0x24(%esp) + // a6: 89 6c 24 20 movl %ebp, 0x20(%esp) + // aa: 8b 44 24 04 movl 0x4(%esp), %eax + // ae: 89 44 24 1c movl %eax, 0x1c(%esp) + // b2: 83 c4 08 addl $0x8, %esp + // b5: 5e popl %esi + // b6: 5f popl %edi + // b7: 5b popl %ebx + // b8: 5d popl %ebp + // b9: e9 00 00 00 00 jmp 0xbe <__JIT_ENTRY+0xbe> + // 000000ba: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // be: 8b 0c 24 movl (%esp), %ecx + // c1: 89 4c 24 24 movl %ecx, 0x24(%esp) + // c5: 89 44 24 20 movl %eax, 0x20(%esp) + // c9: 8b 44 24 04 movl 0x4(%esp), %eax + // cd: 89 44 24 1c movl %eax, 0x1c(%esp) + // d1: 83 c4 08 addl $0x8, %esp + // d4: 5e popl %esi + // d5: 5f popl %edi + // d6: 5b popl %ebx + // d7: 5d popl %ebp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 000000d9: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[221] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x44, + 0x24, 0x1c, 0x89, 0x44, 0x24, 0x04, 0x8b, 0x6c, + 0x24, 0x20, 0x8b, 0x7d, 0xf8, 0x8b, 0x5d, 0xfc, + 0x53, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x89, 0xc6, 0x8b, 0x03, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, 0x03, + 0x74, 0x30, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x50, 0x48, 0x89, 0x07, 0x75, 0x4b, + 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, 0x00, 0x6a, + 0x01, 0x57, 0xff, 0xd0, 0x83, 0xc4, 0x0c, 0x57, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0xeb, 0x29, 0xa1, 0x50, 0x14, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, 0x00, + 0x00, 0x6a, 0x01, 0x53, 0xff, 0xd0, 0x83, 0xc4, + 0x0c, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0xb0, 0x8d, 0x45, 0xf8, 0x85, 0xf6, + 0x74, 0x24, 0x83, 0xc5, 0xfc, 0x89, 0x30, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, 0x89, 0x6c, + 0x24, 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, + 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_PyLong_Subtract + -0x4); + patch_32(code + 0x49, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x53, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x61, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_32(code + 0x6b, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x75, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x83, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xba, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd9, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_SLICE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 5c 24 18 movl 0x18(%esp), %ebx + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: 8b 48 fc movl -0x4(%eax), %ecx + // 17: 8b 68 f4 movl -0xc(%eax), %ebp + // 1a: 8b 50 f8 movl -0x8(%eax), %edx + // 1d: 89 43 20 movl %eax, 0x20(%ebx) + // 20: 51 pushl %ecx + // 21: 52 pushl %edx + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __PyBuildSlice_ConsumeRefs + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 89 c7 movl %eax, %edi + // 2c: 8b 43 20 movl 0x20(%ebx), %eax + // 2f: 85 ff testl %edi, %edi + // 31: 74 31 je 0x64 <__JIT_ENTRY+0x64> + // 33: 83 c0 f8 addl $-0x8, %eax + // 36: 89 43 20 movl %eax, 0x20(%ebx) + // 39: 57 pushl %edi + // 3a: 55 pushl %ebp + // 3b: e8 00 00 00 00 calll 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 _PyObject_GetItem + // 40: 83 c4 08 addl $0x8, %esp + // 43: 89 c6 movl %eax, %esi + // 45: 8b 07 movl (%edi), %eax + // 47: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 4c: 7f 0e jg 0x5c <__JIT_ENTRY+0x5c> + // 4e: 48 decl %eax + // 4f: 89 07 movl %eax, (%edi) + // 51: 75 09 jne 0x5c <__JIT_ENTRY+0x5c> + // 53: 57 pushl %edi + // 54: e8 00 00 00 00 calll 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __Py_Dealloc + // 59: 83 c4 04 addl $0x4, %esp + // 5c: 8b 43 20 movl 0x20(%ebx), %eax + // 5f: 83 c0 08 addl $0x8, %eax + // 62: eb 02 jmp 0x66 <__JIT_ENTRY+0x66> + // 64: 31 f6 xorl %esi, %esi + // 66: 83 c0 f4 addl $-0xc, %eax + // 69: 89 43 20 movl %eax, 0x20(%ebx) + // 6c: 8b 45 00 movl (%ebp), %eax + // 6f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 74: 7f 06 jg 0x7c <__JIT_ENTRY+0x7c> + // 76: 48 decl %eax + // 77: 89 45 00 movl %eax, (%ebp) + // 7a: 74 2e je 0xaa <__JIT_ENTRY+0xaa> + // 7c: 8b 43 20 movl 0x20(%ebx), %eax + // 7f: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // 86: 85 f6 testl %esi, %esi + // 88: 74 37 je 0xc1 <__JIT_ENTRY+0xc1> + // 8a: 89 30 movl %esi, (%eax) + // 8c: 83 c0 04 addl $0x4, %eax + // 8f: 8b 0c 24 movl (%esp), %ecx + // 92: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 96: 89 44 24 1c movl %eax, 0x1c(%esp) + // 9a: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 9e: 83 c4 04 addl $0x4, %esp + // a1: 5e popl %esi + // a2: 5f popl %edi + // a3: 5b popl %ebx + // a4: 5d popl %ebp + // a5: e9 00 00 00 00 jmp 0xaa <__JIT_ENTRY+0xaa> + // 000000a6: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // aa: 55 pushl %ebp + // ab: e8 00 00 00 00 calll 0xb0 <__JIT_ENTRY+0xb0> + // 000000ac: IMAGE_REL_I386_REL32 __Py_Dealloc + // b0: 83 c4 04 addl $0x4, %esp + // b3: 8b 43 20 movl 0x20(%ebx), %eax + // b6: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // bd: 85 f6 testl %esi, %esi + // bf: 75 c9 jne 0x8a <__JIT_ENTRY+0x8a> + // c1: 8b 0c 24 movl (%esp), %ecx + // c4: 89 4c 24 20 movl %ecx, 0x20(%esp) + // c8: 89 44 24 1c movl %eax, 0x1c(%esp) + // cc: 89 5c 24 18 movl %ebx, 0x18(%esp) + // d0: 83 c4 04 addl $0x4, %esp + // d3: 5e popl %esi + // d4: 5f popl %edi + // d5: 5b popl %ebx + // d6: 5d popl %ebp + // d7: e9 00 00 00 00 jmp 0xdc <__JIT_ENTRY+0xdc> + // 000000d8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[220] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x5c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x48, 0xfc, 0x8b, + 0x68, 0xf4, 0x8b, 0x50, 0xf8, 0x89, 0x43, 0x20, + 0x51, 0x52, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x89, 0xc7, 0x8b, 0x43, 0x20, 0x85, + 0xff, 0x74, 0x31, 0x83, 0xc0, 0xf8, 0x89, 0x43, + 0x20, 0x57, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x89, 0xc6, 0x8b, 0x07, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, + 0x07, 0x75, 0x09, 0x57, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x43, 0x20, 0x83, + 0xc0, 0x08, 0xeb, 0x02, 0x31, 0xf6, 0x83, 0xc0, + 0xf4, 0x89, 0x43, 0x20, 0x8b, 0x45, 0x00, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x48, 0x89, + 0x45, 0x00, 0x74, 0x2e, 0x8b, 0x43, 0x20, 0xc7, + 0x43, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xf6, + 0x74, 0x37, 0x89, 0x30, 0x83, 0xc0, 0x04, 0x8b, + 0x0c, 0x24, 0x89, 0x4c, 0x24, 0x20, 0x89, 0x44, + 0x24, 0x1c, 0x89, 0x5c, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x43, 0x20, 0xc7, 0x43, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xf6, 0x75, + 0xc9, 0x8b, 0x0c, 0x24, 0x89, 0x4c, 0x24, 0x20, + 0x89, 0x44, 0x24, 0x1c, 0x89, 0x5c, 0x24, 0x18, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_PyBuildSlice_ConsumeRefs + -0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)&PyObject_GetItem + -0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xac, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xd8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_LIST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 7c 24 20 movl 0x20(%esp), %edi + // 9: 8b 74 24 1c movl 0x1c(%esp), %esi + // d: 8b 44 24 18 movl 0x18(%esp), %eax + // 11: 89 04 24 movl %eax, (%esp) + // 14: b8 00 00 00 00 movl $0x0, %eax + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 e8 movzwl %ax, %ebp + // 1c: 8d 04 ad 00 00 00 00 leal (,%ebp,4), %eax + // 23: 89 f3 movl %esi, %ebx + // 25: 29 c3 subl %eax, %ebx + // 27: 55 pushl %ebp + // 28: 53 pushl %ebx + // 29: e8 00 00 00 00 calll 0x2e <__JIT_ENTRY+0x2e> + // 0000002a: IMAGE_REL_I386_REL32 __PyList_FromStackRefStealOnSuccess + // 2e: 83 c4 08 addl $0x8, %esp + // 31: 85 c0 testl %eax, %eax + // 33: 74 27 je 0x5c <__JIT_ENTRY+0x5c> + // 35: 89 03 movl %eax, (%ebx) + // 37: b8 01 00 00 00 movl $0x1, %eax + // 3c: 29 e8 subl %ebp, %eax + // 3e: 8d 04 86 leal (%esi,%eax,4), %eax + // 41: 89 7c 24 20 movl %edi, 0x20(%esp) + // 45: 8b 0c 24 movl (%esp), %ecx + // 48: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 4c: 89 44 24 1c movl %eax, 0x1c(%esp) + // 50: 83 c4 04 addl $0x4, %esp + // 53: 5e popl %esi + // 54: 5f popl %edi + // 55: 5b popl %ebx + // 56: 5d popl %ebp + // 57: e9 00 00 00 00 jmp 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5c: 89 7c 24 20 movl %edi, 0x20(%esp) + // 60: 89 74 24 1c movl %esi, 0x1c(%esp) + // 64: 8b 04 24 movl (%esp), %eax + // 67: 89 44 24 18 movl %eax, 0x18(%esp) + // 6b: 83 c4 04 addl $0x4, %esp + // 6e: 5e popl %esi + // 6f: 5f popl %edi + // 70: 5b popl %ebx + // 71: 5d popl %ebp + // 72: e9 00 00 00 00 jmp 0x77 <__JIT_ENTRY+0x77> + // 00000073: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[119] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, + 0x20, 0x8b, 0x74, 0x24, 0x1c, 0x8b, 0x44, 0x24, + 0x18, 0x89, 0x04, 0x24, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xe8, 0x8d, 0x04, 0xad, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf3, 0x29, 0xc3, 0x55, + 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x08, 0x85, 0xc0, 0x74, 0x27, 0x89, 0x03, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x29, 0xe8, 0x8d, 0x04, + 0x86, 0x89, 0x7c, 0x24, 0x20, 0x8b, 0x0c, 0x24, + 0x89, 0x4c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x1c, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x20, + 0x89, 0x74, 0x24, 0x1c, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)&_PyList_FromStackRefStealOnSuccess + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x73, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_MAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_MAP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 44 24 28 movl 0x28(%esp), %eax + // b: 89 44 24 04 movl %eax, 0x4(%esp) + // f: 8b 5c 24 24 movl 0x24(%esp), %ebx + // 13: 8b 7c 24 20 movl 0x20(%esp), %edi + // 17: b8 00 00 00 00 movl $0x0, %eax + // 00000018: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1c: 0f b7 e8 movzwl %ax, %ebp + // 1f: 8d 44 2d 00 leal (%ebp,%ebp), %eax + // 23: 89 44 24 08 movl %eax, 0x8(%esp) + // 27: 8d 0c ed 00 00 00 00 leal (,%ebp,8), %ecx + // 2e: 89 d8 movl %ebx, %eax + // 30: 29 c8 subl %ecx, %eax + // 32: 89 5f 20 movl %ebx, 0x20(%edi) + // 35: f7 d9 negl %ecx + // 37: 01 d9 addl %ebx, %ecx + // 39: 83 c1 04 addl $0x4, %ecx + // 3c: 55 pushl %ebp + // 3d: 6a 02 pushl $0x2 + // 3f: 51 pushl %ecx + // 40: 6a 02 pushl $0x2 + // 42: 50 pushl %eax + // 43: e8 00 00 00 00 calll 0x48 <__JIT_ENTRY+0x48> + // 00000044: IMAGE_REL_I386_REL32 __PyDict_FromItems + // 48: 83 c4 14 addl $0x14, %esp + // 4b: 89 c6 movl %eax, %esi + // 4d: 8b 47 20 movl 0x20(%edi), %eax + // 50: 89 04 24 movl %eax, (%esp) + // 53: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 5a: 66 85 ed testw %bp, %bp + // 5d: 74 36 je 0x95 <__JIT_ENTRY+0x95> + // 5f: 8b 44 24 08 movl 0x8(%esp), %eax + // 63: 8d 68 01 leal 0x1(%eax), %ebp + // 66: 83 c3 fc addl $-0x4, %ebx + // 69: eb 0e jmp 0x79 <__JIT_ENTRY+0x79> + // 6b: 0f 1f 44 00 00 nopl (%eax,%eax) + // 70: 4d decl %ebp + // 71: 83 c3 fc addl $-0x4, %ebx + // 74: 83 fd 01 cmpl $0x1, %ebp + // 77: 76 1c jbe 0x95 <__JIT_ENTRY+0x95> + // 79: 8b 03 movl (%ebx), %eax + // 7b: 8b 08 movl (%eax), %ecx + // 7d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 83: 7f eb jg 0x70 <__JIT_ENTRY+0x70> + // 85: 49 decl %ecx + // 86: 89 08 movl %ecx, (%eax) + // 88: 75 e6 jne 0x70 <__JIT_ENTRY+0x70> + // 8a: 50 pushl %eax + // 8b: e8 00 00 00 00 calll 0x90 <__JIT_ENTRY+0x90> + // 0000008c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 90: 83 c4 04 addl $0x4, %esp + // 93: eb db jmp 0x70 <__JIT_ENTRY+0x70> + // 95: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 99: 89 c8 movl %ecx, %eax + // 9b: f7 d8 negl %eax + // 9d: 85 f6 testl %esi, %esi + // 9f: 74 2c je 0xcd <__JIT_ENTRY+0xcd> + // a1: 8b 14 24 movl (%esp), %edx + // a4: 89 34 82 movl %esi, (%edx,%eax,4) + // a7: b8 01 00 00 00 movl $0x1, %eax + // ac: 29 c8 subl %ecx, %eax + // ae: 8d 04 82 leal (%edx,%eax,4), %eax + // b1: 8b 4c 24 04 movl 0x4(%esp), %ecx + // b5: 89 4c 24 28 movl %ecx, 0x28(%esp) + // b9: 89 7c 24 20 movl %edi, 0x20(%esp) + // bd: 89 44 24 24 movl %eax, 0x24(%esp) + // c1: 83 c4 0c addl $0xc, %esp + // c4: 5e popl %esi + // c5: 5f popl %edi + // c6: 5b popl %ebx + // c7: 5d popl %ebp + // c8: e9 00 00 00 00 jmp 0xcd <__JIT_ENTRY+0xcd> + // 000000c9: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // cd: 8b 0c 24 movl (%esp), %ecx + // d0: 8d 04 81 leal (%ecx,%eax,4), %eax + // d3: 8b 4c 24 04 movl 0x4(%esp), %ecx + // d7: 89 4c 24 28 movl %ecx, 0x28(%esp) + // db: 89 7c 24 20 movl %edi, 0x20(%esp) + // df: 89 44 24 24 movl %eax, 0x24(%esp) + // e3: 83 c4 0c addl $0xc, %esp + // e6: 5e popl %esi + // e7: 5f popl %edi + // e8: 5b popl %ebx + // e9: 5d popl %ebp + // ea: e9 00 00 00 00 jmp 0xef <__JIT_ENTRY+0xef> + // 000000eb: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[239] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x44, 0x24, 0x28, 0x89, 0x44, 0x24, 0x04, 0x8b, + 0x5c, 0x24, 0x24, 0x8b, 0x7c, 0x24, 0x20, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xe8, 0x8d, + 0x44, 0x2d, 0x00, 0x89, 0x44, 0x24, 0x08, 0x8d, + 0x0c, 0xed, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, + 0x29, 0xc8, 0x89, 0x5f, 0x20, 0xf7, 0xd9, 0x01, + 0xd9, 0x83, 0xc1, 0x04, 0x55, 0x6a, 0x02, 0x51, + 0x6a, 0x02, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x14, 0x89, 0xc6, 0x8b, 0x47, 0x20, + 0x89, 0x04, 0x24, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xed, 0x74, 0x36, 0x8b, + 0x44, 0x24, 0x08, 0x8d, 0x68, 0x01, 0x83, 0xc3, + 0xfc, 0xeb, 0x0e, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x4d, 0x83, 0xc3, 0xfc, 0x83, 0xfd, 0x01, 0x76, + 0x1c, 0x8b, 0x03, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x8b, 0x4c, 0x24, + 0x08, 0x89, 0xc8, 0xf7, 0xd8, 0x85, 0xf6, 0x74, + 0x2c, 0x8b, 0x14, 0x24, 0x89, 0x34, 0x82, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x29, 0xc8, 0x8d, 0x04, + 0x82, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, + 0x28, 0x89, 0x7c, 0x24, 0x20, 0x89, 0x44, 0x24, + 0x24, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0c, 0x24, + 0x8d, 0x04, 0x81, 0x8b, 0x4c, 0x24, 0x04, 0x89, + 0x4c, 0x24, 0x28, 0x89, 0x7c, 0x24, 0x20, 0x89, + 0x44, 0x24, 0x24, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x18, instruction->oparg); + patch_x86_64_32rx(code + 0x44, (uintptr_t)&_PyDict_FromItems + -0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xeb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SET.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 14 subl $0x14, %esp + // 7: 8b 74 24 30 movl 0x30(%esp), %esi + // b: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // f: 8b 7c 24 28 movl 0x28(%esp), %edi + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 e8 movzwl %ax, %ebp + // 1b: 89 e8 movl %ebp, %eax + // 1d: f7 d8 negl %eax + // 1f: 89 44 24 04 movl %eax, 0x4(%esp) + // 23: 89 5f 20 movl %ebx, 0x20(%edi) + // 26: 6a 00 pushl $0x0 + // 28: e8 00 00 00 00 calll 0x2d <__JIT_ENTRY+0x2d> + // 00000029: IMAGE_REL_I386_REL32 _PySet_New + // 2d: 83 c4 04 addl $0x4, %esp + // 30: 8b 4f 20 movl 0x20(%edi), %ecx + // 33: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 3a: 85 c0 testl %eax, %eax + // 3c: 0f 84 e7 00 00 00 je 0x129 <__JIT_ENTRY+0x129> + // 42: 89 c2 movl %eax, %edx + // 44: b8 00 00 00 00 movl $0x0, %eax + // 00000045: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 49: 66 85 c0 testw %ax, %ax + // 4c: 0f 84 40 01 00 00 je 0x192 <__JIT_ENTRY+0x192> + // 52: 89 74 24 0c movl %esi, 0xc(%esp) + // 56: 31 c0 xorl %eax, %eax + // 58: 8b 74 24 04 movl 0x4(%esp), %esi + // 5c: 89 54 24 08 movl %edx, 0x8(%esp) + // 60: eb 11 jmp 0x73 <__JIT_ENTRY+0x73> + // 62: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 70: 46 incl %esi + // 71: 74 23 je 0x96 <__JIT_ENTRY+0x96> + // 73: 85 c0 testl %eax, %eax + // 75: 75 f9 jne 0x70 <__JIT_ENTRY+0x70> + // 77: 89 4f 20 movl %ecx, 0x20(%edi) + // 7a: ff 34 b3 pushl (%ebx,%esi,4) + // 7d: 52 pushl %edx + // 7e: e8 00 00 00 00 calll 0x83 <__JIT_ENTRY+0x83> + // 0000007f: IMAGE_REL_I386_REL32 _PySet_Add + // 83: 8b 54 24 10 movl 0x10(%esp), %edx + // 87: 83 c4 08 addl $0x8, %esp + // 8a: 8b 4f 20 movl 0x20(%edi), %ecx + // 8d: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 94: eb da jmp 0x70 <__JIT_ENTRY+0x70> + // 96: 89 0c 24 movl %ecx, (%esp) + // 99: b9 00 00 00 00 movl $0x0, %ecx + // 0000009a: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 9e: 66 85 c9 testw %cx, %cx + // a1: 74 3a je 0xdd <__JIT_ENTRY+0xdd> + // a3: 8d 75 01 leal 0x1(%ebp), %esi + // a6: 83 c3 fc addl $-0x4, %ebx + // a9: 89 7c 24 10 movl %edi, 0x10(%esp) + // ad: eb 0a jmp 0xb9 <__JIT_ENTRY+0xb9> + // af: 90 nop + // b0: 4e decl %esi + // b1: 83 c3 fc addl $-0x4, %ebx + // b4: 83 fe 01 cmpl $0x1, %esi + // b7: 7e 24 jle 0xdd <__JIT_ENTRY+0xdd> + // b9: 8b 0b movl (%ebx), %ecx + // bb: 8b 11 movl (%ecx), %edx + // bd: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // c3: 7f eb jg 0xb0 <__JIT_ENTRY+0xb0> + // c5: 4a decl %edx + // c6: 89 11 movl %edx, (%ecx) + // c8: 75 e6 jne 0xb0 <__JIT_ENTRY+0xb0> + // ca: 51 pushl %ecx + // cb: 89 c7 movl %eax, %edi + // cd: e8 00 00 00 00 calll 0xd2 <__JIT_ENTRY+0xd2> + // 000000ce: IMAGE_REL_I386_REL32 __Py_Dealloc + // d2: 89 f8 movl %edi, %eax + // d4: 8b 7c 24 14 movl 0x14(%esp), %edi + // d8: 83 c4 04 addl $0x4, %esp + // db: eb d3 jmp 0xb0 <__JIT_ENTRY+0xb0> + // dd: 85 c0 testl %eax, %eax + // df: 0f 84 a2 00 00 00 je 0x187 <__JIT_ENTRY+0x187> + // e5: 8b 44 24 04 movl 0x4(%esp), %eax + // e9: 8b 0c 24 movl (%esp), %ecx + // ec: 8d 04 81 leal (%ecx,%eax,4), %eax + // ef: 89 47 20 movl %eax, 0x20(%edi) + // f2: 8b 4c 24 08 movl 0x8(%esp), %ecx + // f6: 8b 01 movl (%ecx), %eax + // f8: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // fd: 8b 74 24 0c movl 0xc(%esp), %esi + // 101: 7f 0e jg 0x111 <__JIT_ENTRY+0x111> + // 103: 48 decl %eax + // 104: 89 01 movl %eax, (%ecx) + // 106: 75 09 jne 0x111 <__JIT_ENTRY+0x111> + // 108: 51 pushl %ecx + // 109: e8 00 00 00 00 calll 0x10e <__JIT_ENTRY+0x10e> + // 0000010a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 10e: 83 c4 04 addl $0x4, %esp + // 111: 8b 47 20 movl 0x20(%edi), %eax + // 114: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 11b: 89 74 24 30 movl %esi, 0x30(%esp) + // 11f: 89 44 24 2c movl %eax, 0x2c(%esp) + // 123: 89 7c 24 28 movl %edi, 0x28(%esp) + // 127: eb 52 jmp 0x17b <__JIT_ENTRY+0x17b> + // 129: 89 0c 24 movl %ecx, (%esp) + // 12c: b8 00 00 00 00 movl $0x0, %eax + // 0000012d: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 131: 66 85 c0 testw %ax, %ax + // 134: 74 2f je 0x165 <__JIT_ENTRY+0x165> + // 136: 45 incl %ebp + // 137: 83 c3 fc addl $-0x4, %ebx + // 13a: eb 0d jmp 0x149 <__JIT_ENTRY+0x149> + // 13c: 0f 1f 40 00 nopl (%eax) + // 140: 4d decl %ebp + // 141: 83 c3 fc addl $-0x4, %ebx + // 144: 83 fd 01 cmpl $0x1, %ebp + // 147: 76 1c jbe 0x165 <__JIT_ENTRY+0x165> + // 149: 8b 03 movl (%ebx), %eax + // 14b: 8b 08 movl (%eax), %ecx + // 14d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 153: 7f eb jg 0x140 <__JIT_ENTRY+0x140> + // 155: 49 decl %ecx + // 156: 89 08 movl %ecx, (%eax) + // 158: 75 e6 jne 0x140 <__JIT_ENTRY+0x140> + // 15a: 50 pushl %eax + // 15b: e8 00 00 00 00 calll 0x160 <__JIT_ENTRY+0x160> + // 0000015c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 160: 83 c4 04 addl $0x4, %esp + // 163: eb db jmp 0x140 <__JIT_ENTRY+0x140> + // 165: 8b 44 24 04 movl 0x4(%esp), %eax + // 169: 8b 0c 24 movl (%esp), %ecx + // 16c: 8d 04 81 leal (%ecx,%eax,4), %eax + // 16f: 89 74 24 30 movl %esi, 0x30(%esp) + // 173: 89 7c 24 28 movl %edi, 0x28(%esp) + // 177: 89 44 24 2c movl %eax, 0x2c(%esp) + // 17b: 83 c4 14 addl $0x14, %esp + // 17e: 5e popl %esi + // 17f: 5f popl %edi + // 180: 5b popl %ebx + // 181: 5d popl %ebp + // 182: e9 00 00 00 00 jmp 0x187 <__JIT_ENTRY+0x187> + // 00000183: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 187: 8b 74 24 0c movl 0xc(%esp), %esi + // 18b: 8b 0c 24 movl (%esp), %ecx + // 18e: 8b 54 24 08 movl 0x8(%esp), %edx + // 192: 8b 44 24 04 movl 0x4(%esp), %eax + // 196: 89 14 81 movl %edx, (%ecx,%eax,4) + // 199: b8 01 00 00 00 movl $0x1, %eax + // 19e: 29 e8 subl %ebp, %eax + // 1a0: 8d 04 81 leal (%ecx,%eax,4), %eax + // 1a3: 89 74 24 30 movl %esi, 0x30(%esp) + // 1a7: 89 7c 24 28 movl %edi, 0x28(%esp) + // 1ab: 89 44 24 2c movl %eax, 0x2c(%esp) + // 1af: 83 c4 14 addl $0x14, %esp + // 1b2: 5e popl %esi + // 1b3: 5f popl %edi + // 1b4: 5b popl %ebx + // 1b5: 5d popl %ebp + // 1b6: e9 00 00 00 00 jmp 0x1bb <__JIT_ENTRY+0x1bb> + // 000001b7: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[438] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x14, 0x8b, + 0x74, 0x24, 0x30, 0x8b, 0x5c, 0x24, 0x2c, 0x8b, + 0x7c, 0x24, 0x28, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xe8, 0x89, 0xe8, 0xf7, 0xd8, 0x89, + 0x44, 0x24, 0x04, 0x89, 0x5f, 0x20, 0x6a, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x4f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x84, 0xe7, 0x00, + 0x00, 0x00, 0x89, 0xc2, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x0f, 0x84, 0x40, 0x01, + 0x00, 0x00, 0x89, 0x74, 0x24, 0x0c, 0x31, 0xc0, + 0x8b, 0x74, 0x24, 0x04, 0x89, 0x54, 0x24, 0x08, + 0xeb, 0x11, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x74, 0x23, 0x85, 0xc0, 0x75, 0xf9, 0x89, + 0x4f, 0x20, 0xff, 0x34, 0xb3, 0x52, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, 0x10, 0x83, + 0xc4, 0x08, 0x8b, 0x4f, 0x20, 0xc7, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0xda, 0x89, 0x0c, + 0x24, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc9, 0x74, 0x3a, 0x8d, 0x75, 0x01, 0x83, 0xc3, + 0xfc, 0x89, 0x7c, 0x24, 0x10, 0xeb, 0x0a, 0x90, + 0x4e, 0x83, 0xc3, 0xfc, 0x83, 0xfe, 0x01, 0x7e, + 0x24, 0x8b, 0x0b, 0x8b, 0x11, 0x81, 0xfa, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x4a, 0x89, 0x11, + 0x75, 0xe6, 0x51, 0x89, 0xc7, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf8, 0x8b, 0x7c, 0x24, 0x14, + 0x83, 0xc4, 0x04, 0xeb, 0xd3, 0x85, 0xc0, 0x0f, + 0x84, 0xa2, 0x00, 0x00, 0x00, 0x8b, 0x44, 0x24, + 0x04, 0x8b, 0x0c, 0x24, 0x8d, 0x04, 0x81, 0x89, + 0x47, 0x20, 0x8b, 0x4c, 0x24, 0x08, 0x8b, 0x01, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x8b, 0x74, 0x24, + 0x0c, 0x7f, 0x0e, 0x48, 0x89, 0x01, 0x75, 0x09, + 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x47, 0x20, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x74, 0x24, 0x30, 0x89, + 0x44, 0x24, 0x2c, 0x89, 0x7c, 0x24, 0x28, 0xeb, + 0x52, 0x89, 0x0c, 0x24, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x2f, 0x45, 0x83, + 0xc3, 0xfc, 0xeb, 0x0d, 0x0f, 0x1f, 0x40, 0x00, + 0x4d, 0x83, 0xc3, 0xfc, 0x83, 0xfd, 0x01, 0x76, + 0x1c, 0x8b, 0x03, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x8b, 0x44, 0x24, + 0x04, 0x8b, 0x0c, 0x24, 0x8d, 0x04, 0x81, 0x89, + 0x74, 0x24, 0x30, 0x89, 0x7c, 0x24, 0x28, 0x89, + 0x44, 0x24, 0x2c, 0x83, 0xc4, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x74, 0x24, 0x0c, 0x8b, 0x0c, 0x24, 0x8b, 0x54, + 0x24, 0x08, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x14, + 0x81, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xe8, + 0x8d, 0x04, 0x81, 0x89, 0x74, 0x24, 0x30, 0x89, + 0x7c, 0x24, 0x28, 0x89, 0x44, 0x24, 0x2c, 0x83, + 0xc4, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_x86_64_32rx(code + 0x29, (uintptr_t)&PySet_New + -0x4); + patch_32(code + 0x45, instruction->oparg); + patch_x86_64_32rx(code + 0x7f, (uintptr_t)&PySet_Add + -0x4); + patch_32(code + 0x9a, instruction->oparg); + patch_x86_64_32rx(code + 0xce, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x10a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x12d, instruction->oparg); + patch_x86_64_32rx(code + 0x15c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x183, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SLICE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 54 24 28 movl 0x28(%esp), %edx + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 d8 movzwl %ax, %ebx + // 13: 8d 0c 9d 00 00 00 00 leal (,%ebx,4), %ecx + // 1a: 89 d5 movl %edx, %ebp + // 1c: 29 cd subl %ecx, %ebp + // 1e: 8b 45 00 movl (%ebp), %eax + // 21: f7 d9 negl %ecx + // 23: 89 54 24 08 movl %edx, 0x8(%esp) + // 27: 8b 4c 0a 04 movl 0x4(%edx,%ecx), %ecx + // 2b: 31 d2 xorl %edx, %edx + // 2d: 66 83 fb 03 cmpw $0x3, %bx + // 31: 75 03 jne 0x36 <__JIT_ENTRY+0x36> + // 33: 8b 55 08 movl 0x8(%ebp), %edx + // 36: 8b 74 24 2c movl 0x2c(%esp), %esi + // 3a: 89 34 24 movl %esi, (%esp) + // 3d: 8b 74 24 24 movl 0x24(%esp), %esi + // 41: 89 74 24 04 movl %esi, 0x4(%esp) + // 45: 52 pushl %edx + // 46: 51 pushl %ecx + // 47: 50 pushl %eax + // 48: e8 00 00 00 00 calll 0x4d <__JIT_ENTRY+0x4d> + // 00000049: IMAGE_REL_I386_REL32 _PySlice_New + // 4d: 83 c4 0c addl $0xc, %esp + // 50: 89 44 24 0c movl %eax, 0xc(%esp) + // 54: b8 00 00 00 00 movl $0x0, %eax + // 00000055: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 59: 66 85 c0 testw %ax, %ax + // 5c: 74 37 je 0x95 <__JIT_ENTRY+0x95> + // 5e: 8d 73 01 leal 0x1(%ebx), %esi + // 61: 8b 44 24 08 movl 0x8(%esp), %eax + // 65: 8d 78 fc leal -0x4(%eax), %edi + // 68: eb 0f jmp 0x79 <__JIT_ENTRY+0x79> + // 6a: 66 0f 1f 44 00 00 nopw (%eax,%eax) + // 70: 4e decl %esi + // 71: 83 c7 fc addl $-0x4, %edi + // 74: 83 fe 01 cmpl $0x1, %esi + // 77: 76 1c jbe 0x95 <__JIT_ENTRY+0x95> + // 79: 8b 07 movl (%edi), %eax + // 7b: 8b 08 movl (%eax), %ecx + // 7d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 83: 7f eb jg 0x70 <__JIT_ENTRY+0x70> + // 85: 49 decl %ecx + // 86: 89 08 movl %ecx, (%eax) + // 88: 75 e6 jne 0x70 <__JIT_ENTRY+0x70> + // 8a: 50 pushl %eax + // 8b: e8 00 00 00 00 calll 0x90 <__JIT_ENTRY+0x90> + // 0000008c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 90: 83 c4 04 addl $0x4, %esp + // 93: eb db jmp 0x70 <__JIT_ENTRY+0x70> + // 95: 8b 44 24 0c movl 0xc(%esp), %eax + // 99: 85 c0 testl %eax, %eax + // 9b: 74 30 je 0xcd <__JIT_ENTRY+0xcd> + // 9d: 89 45 00 movl %eax, (%ebp) + // a0: b8 01 00 00 00 movl $0x1, %eax + // a5: 29 d8 subl %ebx, %eax + // a7: 8b 4c 24 08 movl 0x8(%esp), %ecx + // ab: 8d 04 81 leal (%ecx,%eax,4), %eax + // ae: 8b 0c 24 movl (%esp), %ecx + // b1: 89 4c 24 2c movl %ecx, 0x2c(%esp) + // b5: 8b 4c 24 04 movl 0x4(%esp), %ecx + // b9: 89 4c 24 24 movl %ecx, 0x24(%esp) + // bd: 89 44 24 28 movl %eax, 0x28(%esp) + // c1: 83 c4 10 addl $0x10, %esp + // c4: 5e popl %esi + // c5: 5f popl %edi + // c6: 5b popl %ebx + // c7: 5d popl %ebp + // c8: e9 00 00 00 00 jmp 0xcd <__JIT_ENTRY+0xcd> + // 000000c9: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // cd: 8b 04 24 movl (%esp), %eax + // d0: 89 44 24 2c movl %eax, 0x2c(%esp) + // d4: 89 6c 24 28 movl %ebp, 0x28(%esp) + // d8: 8b 44 24 04 movl 0x4(%esp), %eax + // dc: 89 44 24 24 movl %eax, 0x24(%esp) + // e0: 83 c4 10 addl $0x10, %esp + // e3: 5e popl %esi + // e4: 5f popl %edi + // e5: 5b popl %ebx + // e6: 5d popl %ebp + // e7: e9 00 00 00 00 jmp 0xec <__JIT_ENTRY+0xec> + // 000000e8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[236] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x54, 0x24, 0x28, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xd8, 0x8d, 0x0c, 0x9d, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd5, 0x29, 0xcd, 0x8b, 0x45, + 0x00, 0xf7, 0xd9, 0x89, 0x54, 0x24, 0x08, 0x8b, + 0x4c, 0x0a, 0x04, 0x31, 0xd2, 0x66, 0x83, 0xfb, + 0x03, 0x75, 0x03, 0x8b, 0x55, 0x08, 0x8b, 0x74, + 0x24, 0x2c, 0x89, 0x34, 0x24, 0x8b, 0x74, 0x24, + 0x24, 0x89, 0x74, 0x24, 0x04, 0x52, 0x51, 0x50, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, + 0x89, 0x44, 0x24, 0x0c, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x37, 0x8d, 0x73, + 0x01, 0x8b, 0x44, 0x24, 0x08, 0x8d, 0x78, 0xfc, + 0xeb, 0x0f, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x4e, 0x83, 0xc7, 0xfc, 0x83, 0xfe, 0x01, 0x76, + 0x1c, 0x8b, 0x07, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x8b, 0x44, 0x24, + 0x0c, 0x85, 0xc0, 0x74, 0x30, 0x89, 0x45, 0x00, + 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xd8, 0x8b, + 0x4c, 0x24, 0x08, 0x8d, 0x04, 0x81, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x2c, 0x8b, 0x4c, 0x24, + 0x04, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x28, 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x2c, 0x89, 0x6c, 0x24, 0x28, + 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, 0x24, + 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_x86_64_32rx(code + 0x49, (uintptr_t)&PySlice_New + -0x4); + patch_32(code + 0x55, instruction->oparg); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xe8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_STRING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_STRING.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 44 24 2c movl 0x2c(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 6c 24 28 movl 0x28(%esp), %ebp + // 12: 8b 44 24 24 movl 0x24(%esp), %eax + // 16: 89 44 24 04 movl %eax, 0x4(%esp) + // 1a: b8 00 00 00 00 movl $0x0, %eax + // 0000001b: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1f: 0f b7 f8 movzwl %ax, %edi + // 22: 8d 04 bd 00 00 00 00 leal (,%edi,4), %eax + // 29: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 2d: 29 c5 subl %eax, %ebp + // 2f: 57 pushl %edi + // 30: 55 pushl %ebp + // 31: 68 04 4c 00 00 pushl $0x4c04 # imm = 0x4C04 + // 00000032: IMAGE_REL_I386_DIR32 __PyRuntime + // 36: e8 00 00 00 00 calll 0x3b <__JIT_ENTRY+0x3b> + // 00000037: IMAGE_REL_I386_REL32 __PyUnicode_JoinArray + // 3b: 83 c4 0c addl $0xc, %esp + // 3e: 89 44 24 0c movl %eax, 0xc(%esp) + // 42: 66 85 ff testw %di, %di + // 45: 74 3e je 0x85 <__JIT_ENTRY+0x85> + // 47: 8d 5f 01 leal 0x1(%edi), %ebx + // 4a: 8b 44 24 08 movl 0x8(%esp), %eax + // 4e: 8d 70 fc leal -0x4(%eax), %esi + // 51: eb 16 jmp 0x69 <__JIT_ENTRY+0x69> + // 53: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 60: 4b decl %ebx + // 61: 83 c6 fc addl $-0x4, %esi + // 64: 83 fb 01 cmpl $0x1, %ebx + // 67: 76 1c jbe 0x85 <__JIT_ENTRY+0x85> + // 69: 8b 06 movl (%esi), %eax + // 6b: 8b 08 movl (%eax), %ecx + // 6d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 73: 7f eb jg 0x60 <__JIT_ENTRY+0x60> + // 75: 49 decl %ecx + // 76: 89 08 movl %ecx, (%eax) + // 78: 75 e6 jne 0x60 <__JIT_ENTRY+0x60> + // 7a: 50 pushl %eax + // 7b: e8 00 00 00 00 calll 0x80 <__JIT_ENTRY+0x80> + // 0000007c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 80: 83 c4 04 addl $0x4, %esp + // 83: eb db jmp 0x60 <__JIT_ENTRY+0x60> + // 85: 8b 44 24 0c movl 0xc(%esp), %eax + // 89: 85 c0 testl %eax, %eax + // 8b: 74 30 je 0xbd <__JIT_ENTRY+0xbd> + // 8d: 89 45 00 movl %eax, (%ebp) + // 90: b8 01 00 00 00 movl $0x1, %eax + // 95: 29 f8 subl %edi, %eax + // 97: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 9b: 8d 04 81 leal (%ecx,%eax,4), %eax + // 9e: 8b 0c 24 movl (%esp), %ecx + // a1: 89 4c 24 2c movl %ecx, 0x2c(%esp) + // a5: 8b 4c 24 04 movl 0x4(%esp), %ecx + // a9: 89 4c 24 24 movl %ecx, 0x24(%esp) + // ad: 89 44 24 28 movl %eax, 0x28(%esp) + // b1: 83 c4 10 addl $0x10, %esp + // b4: 5e popl %esi + // b5: 5f popl %edi + // b6: 5b popl %ebx + // b7: 5d popl %ebp + // b8: e9 00 00 00 00 jmp 0xbd <__JIT_ENTRY+0xbd> + // 000000b9: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // bd: 8b 04 24 movl (%esp), %eax + // c0: 89 44 24 2c movl %eax, 0x2c(%esp) + // c4: 89 6c 24 28 movl %ebp, 0x28(%esp) + // c8: 8b 44 24 04 movl 0x4(%esp), %eax + // cc: 89 44 24 24 movl %eax, 0x24(%esp) + // d0: 83 c4 10 addl $0x10, %esp + // d3: 5e popl %esi + // d4: 5f popl %edi + // d5: 5b popl %ebx + // d6: 5d popl %ebp + // d7: e9 00 00 00 00 jmp 0xdc <__JIT_ENTRY+0xdc> + // 000000d8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[220] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x44, 0x24, 0x2c, 0x89, 0x04, 0x24, 0x8b, 0x6c, + 0x24, 0x28, 0x8b, 0x44, 0x24, 0x24, 0x89, 0x44, + 0x24, 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xf8, 0x8d, 0x04, 0xbd, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x6c, 0x24, 0x08, 0x29, 0xc5, 0x57, + 0x55, 0x68, 0x04, 0x4c, 0x00, 0x00, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x89, 0x44, + 0x24, 0x0c, 0x66, 0x85, 0xff, 0x74, 0x3e, 0x8d, + 0x5f, 0x01, 0x8b, 0x44, 0x24, 0x08, 0x8d, 0x70, + 0xfc, 0xeb, 0x16, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x83, 0xc6, 0xfc, 0x83, 0xfb, 0x01, 0x76, + 0x1c, 0x8b, 0x06, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x8b, 0x44, 0x24, + 0x0c, 0x85, 0xc0, 0x74, 0x30, 0x89, 0x45, 0x00, + 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xf8, 0x8b, + 0x4c, 0x24, 0x08, 0x8d, 0x04, 0x81, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x2c, 0x8b, 0x4c, 0x24, + 0x04, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x28, 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x2c, 0x89, 0x6c, 0x24, 0x28, + 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, 0x24, + 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1b, instruction->oparg); + patch_32(code + 0x32, (uintptr_t)&_PyRuntime + 0x4c04); + patch_x86_64_32rx(code + 0x37, (uintptr_t)&_PyUnicode_JoinArray + -0x4); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xb9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 7c 24 20 movl 0x20(%esp), %edi + // 9: 8b 74 24 1c movl 0x1c(%esp), %esi + // d: 8b 44 24 18 movl 0x18(%esp), %eax + // 11: 89 04 24 movl %eax, (%esp) + // 14: b8 00 00 00 00 movl $0x0, %eax + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 e8 movzwl %ax, %ebp + // 1c: 8d 04 ad 00 00 00 00 leal (,%ebp,4), %eax + // 23: 89 f3 movl %esi, %ebx + // 25: 29 c3 subl %eax, %ebx + // 27: 55 pushl %ebp + // 28: 53 pushl %ebx + // 29: e8 00 00 00 00 calll 0x2e <__JIT_ENTRY+0x2e> + // 0000002a: IMAGE_REL_I386_REL32 __PyTuple_FromStackRefStealOnSuccess + // 2e: 83 c4 08 addl $0x8, %esp + // 31: 85 c0 testl %eax, %eax + // 33: 74 27 je 0x5c <__JIT_ENTRY+0x5c> + // 35: 89 03 movl %eax, (%ebx) + // 37: b8 01 00 00 00 movl $0x1, %eax + // 3c: 29 e8 subl %ebp, %eax + // 3e: 8d 04 86 leal (%esi,%eax,4), %eax + // 41: 89 7c 24 20 movl %edi, 0x20(%esp) + // 45: 8b 0c 24 movl (%esp), %ecx + // 48: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 4c: 89 44 24 1c movl %eax, 0x1c(%esp) + // 50: 83 c4 04 addl $0x4, %esp + // 53: 5e popl %esi + // 54: 5f popl %edi + // 55: 5b popl %ebx + // 56: 5d popl %ebp + // 57: e9 00 00 00 00 jmp 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5c: 89 7c 24 20 movl %edi, 0x20(%esp) + // 60: 89 74 24 1c movl %esi, 0x1c(%esp) + // 64: 8b 04 24 movl (%esp), %eax + // 67: 89 44 24 18 movl %eax, 0x18(%esp) + // 6b: 83 c4 04 addl $0x4, %esp + // 6e: 5e popl %esi + // 6f: 5f popl %edi + // 70: 5b popl %ebx + // 71: 5d popl %ebp + // 72: e9 00 00 00 00 jmp 0x77 <__JIT_ENTRY+0x77> + // 00000073: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[119] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, + 0x20, 0x8b, 0x74, 0x24, 0x1c, 0x8b, 0x44, 0x24, + 0x18, 0x89, 0x04, 0x24, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xe8, 0x8d, 0x04, 0xad, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf3, 0x29, 0xc3, 0x55, + 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x08, 0x85, 0xc0, 0x74, 0x27, 0x89, 0x03, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x29, 0xe8, 0x8d, 0x04, + 0x86, 0x89, 0x7c, 0x24, 0x20, 0x8b, 0x0c, 0x24, + 0x89, 0x4c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x1c, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x20, + 0x89, 0x74, 0x24, 0x1c, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)&_PyTuple_FromStackRefStealOnSuccess + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x73, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_CLASS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 14 subl $0x14, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: 8b 6c 24 2c movl 0x2c(%esp), %ebp + // f: 8b 54 24 28 movl 0x28(%esp), %edx + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 d8 movzwl %ax, %ebx + // 1b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 20: 29 de subl %ebx, %esi + // 22: 8b 44 b5 00 movl (%ebp,%esi,4), %eax + // 26: 8b 48 04 movl 0x4(%eax), %ecx + // 29: 83 79 54 00 cmpl $0x0, 0x54(%ecx) + // 2d: 78 18 js 0x47 <__JIT_ENTRY+0x47> + // 2f: 89 7c 24 30 movl %edi, 0x30(%esp) + // 33: 89 6c 24 2c movl %ebp, 0x2c(%esp) + // 37: 89 54 24 28 movl %edx, 0x28(%esp) + // 3b: 83 c4 14 addl $0x14, %esp + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: 5b popl %ebx + // 41: 5d popl %ebp + // 42: e9 00 00 00 00 jmp 0x47 <__JIT_ENTRY+0x47> + // 00000043: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 47: 83 b8 c8 00 00 00 00 cmpl $0x0, 0xc8(%eax) + // 4e: 74 df je 0x2f <__JIT_ENTRY+0x2f> + // 50: 89 7c 24 04 movl %edi, 0x4(%esp) + // 54: 8d 0c 9d 00 00 00 00 leal (,%ebx,4), %ecx + // 5b: 89 54 24 10 movl %edx, 0x10(%esp) + // 5f: 89 ef movl %ebp, %edi + // 61: 29 cf subl %ecx, %edi + // 63: 89 d9 movl %ebx, %ecx + // 65: f7 d1 notl %ecx + // 67: 31 d2 xorl %edx, %edx + // 69: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 6d: 83 7c 8d 00 00 cmpl $0x0, (%ebp,%ecx,4) + // 72: b9 00 00 00 00 movl $0x0, %ecx + // 77: 0f 94 c1 sete %cl + // 7a: 0f 95 c2 setne %dl + // 7d: 01 da addl %ebx, %edx + // 7f: 8d 0c 8f leal (%edi,%ecx,4), %ecx + // 82: 83 c1 fc addl $-0x4, %ecx + // 85: 8b 7c 24 10 movl 0x10(%esp), %edi + // 89: 89 6f 20 movl %ebp, 0x20(%edi) + // 8c: 6a 00 pushl $0x0 + // 8e: 52 pushl %edx + // 8f: 51 pushl %ecx + // 90: 50 pushl %eax + // 91: ff 90 c8 00 00 00 calll *0xc8(%eax) + // 97: 83 c4 10 addl $0x10, %esp + // 9a: 89 44 24 0c movl %eax, 0xc(%esp) + // 9e: 8b 47 20 movl 0x20(%edi), %eax + // a1: 89 04 24 movl %eax, (%esp) + // a4: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // ab: 8b 44 b5 00 movl (%ebp,%esi,4), %eax + // af: 8b 08 movl (%eax), %ecx + // b1: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // b7: 7f 0e jg 0xc7 <__JIT_ENTRY+0xc7> + // b9: 49 decl %ecx + // ba: 89 08 movl %ecx, (%eax) + // bc: 75 09 jne 0xc7 <__JIT_ENTRY+0xc7> + // be: 50 pushl %eax + // bf: e8 00 00 00 00 calll 0xc4 <__JIT_ENTRY+0xc4> + // 000000c0: IMAGE_REL_I386_REL32 __Py_Dealloc + // c4: 83 c4 04 addl $0x4, %esp + // c7: 8b 44 24 08 movl 0x8(%esp), %eax + // cb: 8b 44 85 00 movl (%ebp,%eax,4), %eax + // cf: 85 c0 testl %eax, %eax + // d1: 74 18 je 0xeb <__JIT_ENTRY+0xeb> + // d3: 8b 08 movl (%eax), %ecx + // d5: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // db: 7f 0e jg 0xeb <__JIT_ENTRY+0xeb> + // dd: 49 decl %ecx + // de: 89 08 movl %ecx, (%eax) + // e0: 75 09 jne 0xeb <__JIT_ENTRY+0xeb> + // e2: 50 pushl %eax + // e3: e8 00 00 00 00 calll 0xe8 <__JIT_ENTRY+0xe8> + // 000000e4: IMAGE_REL_I386_REL32 __Py_Dealloc + // e8: 83 c4 04 addl $0x4, %esp + // eb: b8 00 00 00 00 movl $0x0, %eax + // 000000ec: IMAGE_REL_I386_DIR32 __JIT_OPARG + // f0: 66 85 c0 testw %ax, %ax + // f3: 74 31 je 0x126 <__JIT_ENTRY+0x126> + // f5: 43 incl %ebx + // f6: 83 c5 fc addl $-0x4, %ebp + // f9: eb 0e jmp 0x109 <__JIT_ENTRY+0x109> + // fb: 0f 1f 44 00 00 nopl (%eax,%eax) + // 100: 4b decl %ebx + // 101: 83 c5 fc addl $-0x4, %ebp + // 104: 83 fb 01 cmpl $0x1, %ebx + // 107: 76 1d jbe 0x126 <__JIT_ENTRY+0x126> + // 109: 8b 45 00 movl (%ebp), %eax + // 10c: 8b 08 movl (%eax), %ecx + // 10e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 114: 7f ea jg 0x100 <__JIT_ENTRY+0x100> + // 116: 49 decl %ecx + // 117: 89 08 movl %ecx, (%eax) + // 119: 75 e5 jne 0x100 <__JIT_ENTRY+0x100> + // 11b: 50 pushl %eax + // 11c: e8 00 00 00 00 calll 0x121 <__JIT_ENTRY+0x121> + // 0000011d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 121: 83 c4 04 addl $0x4, %esp + // 124: eb da jmp 0x100 <__JIT_ENTRY+0x100> + // 126: 8b 44 24 0c movl 0xc(%esp), %eax + // 12a: 85 c0 testl %eax, %eax + // 12c: 74 29 je 0x157 <__JIT_ENTRY+0x157> + // 12e: 8b 0c 24 movl (%esp), %ecx + // 131: 89 04 b1 movl %eax, (%ecx,%esi,4) + // 134: 8b 44 24 08 movl 0x8(%esp), %eax + // 138: 8d 04 81 leal (%ecx,%eax,4), %eax + // 13b: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 13f: 89 4c 24 30 movl %ecx, 0x30(%esp) + // 143: 89 44 24 2c movl %eax, 0x2c(%esp) + // 147: 89 7c 24 28 movl %edi, 0x28(%esp) + // 14b: 83 c4 14 addl $0x14, %esp + // 14e: 5e popl %esi + // 14f: 5f popl %edi + // 150: 5b popl %ebx + // 151: 5d popl %ebp + // 152: e9 00 00 00 00 jmp 0x157 <__JIT_ENTRY+0x157> + // 00000153: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 157: 8b 04 24 movl (%esp), %eax + // 15a: 8d 04 b0 leal (%eax,%esi,4), %eax + // 15d: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 161: 89 4c 24 30 movl %ecx, 0x30(%esp) + // 165: 89 7c 24 28 movl %edi, 0x28(%esp) + // 169: 89 44 24 2c movl %eax, 0x2c(%esp) + // 16d: 83 c4 14 addl $0x14, %esp + // 170: 5e popl %esi + // 171: 5f popl %edi + // 172: 5b popl %ebx + // 173: 5d popl %ebp + // 174: e9 00 00 00 00 jmp 0x179 <__JIT_ENTRY+0x179> + // 00000175: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[377] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x14, 0x8b, + 0x7c, 0x24, 0x30, 0x8b, 0x6c, 0x24, 0x2c, 0x8b, + 0x54, 0x24, 0x28, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xd8, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xde, 0x8b, 0x44, 0xb5, 0x00, 0x8b, 0x48, + 0x04, 0x83, 0x79, 0x54, 0x00, 0x78, 0x18, 0x89, + 0x7c, 0x24, 0x30, 0x89, 0x6c, 0x24, 0x2c, 0x89, + 0x54, 0x24, 0x28, 0x83, 0xc4, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xb8, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x74, 0xdf, + 0x89, 0x7c, 0x24, 0x04, 0x8d, 0x0c, 0x9d, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0xef, 0x29, 0xcf, 0x89, 0xd9, 0xf7, 0xd1, 0x31, + 0xd2, 0x89, 0x4c, 0x24, 0x08, 0x83, 0x7c, 0x8d, + 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x94, 0xc1, 0x0f, 0x95, 0xc2, 0x01, 0xda, 0x8d, + 0x0c, 0x8f, 0x83, 0xc1, 0xfc, 0x8b, 0x7c, 0x24, + 0x10, 0x89, 0x6f, 0x20, 0x6a, 0x00, 0x52, 0x51, + 0x50, 0xff, 0x90, 0xc8, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x8b, 0x47, + 0x20, 0x89, 0x04, 0x24, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x44, 0xb5, 0x00, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x44, 0x24, 0x08, 0x8b, 0x44, 0x85, 0x00, 0x85, + 0xc0, 0x74, 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, + 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc0, 0x74, 0x31, 0x43, 0x83, 0xc5, + 0xfc, 0xeb, 0x0e, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x4b, 0x83, 0xc5, 0xfc, 0x83, 0xfb, 0x01, 0x76, + 0x1d, 0x8b, 0x45, 0x00, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0xea, 0x49, 0x89, + 0x08, 0x75, 0xe5, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0xeb, 0xda, 0x8b, 0x44, + 0x24, 0x0c, 0x85, 0xc0, 0x74, 0x29, 0x8b, 0x0c, + 0x24, 0x89, 0x04, 0xb1, 0x8b, 0x44, 0x24, 0x08, + 0x8d, 0x04, 0x81, 0x8b, 0x4c, 0x24, 0x04, 0x89, + 0x4c, 0x24, 0x30, 0x89, 0x44, 0x24, 0x2c, 0x89, + 0x7c, 0x24, 0x28, 0x83, 0xc4, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x04, 0x24, 0x8d, 0x04, 0xb0, 0x8b, 0x4c, 0x24, + 0x04, 0x89, 0x4c, 0x24, 0x30, 0x89, 0x7c, 0x24, + 0x28, 0x89, 0x44, 0x24, 0x2c, 0x83, 0xc4, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_x86_64_32rx(code + 0x43, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xc0, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0xec, instruction->oparg); + patch_x86_64_32rx(code + 0x11d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x153, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x175, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 18 subl $0x18, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 d8 movzwl %ax, %ebx + // 13: 89 dd movl %ebx, %ebp + // 15: f7 d5 notl %ebp + // 17: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 1c: 29 d8 subl %ebx, %eax + // 1e: 83 3c af 00 cmpl $0x0, (%edi,%ebp,4) + // 22: 0f 95 04 24 setne (%esp) + // 26: 0f 94 44 24 08 sete 0x8(%esp) + // 2b: 8b 0c 87 movl (%edi,%eax,4), %ecx + // 2e: 81 79 04 00 00 00 00 cmpl $0x0, 0x4(%ecx) + // 00000031: IMAGE_REL_I386_DIR32 _PyCFunction_Type + // 35: 8b 54 24 34 movl 0x34(%esp), %edx + // 39: 8b 74 24 2c movl 0x2c(%esp), %esi + // 3d: 74 11 je 0x50 <__JIT_ENTRY+0x50> + // 3f: 89 54 24 34 movl %edx, 0x34(%esp) + // 43: 89 7c 24 30 movl %edi, 0x30(%esp) + // 47: 89 74 24 2c movl %esi, 0x2c(%esp) + // 4b: e9 2d 01 00 00 jmp 0x17d <__JIT_ENTRY+0x17d> + // 50: 89 54 24 0c movl %edx, 0xc(%esp) + // 54: 89 44 24 14 movl %eax, 0x14(%esp) + // 58: 89 74 24 04 movl %esi, 0x4(%esp) + // 5c: 8b 71 08 movl 0x8(%ecx), %esi + // 5f: 81 7e 08 80 00 00 00 cmpl $0x80, 0x8(%esi) + // 66: 0f 85 fd 00 00 00 jne 0x169 <__JIT_ENTRY+0x169> + // 6c: 89 6c 24 10 movl %ebp, 0x10(%esp) + // 70: 8d 14 9d 00 00 00 00 leal (,%ebx,4), %edx + // 77: 89 fd movl %edi, %ebp + // 79: 29 d5 subl %edx, %ebp + // 7b: 31 c0 xorl %eax, %eax + // 7d: 0f b6 54 24 08 movzbl 0x8(%esp), %edx + // 82: 88 d0 movb %dl, %al + // 84: 8d 04 85 fc ff ff ff leal -0x4(,%eax,4), %eax + // 8b: 01 e8 addl %ebp, %eax + // 8d: 89 44 24 08 movl %eax, 0x8(%esp) + // 91: 31 c0 xorl %eax, %eax + // 93: 0f b6 14 24 movzbl (%esp), %edx + // 97: 88 d0 movb %dl, %al + // 99: 01 d8 addl %ebx, %eax + // 9b: 8b 56 04 movl 0x4(%esi), %edx + // 9e: 89 14 24 movl %edx, (%esp) + // a1: 8b 54 24 04 movl 0x4(%esp), %edx + // a5: 89 7a 20 movl %edi, 0x20(%edx) + // a8: 8b 69 08 movl 0x8(%ecx), %ebp + // ab: 31 d2 xorl %edx, %edx + // ad: f6 45 08 20 testb $0x20, 0x8(%ebp) + // b1: 75 03 jne 0xb6 <__JIT_ENTRY+0xb6> + // b3: 8b 51 0c movl 0xc(%ecx), %edx + // b6: 50 pushl %eax + // b7: ff 74 24 0c pushl 0xc(%esp) + // bb: 52 pushl %edx + // bc: ff 54 24 0c calll *0xc(%esp) + // c0: 83 c4 0c addl $0xc, %esp + // c3: 89 44 24 08 movl %eax, 0x8(%esp) + // c7: 8b 54 24 04 movl 0x4(%esp), %edx + // cb: 8b 42 20 movl 0x20(%edx), %eax + // ce: 89 04 24 movl %eax, (%esp) + // d1: c7 42 20 00 00 00 00 movl $0x0, 0x20(%edx) + // d8: 8b 74 24 14 movl 0x14(%esp), %esi + // dc: 8b 04 b7 movl (%edi,%esi,4), %eax + // df: 8b 08 movl (%eax), %ecx + // e1: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // e7: 8b 6c 24 10 movl 0x10(%esp), %ebp + // eb: 7f 12 jg 0xff <__JIT_ENTRY+0xff> + // ed: 49 decl %ecx + // ee: 89 08 movl %ecx, (%eax) + // f0: 75 0d jne 0xff <__JIT_ENTRY+0xff> + // f2: 50 pushl %eax + // f3: e8 00 00 00 00 calll 0xf8 <__JIT_ENTRY+0xf8> + // 000000f4: IMAGE_REL_I386_REL32 __Py_Dealloc + // f8: 8b 54 24 08 movl 0x8(%esp), %edx + // fc: 83 c4 04 addl $0x4, %esp + // ff: 8b 04 af movl (%edi,%ebp,4), %eax + // 102: 85 c0 testl %eax, %eax + // 104: 74 1c je 0x122 <__JIT_ENTRY+0x122> + // 106: 8b 08 movl (%eax), %ecx + // 108: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 10e: 7f 12 jg 0x122 <__JIT_ENTRY+0x122> + // 110: 49 decl %ecx + // 111: 89 08 movl %ecx, (%eax) + // 113: 75 0d jne 0x122 <__JIT_ENTRY+0x122> + // 115: 50 pushl %eax + // 116: e8 00 00 00 00 calll 0x11b <__JIT_ENTRY+0x11b> + // 00000117: IMAGE_REL_I386_REL32 __Py_Dealloc + // 11b: 8b 54 24 08 movl 0x8(%esp), %edx + // 11f: 83 c4 04 addl $0x4, %esp + // 122: b8 00 00 00 00 movl $0x0, %eax + // 00000123: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 127: 66 85 c0 testw %ax, %ax + // 12a: 74 5d je 0x189 <__JIT_ENTRY+0x189> + // 12c: 43 incl %ebx + // 12d: 83 c7 fc addl $-0x4, %edi + // 130: eb 17 jmp 0x149 <__JIT_ENTRY+0x149> + // 132: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 140: 4b decl %ebx + // 141: 83 c7 fc addl $-0x4, %edi + // 144: 83 fb 01 cmpl $0x1, %ebx + // 147: 76 40 jbe 0x189 <__JIT_ENTRY+0x189> + // 149: 8b 07 movl (%edi), %eax + // 14b: 8b 08 movl (%eax), %ecx + // 14d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 153: 7f eb jg 0x140 <__JIT_ENTRY+0x140> + // 155: 49 decl %ecx + // 156: 89 08 movl %ecx, (%eax) + // 158: 75 e6 jne 0x140 <__JIT_ENTRY+0x140> + // 15a: 50 pushl %eax + // 15b: e8 00 00 00 00 calll 0x160 <__JIT_ENTRY+0x160> + // 0000015c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 160: 8b 54 24 08 movl 0x8(%esp), %edx + // 164: 83 c4 04 addl $0x4, %esp + // 167: eb d7 jmp 0x140 <__JIT_ENTRY+0x140> + // 169: 8b 44 24 0c movl 0xc(%esp), %eax + // 16d: 89 44 24 34 movl %eax, 0x34(%esp) + // 171: 89 7c 24 30 movl %edi, 0x30(%esp) + // 175: 8b 44 24 04 movl 0x4(%esp), %eax + // 179: 89 44 24 2c movl %eax, 0x2c(%esp) + // 17d: 83 c4 18 addl $0x18, %esp + // 180: 5e popl %esi + // 181: 5f popl %edi + // 182: 5b popl %ebx + // 183: 5d popl %ebp + // 184: e9 00 00 00 00 jmp 0x189 <__JIT_ENTRY+0x189> + // 00000185: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 189: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 18d: 85 c9 testl %ecx, %ecx + // 18f: 74 25 je 0x1b6 <__JIT_ENTRY+0x1b6> + // 191: 8b 04 24 movl (%esp), %eax + // 194: 89 0c b0 movl %ecx, (%eax,%esi,4) + // 197: 8d 04 a8 leal (%eax,%ebp,4), %eax + // 19a: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 19e: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 1a2: 89 44 24 30 movl %eax, 0x30(%esp) + // 1a6: 89 54 24 2c movl %edx, 0x2c(%esp) + // 1aa: 83 c4 18 addl $0x18, %esp + // 1ad: 5e popl %esi + // 1ae: 5f popl %edi + // 1af: 5b popl %ebx + // 1b0: 5d popl %ebp + // 1b1: e9 00 00 00 00 jmp 0x1b6 <__JIT_ENTRY+0x1b6> + // 000001b2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 1b6: 8b 04 24 movl (%esp), %eax + // 1b9: 8d 04 b0 leal (%eax,%esi,4), %eax + // 1bc: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 1c0: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 1c4: 89 54 24 2c movl %edx, 0x2c(%esp) + // 1c8: 89 44 24 30 movl %eax, 0x30(%esp) + // 1cc: 83 c4 18 addl $0x18, %esp + // 1cf: 5e popl %esi + // 1d0: 5f popl %edi + // 1d1: 5b popl %ebx + // 1d2: 5d popl %ebp + // 1d3: e9 00 00 00 00 jmp 0x1d8 <__JIT_ENTRY+0x1d8> + // 000001d4: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[472] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x18, 0x8b, + 0x7c, 0x24, 0x30, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xd8, 0x89, 0xdd, 0xf7, 0xd5, 0xb8, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xd8, 0x83, 0x3c, + 0xaf, 0x00, 0x0f, 0x95, 0x04, 0x24, 0x0f, 0x94, + 0x44, 0x24, 0x08, 0x8b, 0x0c, 0x87, 0x81, 0x79, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, + 0x34, 0x8b, 0x74, 0x24, 0x2c, 0x74, 0x11, 0x89, + 0x54, 0x24, 0x34, 0x89, 0x7c, 0x24, 0x30, 0x89, + 0x74, 0x24, 0x2c, 0xe9, 0x2d, 0x01, 0x00, 0x00, + 0x89, 0x54, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x04, 0x8b, 0x71, 0x08, 0x81, + 0x7e, 0x08, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x85, + 0xfd, 0x00, 0x00, 0x00, 0x89, 0x6c, 0x24, 0x10, + 0x8d, 0x14, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xfd, 0x29, 0xd5, 0x31, 0xc0, 0x0f, 0xb6, 0x54, + 0x24, 0x08, 0x88, 0xd0, 0x8d, 0x04, 0x85, 0xfc, + 0xff, 0xff, 0xff, 0x01, 0xe8, 0x89, 0x44, 0x24, + 0x08, 0x31, 0xc0, 0x0f, 0xb6, 0x14, 0x24, 0x88, + 0xd0, 0x01, 0xd8, 0x8b, 0x56, 0x04, 0x89, 0x14, + 0x24, 0x8b, 0x54, 0x24, 0x04, 0x89, 0x7a, 0x20, + 0x8b, 0x69, 0x08, 0x31, 0xd2, 0xf6, 0x45, 0x08, + 0x20, 0x75, 0x03, 0x8b, 0x51, 0x0c, 0x50, 0xff, + 0x74, 0x24, 0x0c, 0x52, 0xff, 0x54, 0x24, 0x0c, + 0x83, 0xc4, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x8b, + 0x54, 0x24, 0x04, 0x8b, 0x42, 0x20, 0x89, 0x04, + 0x24, 0xc7, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x04, 0xb7, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x8b, + 0x6c, 0x24, 0x10, 0x7f, 0x12, 0x49, 0x89, 0x08, + 0x75, 0x0d, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x08, 0x83, 0xc4, 0x04, 0x8b, + 0x04, 0xaf, 0x85, 0xc0, 0x74, 0x1c, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x08, 0x75, 0x0d, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, 0x08, 0x83, + 0xc4, 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x5d, 0x43, 0x83, 0xc7, 0xfc, + 0xeb, 0x17, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x83, 0xc7, 0xfc, 0x83, 0xfb, 0x01, 0x76, + 0x40, 0x8b, 0x07, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x08, 0x83, 0xc4, 0x04, 0xeb, + 0xd7, 0x8b, 0x44, 0x24, 0x0c, 0x89, 0x44, 0x24, + 0x34, 0x89, 0x7c, 0x24, 0x30, 0x8b, 0x44, 0x24, + 0x04, 0x89, 0x44, 0x24, 0x2c, 0x83, 0xc4, 0x18, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4c, 0x24, 0x08, 0x85, 0xc9, 0x74, + 0x25, 0x8b, 0x04, 0x24, 0x89, 0x0c, 0xb0, 0x8d, + 0x04, 0xa8, 0x8b, 0x4c, 0x24, 0x0c, 0x89, 0x4c, + 0x24, 0x34, 0x89, 0x44, 0x24, 0x30, 0x89, 0x54, + 0x24, 0x2c, 0x83, 0xc4, 0x18, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, + 0x24, 0x8d, 0x04, 0xb0, 0x8b, 0x4c, 0x24, 0x0c, + 0x89, 0x4c, 0x24, 0x34, 0x89, 0x54, 0x24, 0x2c, + 0x89, 0x44, 0x24, 0x30, 0x83, 0xc4, 0x18, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_32(code + 0x31, (uintptr_t)&PyCFunction_Type); + patch_x86_64_32rx(code + 0xf4, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x117, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x123, instruction->oparg); + patch_x86_64_32rx(code + 0x15c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x185, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1b2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x1d4, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST_WITH_KEYWORDS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 18 subl $0x18, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 d8 movzwl %ax, %ebx + // 13: 89 de movl %ebx, %esi + // 15: f7 d6 notl %esi + // 17: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 1c: 29 d8 subl %ebx, %eax + // 1e: 83 3c b7 00 cmpl $0x0, (%edi,%esi,4) + // 22: 0f 95 44 24 04 setne 0x4(%esp) + // 27: 0f 94 04 24 sete (%esp) + // 2b: 8b 0c 87 movl (%edi,%eax,4), %ecx + // 2e: 81 79 04 00 00 00 00 cmpl $0x0, 0x4(%ecx) + // 00000031: IMAGE_REL_I386_DIR32 _PyCFunction_Type + // 35: 8b 54 24 34 movl 0x34(%esp), %edx + // 39: 8b 6c 24 2c movl 0x2c(%esp), %ebp + // 3d: 74 11 je 0x50 <__JIT_ENTRY+0x50> + // 3f: 89 54 24 34 movl %edx, 0x34(%esp) + // 43: 89 7c 24 30 movl %edi, 0x30(%esp) + // 47: 89 6c 24 2c movl %ebp, 0x2c(%esp) + // 4b: e9 1d 01 00 00 jmp 0x16d <__JIT_ENTRY+0x16d> + // 50: 89 54 24 0c movl %edx, 0xc(%esp) + // 54: 89 44 24 08 movl %eax, 0x8(%esp) + // 58: 89 6c 24 10 movl %ebp, 0x10(%esp) + // 5c: 8b 69 08 movl 0x8(%ecx), %ebp + // 5f: 81 7d 08 82 00 00 00 cmpl $0x82, 0x8(%ebp) + // 66: 0f 85 ed 00 00 00 jne 0x159 <__JIT_ENTRY+0x159> + // 6c: 89 74 24 14 movl %esi, 0x14(%esp) + // 70: 8d 2c 9d 00 00 00 00 leal (,%ebx,4), %ebp + // 77: 89 fe movl %edi, %esi + // 79: 29 ee subl %ebp, %esi + // 7b: 31 c0 xorl %eax, %eax + // 7d: 0f b6 14 24 movzbl (%esp), %edx + // 81: 88 d0 movb %dl, %al + // 83: 8d 04 86 leal (%esi,%eax,4), %eax + // 86: 83 c0 fc addl $-0x4, %eax + // 89: 89 04 24 movl %eax, (%esp) + // 8c: 31 c0 xorl %eax, %eax + // 8e: 0f b6 54 24 04 movzbl 0x4(%esp), %edx + // 93: 88 d0 movb %dl, %al + // 95: 01 d8 addl %ebx, %eax + // 97: 89 c6 movl %eax, %esi + // 99: 8b 6c 24 10 movl 0x10(%esp), %ebp + // 9d: 89 7d 20 movl %edi, 0x20(%ebp) + // a0: 8b 51 08 movl 0x8(%ecx), %edx + // a3: 31 c0 xorl %eax, %eax + // a5: f6 42 08 20 testb $0x20, 0x8(%edx) + // a9: 8b 52 04 movl 0x4(%edx), %edx + // ac: 75 03 jne 0xb1 <__JIT_ENTRY+0xb1> + // ae: 8b 41 0c movl 0xc(%ecx), %eax + // b1: 6a 00 pushl $0x0 + // b3: 56 pushl %esi + // b4: ff 74 24 08 pushl 0x8(%esp) + // b8: 50 pushl %eax + // b9: ff d2 calll *%edx + // bb: 83 c4 10 addl $0x10, %esp + // be: 89 04 24 movl %eax, (%esp) + // c1: 8b 45 20 movl 0x20(%ebp), %eax + // c4: 89 44 24 04 movl %eax, 0x4(%esp) + // c8: c7 45 20 00 00 00 00 movl $0x0, 0x20(%ebp) + // cf: 8b 54 24 08 movl 0x8(%esp), %edx + // d3: 8b 04 97 movl (%edi,%edx,4), %eax + // d6: 8b 08 movl (%eax), %ecx + // d8: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // de: 8b 74 24 14 movl 0x14(%esp), %esi + // e2: 7f 12 jg 0xf6 <__JIT_ENTRY+0xf6> + // e4: 49 decl %ecx + // e5: 89 08 movl %ecx, (%eax) + // e7: 75 0d jne 0xf6 <__JIT_ENTRY+0xf6> + // e9: 50 pushl %eax + // ea: e8 00 00 00 00 calll 0xef <__JIT_ENTRY+0xef> + // 000000eb: IMAGE_REL_I386_REL32 __Py_Dealloc + // ef: 8b 54 24 0c movl 0xc(%esp), %edx + // f3: 83 c4 04 addl $0x4, %esp + // f6: 8b 04 b7 movl (%edi,%esi,4), %eax + // f9: 85 c0 testl %eax, %eax + // fb: 74 1c je 0x119 <__JIT_ENTRY+0x119> + // fd: 8b 08 movl (%eax), %ecx + // ff: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 105: 7f 12 jg 0x119 <__JIT_ENTRY+0x119> + // 107: 49 decl %ecx + // 108: 89 08 movl %ecx, (%eax) + // 10a: 75 0d jne 0x119 <__JIT_ENTRY+0x119> + // 10c: 50 pushl %eax + // 10d: e8 00 00 00 00 calll 0x112 <__JIT_ENTRY+0x112> + // 0000010e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 112: 8b 54 24 0c movl 0xc(%esp), %edx + // 116: 83 c4 04 addl $0x4, %esp + // 119: b8 00 00 00 00 movl $0x0, %eax + // 0000011a: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 11e: 66 85 c0 testw %ax, %ax + // 121: 74 56 je 0x179 <__JIT_ENTRY+0x179> + // 123: 43 incl %ebx + // 124: 83 c7 fc addl $-0x4, %edi + // 127: eb 10 jmp 0x139 <__JIT_ENTRY+0x139> + // 129: 0f 1f 80 00 00 00 00 nopl (%eax) + // 130: 4b decl %ebx + // 131: 83 c7 fc addl $-0x4, %edi + // 134: 83 fb 01 cmpl $0x1, %ebx + // 137: 76 40 jbe 0x179 <__JIT_ENTRY+0x179> + // 139: 8b 07 movl (%edi), %eax + // 13b: 8b 08 movl (%eax), %ecx + // 13d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 143: 7f eb jg 0x130 <__JIT_ENTRY+0x130> + // 145: 49 decl %ecx + // 146: 89 08 movl %ecx, (%eax) + // 148: 75 e6 jne 0x130 <__JIT_ENTRY+0x130> + // 14a: 50 pushl %eax + // 14b: e8 00 00 00 00 calll 0x150 <__JIT_ENTRY+0x150> + // 0000014c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 150: 8b 54 24 0c movl 0xc(%esp), %edx + // 154: 83 c4 04 addl $0x4, %esp + // 157: eb d7 jmp 0x130 <__JIT_ENTRY+0x130> + // 159: 8b 44 24 0c movl 0xc(%esp), %eax + // 15d: 89 44 24 34 movl %eax, 0x34(%esp) + // 161: 89 7c 24 30 movl %edi, 0x30(%esp) + // 165: 8b 44 24 10 movl 0x10(%esp), %eax + // 169: 89 44 24 2c movl %eax, 0x2c(%esp) + // 16d: 83 c4 18 addl $0x18, %esp + // 170: 5e popl %esi + // 171: 5f popl %edi + // 172: 5b popl %ebx + // 173: 5d popl %ebp + // 174: e9 00 00 00 00 jmp 0x179 <__JIT_ENTRY+0x179> + // 00000175: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 179: 8b 0c 24 movl (%esp), %ecx + // 17c: 85 c9 testl %ecx, %ecx + // 17e: 74 26 je 0x1a6 <__JIT_ENTRY+0x1a6> + // 180: 8b 44 24 04 movl 0x4(%esp), %eax + // 184: 89 0c 90 movl %ecx, (%eax,%edx,4) + // 187: 8d 04 b0 leal (%eax,%esi,4), %eax + // 18a: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 18e: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 192: 89 44 24 30 movl %eax, 0x30(%esp) + // 196: 89 6c 24 2c movl %ebp, 0x2c(%esp) + // 19a: 83 c4 18 addl $0x18, %esp + // 19d: 5e popl %esi + // 19e: 5f popl %edi + // 19f: 5b popl %ebx + // 1a0: 5d popl %ebp + // 1a1: e9 00 00 00 00 jmp 0x1a6 <__JIT_ENTRY+0x1a6> + // 000001a2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 1a6: 8b 44 24 04 movl 0x4(%esp), %eax + // 1aa: 8d 04 90 leal (%eax,%edx,4), %eax + // 1ad: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 1b1: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 1b5: 89 6c 24 2c movl %ebp, 0x2c(%esp) + // 1b9: 89 44 24 30 movl %eax, 0x30(%esp) + // 1bd: 83 c4 18 addl $0x18, %esp + // 1c0: 5e popl %esi + // 1c1: 5f popl %edi + // 1c2: 5b popl %ebx + // 1c3: 5d popl %ebp + // 1c4: e9 00 00 00 00 jmp 0x1c9 <__JIT_ENTRY+0x1c9> + // 000001c5: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[457] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x18, 0x8b, + 0x7c, 0x24, 0x30, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xd8, 0x89, 0xde, 0xf7, 0xd6, 0xb8, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xd8, 0x83, 0x3c, + 0xb7, 0x00, 0x0f, 0x95, 0x44, 0x24, 0x04, 0x0f, + 0x94, 0x04, 0x24, 0x8b, 0x0c, 0x87, 0x81, 0x79, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, + 0x34, 0x8b, 0x6c, 0x24, 0x2c, 0x74, 0x11, 0x89, + 0x54, 0x24, 0x34, 0x89, 0x7c, 0x24, 0x30, 0x89, + 0x6c, 0x24, 0x2c, 0xe9, 0x1d, 0x01, 0x00, 0x00, + 0x89, 0x54, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, + 0x89, 0x6c, 0x24, 0x10, 0x8b, 0x69, 0x08, 0x81, + 0x7d, 0x08, 0x82, 0x00, 0x00, 0x00, 0x0f, 0x85, + 0xed, 0x00, 0x00, 0x00, 0x89, 0x74, 0x24, 0x14, + 0x8d, 0x2c, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xfe, 0x29, 0xee, 0x31, 0xc0, 0x0f, 0xb6, 0x14, + 0x24, 0x88, 0xd0, 0x8d, 0x04, 0x86, 0x83, 0xc0, + 0xfc, 0x89, 0x04, 0x24, 0x31, 0xc0, 0x0f, 0xb6, + 0x54, 0x24, 0x04, 0x88, 0xd0, 0x01, 0xd8, 0x89, + 0xc6, 0x8b, 0x6c, 0x24, 0x10, 0x89, 0x7d, 0x20, + 0x8b, 0x51, 0x08, 0x31, 0xc0, 0xf6, 0x42, 0x08, + 0x20, 0x8b, 0x52, 0x04, 0x75, 0x03, 0x8b, 0x41, + 0x0c, 0x6a, 0x00, 0x56, 0xff, 0x74, 0x24, 0x08, + 0x50, 0xff, 0xd2, 0x83, 0xc4, 0x10, 0x89, 0x04, + 0x24, 0x8b, 0x45, 0x20, 0x89, 0x44, 0x24, 0x04, + 0xc7, 0x45, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x54, 0x24, 0x08, 0x8b, 0x04, 0x97, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x8b, 0x74, + 0x24, 0x14, 0x7f, 0x12, 0x49, 0x89, 0x08, 0x75, + 0x0d, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x54, 0x24, 0x0c, 0x83, 0xc4, 0x04, 0x8b, 0x04, + 0xb7, 0x85, 0xc0, 0x74, 0x1c, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, + 0x89, 0x08, 0x75, 0x0d, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x54, 0x24, 0x0c, 0x83, 0xc4, + 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x56, 0x43, 0x83, 0xc7, 0xfc, 0xeb, + 0x10, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x83, 0xc7, 0xfc, 0x83, 0xfb, 0x01, 0x76, + 0x40, 0x8b, 0x07, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x0c, 0x83, 0xc4, 0x04, 0xeb, + 0xd7, 0x8b, 0x44, 0x24, 0x0c, 0x89, 0x44, 0x24, + 0x34, 0x89, 0x7c, 0x24, 0x30, 0x8b, 0x44, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x2c, 0x83, 0xc4, 0x18, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0c, 0x24, 0x85, 0xc9, 0x74, 0x26, + 0x8b, 0x44, 0x24, 0x04, 0x89, 0x0c, 0x90, 0x8d, + 0x04, 0xb0, 0x8b, 0x4c, 0x24, 0x0c, 0x89, 0x4c, + 0x24, 0x34, 0x89, 0x44, 0x24, 0x30, 0x89, 0x6c, + 0x24, 0x2c, 0x83, 0xc4, 0x18, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x44, + 0x24, 0x04, 0x8d, 0x04, 0x90, 0x8b, 0x4c, 0x24, + 0x0c, 0x89, 0x4c, 0x24, 0x34, 0x89, 0x6c, 0x24, + 0x2c, 0x89, 0x44, 0x24, 0x30, 0x83, 0xc4, 0x18, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_32(code + 0x31, (uintptr_t)&PyCFunction_Type); + patch_x86_64_32rx(code + 0xeb, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x10e, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x11a, instruction->oparg); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x175, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1a2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x1c5, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_O.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 74 24 2c movl 0x2c(%esp), %esi + // b: 8b 6c 24 28 movl 0x28(%esp), %ebp + // f: 8b 7c 24 24 movl 0x24(%esp), %edi + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 c0 movzwl %ax, %eax + // 1b: 89 c2 movl %eax, %edx + // 1d: f7 d2 notl %edx + // 1f: 31 c9 xorl %ecx, %ecx + // 21: 31 db xorl %ebx, %ebx + // 23: 83 7c 95 00 00 cmpl $0x0, (%ebp,%edx,4) + // 28: 0f 94 c2 sete %dl + // 2b: 0f 95 c3 setne %bl + // 2e: 01 c3 addl %eax, %ebx + // 30: 83 fb 01 cmpl $0x1, %ebx + // 33: 0f 85 1f 01 00 00 jne 0x158 <__JIT_ENTRY+0x158> + // 39: 88 54 24 04 movb %dl, 0x4(%esp) + // 3d: 89 34 24 movl %esi, (%esp) + // 40: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 45: 29 c6 subl %eax, %esi + // 47: 8b 54 b5 00 movl (%ebp,%esi,4), %edx + // 4b: 81 7a 04 00 00 00 00 cmpl $0x0, 0x4(%edx) + // 0000004e: IMAGE_REL_I386_DIR32 _PyCFunction_Type + // 52: 0f 85 06 01 00 00 jne 0x15e <__JIT_ENTRY+0x15e> + // 58: 8b 5a 08 movl 0x8(%edx), %ebx + // 5b: 83 7b 08 08 cmpl $0x8, 0x8(%ebx) + // 5f: 0f 85 f9 00 00 00 jne 0x15e <__JIT_ENTRY+0x15e> + // 65: 89 5c 24 08 movl %ebx, 0x8(%esp) + // 69: 8b 1c 24 movl (%esp), %ebx + // 6c: 8b 5b 24 movl 0x24(%ebx), %ebx + // 6f: 85 db testl %ebx, %ebx + // 71: 0f 8e e7 00 00 00 jle 0x15e <__JIT_ENTRY+0x15e> + // 77: c1 e0 02 shll $0x2, %eax + // 7a: 89 6c 24 0c movl %ebp, 0xc(%esp) + // 7e: 29 44 24 0c subl %eax, 0xc(%esp) + // 82: 0f b6 44 24 04 movzbl 0x4(%esp), %eax + // 87: 88 c1 movb %al, %cl + // 89: 8d 0c 8d fc ff ff ff leal -0x4(,%ecx,4), %ecx + // 90: 8b 44 24 08 movl 0x8(%esp), %eax + // 94: 8b 40 04 movl 0x4(%eax), %eax + // 97: 89 44 24 08 movl %eax, 0x8(%esp) + // 9b: 8b 44 24 0c movl 0xc(%esp), %eax + // 9f: 8b 04 08 movl (%eax,%ecx), %eax + // a2: 89 44 24 04 movl %eax, 0x4(%esp) + // a6: 4b decl %ebx + // a7: 8b 04 24 movl (%esp), %eax + // aa: 89 58 24 movl %ebx, 0x24(%eax) + // ad: 89 6f 20 movl %ebp, 0x20(%edi) + // b0: 8b 42 08 movl 0x8(%edx), %eax + // b3: 31 c9 xorl %ecx, %ecx + // b5: f6 40 08 20 testb $0x20, 0x8(%eax) + // b9: 75 03 jne 0xbe <__JIT_ENTRY+0xbe> + // bb: 8b 4a 0c movl 0xc(%edx), %ecx + // be: 8b 5c 24 04 movl 0x4(%esp), %ebx + // c2: 53 pushl %ebx + // c3: 51 pushl %ecx + // c4: ff 54 24 10 calll *0x10(%esp) + // c8: 89 da movl %ebx, %edx + // ca: 83 c4 08 addl $0x8, %esp + // cd: 8b 4f 20 movl 0x20(%edi), %ecx + // d0: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // d7: 8b 1c 24 movl (%esp), %ebx + // da: ff 43 24 incl 0x24(%ebx) + // dd: 89 4f 20 movl %ecx, 0x20(%edi) + // e0: 8b 0a movl (%edx), %ecx + // e2: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // e8: 7f 16 jg 0x100 <__JIT_ENTRY+0x100> + // ea: 49 decl %ecx + // eb: 89 0a movl %ecx, (%edx) + // ed: 75 11 jne 0x100 <__JIT_ENTRY+0x100> + // ef: 52 pushl %edx + // f0: 89 44 24 08 movl %eax, 0x8(%esp) + // f4: e8 00 00 00 00 calll 0xf9 <__JIT_ENTRY+0xf9> + // 000000f5: IMAGE_REL_I386_REL32 __Py_Dealloc + // f9: 8b 44 24 08 movl 0x8(%esp), %eax + // fd: 83 c4 04 addl $0x4, %esp + // 100: 8d 0c b5 00 00 00 00 leal (,%esi,4), %ecx + // 107: 01 4f 20 addl %ecx, 0x20(%edi) + // 10a: 8b 54 b5 00 movl (%ebp,%esi,4), %edx + // 10e: 8b 0a movl (%edx), %ecx + // 110: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 116: 7f 12 jg 0x12a <__JIT_ENTRY+0x12a> + // 118: 49 decl %ecx + // 119: 89 0a movl %ecx, (%edx) + // 11b: 75 0d jne 0x12a <__JIT_ENTRY+0x12a> + // 11d: 52 pushl %edx + // 11e: 89 c6 movl %eax, %esi + // 120: e8 00 00 00 00 calll 0x125 <__JIT_ENTRY+0x125> + // 00000121: IMAGE_REL_I386_REL32 __Py_Dealloc + // 125: 89 f0 movl %esi, %eax + // 127: 83 c4 04 addl $0x4, %esp + // 12a: 8b 4f 20 movl 0x20(%edi), %ecx + // 12d: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 134: 85 c0 testl %eax, %eax + // 136: 8b 1c 24 movl (%esp), %ebx + // 139: 74 3e je 0x179 <__JIT_ENTRY+0x179> + // 13b: 89 01 movl %eax, (%ecx) + // 13d: 83 c1 04 addl $0x4, %ecx + // 140: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 144: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 148: 89 7c 24 24 movl %edi, 0x24(%esp) + // 14c: 83 c4 10 addl $0x10, %esp + // 14f: 5e popl %esi + // 150: 5f popl %edi + // 151: 5b popl %ebx + // 152: 5d popl %ebp + // 153: e9 00 00 00 00 jmp 0x158 <__JIT_ENTRY+0x158> + // 00000154: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 158: 89 74 24 2c movl %esi, 0x2c(%esp) + // 15c: eb 07 jmp 0x165 <__JIT_ENTRY+0x165> + // 15e: 8b 04 24 movl (%esp), %eax + // 161: 89 44 24 2c movl %eax, 0x2c(%esp) + // 165: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 169: 89 7c 24 24 movl %edi, 0x24(%esp) + // 16d: 83 c4 10 addl $0x10, %esp + // 170: 5e popl %esi + // 171: 5f popl %edi + // 172: 5b popl %ebx + // 173: 5d popl %ebp + // 174: e9 00 00 00 00 jmp 0x179 <__JIT_ENTRY+0x179> + // 00000175: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 179: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 17d: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 181: 89 7c 24 24 movl %edi, 0x24(%esp) + // 185: 83 c4 10 addl $0x10, %esp + // 188: 5e popl %esi + // 189: 5f popl %edi + // 18a: 5b popl %ebx + // 18b: 5d popl %ebp + // 18c: e9 00 00 00 00 jmp 0x191 <__JIT_ENTRY+0x191> + // 0000018d: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[401] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x74, 0x24, 0x2c, 0x8b, 0x6c, 0x24, 0x28, 0x8b, + 0x7c, 0x24, 0x24, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc0, 0x89, 0xc2, 0xf7, 0xd2, 0x31, + 0xc9, 0x31, 0xdb, 0x83, 0x7c, 0x95, 0x00, 0x00, + 0x0f, 0x94, 0xc2, 0x0f, 0x95, 0xc3, 0x01, 0xc3, + 0x83, 0xfb, 0x01, 0x0f, 0x85, 0x1f, 0x01, 0x00, + 0x00, 0x88, 0x54, 0x24, 0x04, 0x89, 0x34, 0x24, + 0xbe, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc6, 0x8b, + 0x54, 0xb5, 0x00, 0x81, 0x7a, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x85, 0x06, 0x01, 0x00, 0x00, + 0x8b, 0x5a, 0x08, 0x83, 0x7b, 0x08, 0x08, 0x0f, + 0x85, 0xf9, 0x00, 0x00, 0x00, 0x89, 0x5c, 0x24, + 0x08, 0x8b, 0x1c, 0x24, 0x8b, 0x5b, 0x24, 0x85, + 0xdb, 0x0f, 0x8e, 0xe7, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x02, 0x89, 0x6c, 0x24, 0x0c, 0x29, 0x44, + 0x24, 0x0c, 0x0f, 0xb6, 0x44, 0x24, 0x04, 0x88, + 0xc1, 0x8d, 0x0c, 0x8d, 0xfc, 0xff, 0xff, 0xff, + 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x40, 0x04, 0x89, + 0x44, 0x24, 0x08, 0x8b, 0x44, 0x24, 0x0c, 0x8b, + 0x04, 0x08, 0x89, 0x44, 0x24, 0x04, 0x4b, 0x8b, + 0x04, 0x24, 0x89, 0x58, 0x24, 0x89, 0x6f, 0x20, + 0x8b, 0x42, 0x08, 0x31, 0xc9, 0xf6, 0x40, 0x08, + 0x20, 0x75, 0x03, 0x8b, 0x4a, 0x0c, 0x8b, 0x5c, + 0x24, 0x04, 0x53, 0x51, 0xff, 0x54, 0x24, 0x10, + 0x89, 0xda, 0x83, 0xc4, 0x08, 0x8b, 0x4f, 0x20, + 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x1c, 0x24, 0xff, 0x43, 0x24, 0x89, 0x4f, 0x20, + 0x8b, 0x0a, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x16, 0x49, 0x89, 0x0a, 0x75, 0x11, 0x52, + 0x89, 0x44, 0x24, 0x08, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x44, 0x24, 0x08, 0x83, 0xc4, 0x04, + 0x8d, 0x0c, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x4f, 0x20, 0x8b, 0x54, 0xb5, 0x00, 0x8b, 0x0a, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x0a, 0x75, 0x0d, 0x52, 0x89, 0xc6, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, + 0xc4, 0x04, 0x8b, 0x4f, 0x20, 0xc7, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x8b, 0x1c, + 0x24, 0x74, 0x3e, 0x89, 0x01, 0x83, 0xc1, 0x04, + 0x89, 0x5c, 0x24, 0x2c, 0x89, 0x4c, 0x24, 0x28, + 0x89, 0x7c, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x74, 0x24, 0x2c, 0xeb, 0x07, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x2c, 0x89, 0x6c, 0x24, + 0x28, 0x89, 0x7c, 0x24, 0x24, 0x83, 0xc4, 0x10, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x5c, 0x24, 0x2c, 0x89, 0x4c, 0x24, + 0x28, 0x89, 0x7c, 0x24, 0x24, 0x83, 0xc4, 0x10, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x4e, (uintptr_t)&PyCFunction_Type); + patch_x86_64_32rx(code + 0xf5, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x121, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x154, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x175, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x18d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_INTRINSIC_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c9 movzwl %cx, %ecx + // 18: 8b 68 fc movl -0x4(%eax), %ebp + // 1b: 89 46 20 movl %eax, 0x20(%esi) + // 1e: 55 pushl %ebp + // 1f: 57 pushl %edi + // 20: ff 14 cd 00 00 00 00 calll *(,%ecx,8) + // 00000023: IMAGE_REL_I386_DIR32 __PyIntrinsics_UnaryFunctions + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 8b 5e 20 movl 0x20(%esi), %ebx + // 2d: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 34: 8b 4d 00 movl (%ebp), %ecx + // 37: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3d: 7f 06 jg 0x45 <__JIT_ENTRY+0x45> + // 3f: 49 decl %ecx + // 40: 89 4d 00 movl %ecx, (%ebp) + // 43: 74 1c je 0x61 <__JIT_ENTRY+0x61> + // 45: 85 c0 testl %eax, %eax + // 47: 74 29 je 0x72 <__JIT_ENTRY+0x72> + // 49: 89 43 fc movl %eax, -0x4(%ebx) + // 4c: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 50: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 54: 89 74 24 14 movl %esi, 0x14(%esp) + // 58: 5e popl %esi + // 59: 5f popl %edi + // 5a: 5b popl %ebx + // 5b: 5d popl %ebp + // 5c: e9 00 00 00 00 jmp 0x61 <__JIT_ENTRY+0x61> + // 0000005d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 61: 55 pushl %ebp + // 62: 89 c5 movl %eax, %ebp + // 64: e8 00 00 00 00 calll 0x69 <__JIT_ENTRY+0x69> + // 00000065: IMAGE_REL_I386_REL32 __Py_Dealloc + // 69: 89 e8 movl %ebp, %eax + // 6b: 83 c4 04 addl $0x4, %esp + // 6e: 85 c0 testl %eax, %eax + // 70: 75 d7 jne 0x49 <__JIT_ENTRY+0x49> + // 72: 83 c3 fc addl $-0x4, %ebx + // 75: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 79: 89 74 24 14 movl %esi, 0x14(%esp) + // 7d: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 81: 5e popl %esi + // 82: 5f popl %edi + // 83: 5b popl %ebx + // 84: 5d popl %ebp + // 85: e9 00 00 00 00 jmp 0x8a <__JIT_ENTRY+0x8a> + // 00000086: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[138] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x8b, 0x68, 0xfc, 0x89, 0x46, 0x20, 0x55, 0x57, + 0xff, 0x14, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x8b, 0x5e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x4d, 0x00, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x49, + 0x89, 0x4d, 0x00, 0x74, 0x1c, 0x85, 0xc0, 0x74, + 0x29, 0x89, 0x43, 0xfc, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x5c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xe8, 0x83, 0xc4, 0x04, 0x85, 0xc0, + 0x75, 0xd7, 0x83, 0xc3, 0xfc, 0x89, 0x7c, 0x24, + 0x1c, 0x89, 0x74, 0x24, 0x14, 0x89, 0x5c, 0x24, + 0x18, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_32(code + 0x23, (uintptr_t)&_PyIntrinsics_UnaryFunctions); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x65, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x86, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_INTRINSIC_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_2.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 54 24 20 movl 0x20(%esp), %edx + // 9: 8b 7c 24 18 movl 0x18(%esp), %edi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: b9 00 00 00 00 movl $0x0, %ecx + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 16: 0f b7 c9 movzwl %cx, %ecx + // 19: 8b 70 f8 movl -0x8(%eax), %esi + // 1c: 8b 58 fc movl -0x4(%eax), %ebx + // 1f: 89 47 20 movl %eax, 0x20(%edi) + // 22: 53 pushl %ebx + // 23: 56 pushl %esi + // 24: 89 54 24 08 movl %edx, 0x8(%esp) + // 28: 52 pushl %edx + // 29: ff 14 cd 00 00 00 00 calll *(,%ecx,8) + // 0000002c: IMAGE_REL_I386_DIR32 __PyIntrinsics_BinaryFunctions + // 30: 83 c4 0c addl $0xc, %esp + // 33: 8b 6f 20 movl 0x20(%edi), %ebp + // 36: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 3d: 8b 0e movl (%esi), %ecx + // 3f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 45: 7f 05 jg 0x4c <__JIT_ENTRY+0x4c> + // 47: 49 decl %ecx + // 48: 89 0e movl %ecx, (%esi) + // 4a: 74 1e je 0x6a <__JIT_ENTRY+0x6a> + // 4c: 8b 0b movl (%ebx), %ecx + // 4e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 54: 7f 2b jg 0x81 <__JIT_ENTRY+0x81> + // 56: 49 decl %ecx + // 57: 89 0b movl %ecx, (%ebx) + // 59: 75 26 jne 0x81 <__JIT_ENTRY+0x81> + // 5b: 53 pushl %ebx + // 5c: 89 c6 movl %eax, %esi + // 5e: e8 00 00 00 00 calll 0x63 <__JIT_ENTRY+0x63> + // 0000005f: IMAGE_REL_I386_REL32 __Py_Dealloc + // 63: 89 f0 movl %esi, %eax + // 65: 83 c4 04 addl $0x4, %esp + // 68: eb 17 jmp 0x81 <__JIT_ENTRY+0x81> + // 6a: 56 pushl %esi + // 6b: 89 c6 movl %eax, %esi + // 6d: e8 00 00 00 00 calll 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 72: 89 f0 movl %esi, %eax + // 74: 83 c4 04 addl $0x4, %esp + // 77: 8b 0b movl (%ebx), %ecx + // 79: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 7f: 7e d5 jle 0x56 <__JIT_ENTRY+0x56> + // 81: 85 c0 testl %eax, %eax + // 83: 74 21 je 0xa6 <__JIT_ENTRY+0xa6> + // 85: 89 45 f8 movl %eax, -0x8(%ebp) + // 88: 83 c5 fc addl $-0x4, %ebp + // 8b: 8b 04 24 movl (%esp), %eax + // 8e: 89 44 24 20 movl %eax, 0x20(%esp) + // 92: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 96: 89 7c 24 18 movl %edi, 0x18(%esp) + // 9a: 83 c4 04 addl $0x4, %esp + // 9d: 5e popl %esi + // 9e: 5f popl %edi + // 9f: 5b popl %ebx + // a0: 5d popl %ebp + // a1: e9 00 00 00 00 jmp 0xa6 <__JIT_ENTRY+0xa6> + // 000000a2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // a6: 83 c5 f8 addl $-0x8, %ebp + // a9: 8b 04 24 movl (%esp), %eax + // ac: 89 44 24 20 movl %eax, 0x20(%esp) + // b0: 89 7c 24 18 movl %edi, 0x18(%esp) + // b4: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // b8: 83 c4 04 addl $0x4, %esp + // bb: 5e popl %esi + // bc: 5f popl %edi + // bd: 5b popl %ebx + // be: 5d popl %ebp + // bf: e9 00 00 00 00 jmp 0xc4 <__JIT_ENTRY+0xc4> + // 000000c0: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[196] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x54, 0x24, + 0x20, 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc9, 0x8b, 0x70, 0xf8, 0x8b, 0x58, 0xfc, 0x89, + 0x47, 0x20, 0x53, 0x56, 0x89, 0x54, 0x24, 0x08, + 0x52, 0xff, 0x14, 0xcd, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x0c, 0x8b, 0x6f, 0x20, 0xc7, 0x47, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, + 0x89, 0x0e, 0x74, 0x1e, 0x8b, 0x0b, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x2b, 0x49, 0x89, + 0x0b, 0x75, 0x26, 0x53, 0x89, 0xc6, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, + 0xeb, 0x17, 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x8b, + 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, + 0xd5, 0x85, 0xc0, 0x74, 0x21, 0x89, 0x45, 0xf8, + 0x83, 0xc5, 0xfc, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x20, 0x89, 0x6c, 0x24, 0x1c, 0x89, 0x7c, + 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc5, + 0xf8, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x6c, 0x24, 0x1c, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, instruction->oparg); + patch_32(code + 0x2c, (uintptr_t)&_PyIntrinsics_BinaryFunctions); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc0, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_ISINSTANCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_ISINSTANCE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 6c 24 2c movl 0x2c(%esp), %ebp + // b: 8b 5c 24 28 movl 0x28(%esp), %ebx + // f: b8 00 00 00 00 movl $0x0, %eax + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 f0 movzwl %ax, %esi + // 17: 89 f7 movl %esi, %edi + // 19: f7 d7 notl %edi + // 1b: 31 d2 xorl %edx, %edx + // 1d: 31 c0 xorl %eax, %eax + // 1f: 83 3c bb 00 cmpl $0x0, (%ebx,%edi,4) + // 23: 0f 95 c2 setne %dl + // 26: 0f 94 44 24 04 sete 0x4(%esp) + // 2b: 01 f2 addl %esi, %edx + // 2d: 8b 4c 24 24 movl 0x24(%esp), %ecx + // 31: 83 fa 02 cmpl $0x2, %edx + // 34: 75 29 jne 0x5f <__JIT_ENTRY+0x5f> + // 36: 89 0c 24 movl %ecx, (%esp) + // 39: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 3e: 29 f1 subl %esi, %ecx + // 40: 8b 55 08 movl 0x8(%ebp), %edx + // 43: 8b 92 b8 bb 01 00 movl 0x1bbb8(%edx), %edx + // 49: 3b 14 8b cmpl (%ebx,%ecx,4), %edx + // 4c: 74 29 je 0x77 <__JIT_ENTRY+0x77> + // 4e: 89 6c 24 2c movl %ebp, 0x2c(%esp) + // 52: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 56: 8b 04 24 movl (%esp), %eax + // 59: 89 44 24 24 movl %eax, 0x24(%esp) + // 5d: eb 0c jmp 0x6b <__JIT_ENTRY+0x6b> + // 5f: 89 6c 24 2c movl %ebp, 0x2c(%esp) + // 63: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 67: 89 4c 24 24 movl %ecx, 0x24(%esp) + // 6b: 83 c4 10 addl $0x10, %esp + // 6e: 5e popl %esi + // 6f: 5f popl %edi + // 70: 5b popl %ebx + // 71: 5d popl %ebp + // 72: e9 00 00 00 00 jmp 0x77 <__JIT_ENTRY+0x77> + // 00000073: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 77: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 7b: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 7f: 8d 14 b5 00 00 00 00 leal (,%esi,4), %edx + // 86: 89 dd movl %ebx, %ebp + // 88: 29 d5 subl %edx, %ebp + // 8a: 0f b6 4c 24 04 movzbl 0x4(%esp), %ecx + // 8f: 88 c8 movb %cl, %al + // 91: 8d 04 85 fc ff ff ff leal -0x4(,%eax,4), %eax + // 98: 8b 4c 05 00 movl (%ebp,%eax), %ecx + // 9c: 8b 44 05 04 movl 0x4(%ebp,%eax), %eax + // a0: 8b 2c 24 movl (%esp), %ebp + // a3: 89 5d 20 movl %ebx, 0x20(%ebp) + // a6: 50 pushl %eax + // a7: 51 pushl %ecx + // a8: e8 00 00 00 00 calll 0xad <__JIT_ENTRY+0xad> + // 000000a9: IMAGE_REL_I386_REL32 _PyObject_IsInstance + // ad: 83 c4 08 addl $0x8, %esp + // b0: 8b 4d 20 movl 0x20(%ebp), %ecx + // b3: c7 45 20 00 00 00 00 movl $0x0, 0x20(%ebp) + // ba: 85 c0 testl %eax, %eax + // bc: 0f 88 bf 00 00 00 js 0x181 <__JIT_ENTRY+0x181> + // c2: 89 c5 movl %eax, %ebp + // c4: 89 4c 24 04 movl %ecx, 0x4(%esp) + // c8: 8b 44 24 0c movl 0xc(%esp), %eax + // cc: 8b 04 83 movl (%ebx,%eax,4), %eax + // cf: 8b 08 movl (%eax), %ecx + // d1: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // d7: 7f 0e jg 0xe7 <__JIT_ENTRY+0xe7> + // d9: 49 decl %ecx + // da: 89 08 movl %ecx, (%eax) + // dc: 75 09 jne 0xe7 <__JIT_ENTRY+0xe7> + // de: 50 pushl %eax + // df: e8 00 00 00 00 calll 0xe4 <__JIT_ENTRY+0xe4> + // 000000e0: IMAGE_REL_I386_REL32 __Py_Dealloc + // e4: 83 c4 04 addl $0x4, %esp + // e7: 8b 04 bb movl (%ebx,%edi,4), %eax + // ea: 85 c0 testl %eax, %eax + // ec: 74 18 je 0x106 <__JIT_ENTRY+0x106> + // ee: 8b 08 movl (%eax), %ecx + // f0: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // f6: 7f 0e jg 0x106 <__JIT_ENTRY+0x106> + // f8: 49 decl %ecx + // f9: 89 08 movl %ecx, (%eax) + // fb: 75 09 jne 0x106 <__JIT_ENTRY+0x106> + // fd: 50 pushl %eax + // fe: e8 00 00 00 00 calll 0x103 <__JIT_ENTRY+0x103> + // 000000ff: IMAGE_REL_I386_REL32 __Py_Dealloc + // 103: 83 c4 04 addl $0x4, %esp + // 106: b8 00 00 00 00 movl $0x0, %eax + // 00000107: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10b: 66 85 c0 testw %ax, %ax + // 10e: 74 35 je 0x145 <__JIT_ENTRY+0x145> + // 110: 46 incl %esi + // 111: 83 c3 fc addl $-0x4, %ebx + // 114: eb 13 jmp 0x129 <__JIT_ENTRY+0x129> + // 116: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 120: 4e decl %esi + // 121: 83 c3 fc addl $-0x4, %ebx + // 124: 83 fe 01 cmpl $0x1, %esi + // 127: 76 1c jbe 0x145 <__JIT_ENTRY+0x145> + // 129: 8b 03 movl (%ebx), %eax + // 12b: 8b 08 movl (%eax), %ecx + // 12d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 133: 7f eb jg 0x120 <__JIT_ENTRY+0x120> + // 135: 49 decl %ecx + // 136: 89 08 movl %ecx, (%eax) + // 138: 75 e6 jne 0x120 <__JIT_ENTRY+0x120> + // 13a: 50 pushl %eax + // 13b: e8 00 00 00 00 calll 0x140 <__JIT_ENTRY+0x140> + // 0000013c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 140: 83 c4 04 addl $0x4, %esp + // 143: eb db jmp 0x120 <__JIT_ENTRY+0x120> + // 145: 85 ed testl %ebp, %ebp + // 147: b8 00 00 00 00 movl $0x0, %eax + // 00000148: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 14c: b9 00 00 00 00 movl $0x0, %ecx + // 0000014d: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 151: 0f 44 c8 cmovel %eax, %ecx + // 154: 8b 44 24 0c movl 0xc(%esp), %eax + // 158: 8b 54 24 04 movl 0x4(%esp), %edx + // 15c: 89 0c 82 movl %ecx, (%edx,%eax,4) + // 15f: 8d 04 ba leal (%edx,%edi,4), %eax + // 162: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 166: 89 4c 24 2c movl %ecx, 0x2c(%esp) + // 16a: 89 44 24 28 movl %eax, 0x28(%esp) + // 16e: 8b 04 24 movl (%esp), %eax + // 171: 89 44 24 24 movl %eax, 0x24(%esp) + // 175: 83 c4 10 addl $0x10, %esp + // 178: 5e popl %esi + // 179: 5f popl %edi + // 17a: 5b popl %ebx + // 17b: 5d popl %ebp + // 17c: e9 00 00 00 00 jmp 0x181 <__JIT_ENTRY+0x181> + // 0000017d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 181: 8b 44 24 08 movl 0x8(%esp), %eax + // 185: 89 44 24 2c movl %eax, 0x2c(%esp) + // 189: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 18d: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 191: 83 c4 10 addl $0x10, %esp + // 194: 5e popl %esi + // 195: 5f popl %edi + // 196: 5b popl %ebx + // 197: 5d popl %ebp + // 198: e9 00 00 00 00 jmp 0x19d <__JIT_ENTRY+0x19d> + // 00000199: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[413] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x6c, 0x24, 0x2c, 0x8b, 0x5c, 0x24, 0x28, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf0, 0x89, + 0xf7, 0xf7, 0xd7, 0x31, 0xd2, 0x31, 0xc0, 0x83, + 0x3c, 0xbb, 0x00, 0x0f, 0x95, 0xc2, 0x0f, 0x94, + 0x44, 0x24, 0x04, 0x01, 0xf2, 0x8b, 0x4c, 0x24, + 0x24, 0x83, 0xfa, 0x02, 0x75, 0x29, 0x89, 0x0c, + 0x24, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xf1, + 0x8b, 0x55, 0x08, 0x8b, 0x92, 0xb8, 0xbb, 0x01, + 0x00, 0x3b, 0x14, 0x8b, 0x74, 0x29, 0x89, 0x6c, + 0x24, 0x2c, 0x89, 0x5c, 0x24, 0x28, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x24, 0xeb, 0x0c, 0x89, + 0x6c, 0x24, 0x2c, 0x89, 0x5c, 0x24, 0x28, 0x89, + 0x4c, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x6c, 0x24, 0x08, 0x8d, + 0x14, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x89, 0xdd, + 0x29, 0xd5, 0x0f, 0xb6, 0x4c, 0x24, 0x04, 0x88, + 0xc8, 0x8d, 0x04, 0x85, 0xfc, 0xff, 0xff, 0xff, + 0x8b, 0x4c, 0x05, 0x00, 0x8b, 0x44, 0x05, 0x04, + 0x8b, 0x2c, 0x24, 0x89, 0x5d, 0x20, 0x50, 0x51, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x8b, 0x4d, 0x20, 0xc7, 0x45, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x88, 0xbf, 0x00, + 0x00, 0x00, 0x89, 0xc5, 0x89, 0x4c, 0x24, 0x04, + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x04, 0x83, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x04, 0xbb, 0x85, 0xc0, 0x74, 0x18, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x35, + 0x46, 0x83, 0xc3, 0xfc, 0xeb, 0x13, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x83, 0xc3, 0xfc, 0x83, 0xfe, 0x01, 0x76, + 0x1c, 0x8b, 0x03, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x85, 0xed, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x44, 0xc8, 0x8b, 0x44, 0x24, 0x0c, + 0x8b, 0x54, 0x24, 0x04, 0x89, 0x0c, 0x82, 0x8d, + 0x04, 0xba, 0x8b, 0x4c, 0x24, 0x08, 0x89, 0x4c, + 0x24, 0x2c, 0x89, 0x44, 0x24, 0x28, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x24, 0x83, 0xc4, 0x10, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x44, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x2c, 0x89, 0x4c, 0x24, 0x28, 0x89, 0x6c, 0x24, + 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_x86_64_32rx(code + 0x73, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)&PyObject_IsInstance + -0x4); + patch_x86_64_32rx(code + 0xe0, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xff, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x107, instruction->oparg); + patch_x86_64_32rx(code + 0x13c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x148, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x14d, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x17d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x199, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_KW_NON_PY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_KW_NON_PY.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 18 subl $0x18, %esp + // 7: 8b 5c 24 30 movl 0x30(%esp), %ebx + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 f8 movzwl %ax, %edi + // 13: 89 fa movl %edi, %edx + // 15: f7 d2 notl %edx + // 17: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 1c: 29 fe subl %edi, %esi + // 1e: bd fd ff ff ff movl $0xfffffffd, %ebp # imm = 0xFFFFFFFD + // 23: 29 fd subl %edi, %ebp + // 25: 31 c9 xorl %ecx, %ecx + // 27: 31 c0 xorl %eax, %eax + // 29: 89 74 24 14 movl %esi, 0x14(%esp) + // 2d: 83 3c b3 00 cmpl $0x0, (%ebx,%esi,4) + // 31: 0f 94 c0 sete %al + // 34: 89 54 24 0c movl %edx, 0xc(%esp) + // 38: 8d 14 93 leal (%ebx,%edx,4), %edx + // 3b: 8d 44 82 fc leal -0x4(%edx,%eax,4), %eax + // 3f: 89 04 24 movl %eax, (%esp) + // 42: 0f 95 c1 setne %cl + // 45: 8b 43 fc movl -0x4(%ebx), %eax + // 48: 89 fa movl %edi, %edx + // 4a: 2b 50 08 subl 0x8(%eax), %edx + // 4d: 01 ca addl %ecx, %edx + // 4f: 8b 4c 24 34 movl 0x34(%esp), %ecx + // 53: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 57: 8b 74 24 2c movl 0x2c(%esp), %esi + // 5b: 89 6c 24 10 movl %ebp, 0x10(%esp) + // 5f: 8b 0c ab movl (%ebx,%ebp,4), %ecx + // 62: 89 5e 20 movl %ebx, 0x20(%esi) + // 65: 81 ca 00 00 00 80 orl $0x80000000, %edx # imm = 0x80000000 + // 6b: 89 c5 movl %eax, %ebp + // 6d: 50 pushl %eax + // 6e: 52 pushl %edx + // 6f: ff 74 24 08 pushl 0x8(%esp) + // 73: 51 pushl %ecx + // 74: e8 00 00 00 00 calll 0x79 <__JIT_ENTRY+0x79> + // 00000075: IMAGE_REL_I386_REL32 _PyObject_Vectorcall + // 79: 89 e9 movl %ebp, %ecx + // 7b: 83 c4 10 addl $0x10, %esp + // 7e: 89 34 24 movl %esi, (%esp) + // 81: 83 46 20 fc addl $-0x4, 0x20(%esi) + // 85: 89 c5 movl %eax, %ebp + // 87: 8b 01 movl (%ecx), %eax + // 89: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 8e: 7f 0e jg 0x9e <__JIT_ENTRY+0x9e> + // 90: 48 decl %eax + // 91: 89 01 movl %eax, (%ecx) + // 93: 75 09 jne 0x9e <__JIT_ENTRY+0x9e> + // 95: 51 pushl %ecx + // 96: e8 00 00 00 00 calll 0x9b <__JIT_ENTRY+0x9b> + // 00000097: IMAGE_REL_I386_REL32 __Py_Dealloc + // 9b: 83 c4 04 addl $0x4, %esp + // 9e: 8b 04 24 movl (%esp), %eax + // a1: 8b 48 20 movl 0x20(%eax), %ecx + // a4: 89 4c 24 04 movl %ecx, 0x4(%esp) + // a8: c7 40 20 00 00 00 00 movl $0x0, 0x20(%eax) + // af: 8b 44 24 10 movl 0x10(%esp), %eax + // b3: 8b 04 83 movl (%ebx,%eax,4), %eax + // b6: 8b 08 movl (%eax), %ecx + // b8: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // be: 7f 0e jg 0xce <__JIT_ENTRY+0xce> + // c0: 49 decl %ecx + // c1: 89 08 movl %ecx, (%eax) + // c3: 75 09 jne 0xce <__JIT_ENTRY+0xce> + // c5: 50 pushl %eax + // c6: e8 00 00 00 00 calll 0xcb <__JIT_ENTRY+0xcb> + // 000000c7: IMAGE_REL_I386_REL32 __Py_Dealloc + // cb: 83 c4 04 addl $0x4, %esp + // ce: 8b 74 24 14 movl 0x14(%esp), %esi + // d2: 8b 04 b3 movl (%ebx,%esi,4), %eax + // d5: 85 c0 testl %eax, %eax + // d7: 74 18 je 0xf1 <__JIT_ENTRY+0xf1> + // d9: 8b 08 movl (%eax), %ecx + // db: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // e1: 7f 0e jg 0xf1 <__JIT_ENTRY+0xf1> + // e3: 49 decl %ecx + // e4: 89 08 movl %ecx, (%eax) + // e6: 75 09 jne 0xf1 <__JIT_ENTRY+0xf1> + // e8: 50 pushl %eax + // e9: e8 00 00 00 00 calll 0xee <__JIT_ENTRY+0xee> + // 000000ea: IMAGE_REL_I386_REL32 __Py_Dealloc + // ee: 83 c4 04 addl $0x4, %esp + // f1: b8 00 00 00 00 movl $0x0, %eax + // 000000f2: IMAGE_REL_I386_DIR32 __JIT_OPARG + // f6: 66 85 c0 testw %ax, %ax + // f9: 74 3a je 0x135 <__JIT_ENTRY+0x135> + // fb: 47 incl %edi + // fc: 83 c3 f8 addl $-0x8, %ebx + // ff: eb 18 jmp 0x119 <__JIT_ENTRY+0x119> + // 101: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 110: 4f decl %edi + // 111: 83 c3 fc addl $-0x4, %ebx + // 114: 83 ff 01 cmpl $0x1, %edi + // 117: 76 1c jbe 0x135 <__JIT_ENTRY+0x135> + // 119: 8b 03 movl (%ebx), %eax + // 11b: 8b 08 movl (%eax), %ecx + // 11d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 123: 7f eb jg 0x110 <__JIT_ENTRY+0x110> + // 125: 49 decl %ecx + // 126: 89 08 movl %ecx, (%eax) + // 128: 75 e6 jne 0x110 <__JIT_ENTRY+0x110> + // 12a: 50 pushl %eax + // 12b: e8 00 00 00 00 calll 0x130 <__JIT_ENTRY+0x130> + // 0000012c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 130: 83 c4 04 addl $0x4, %esp + // 133: eb db jmp 0x110 <__JIT_ENTRY+0x110> + // 135: 85 ed testl %ebp, %ebp + // 137: 74 2d je 0x166 <__JIT_ENTRY+0x166> + // 139: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 13d: 89 2c b1 movl %ebp, (%ecx,%esi,4) + // 140: 8b 44 24 0c movl 0xc(%esp), %eax + // 144: 8d 04 81 leal (%ecx,%eax,4), %eax + // 147: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 14b: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 14f: 89 44 24 30 movl %eax, 0x30(%esp) + // 153: 8b 04 24 movl (%esp), %eax + // 156: 89 44 24 2c movl %eax, 0x2c(%esp) + // 15a: 83 c4 18 addl $0x18, %esp + // 15d: 5e popl %esi + // 15e: 5f popl %edi + // 15f: 5b popl %ebx + // 160: 5d popl %ebp + // 161: e9 00 00 00 00 jmp 0x166 <__JIT_ENTRY+0x166> + // 00000162: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 166: 8b 44 24 04 movl 0x4(%esp), %eax + // 16a: 8d 04 b0 leal (%eax,%esi,4), %eax + // 16d: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 171: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 175: 8b 0c 24 movl (%esp), %ecx + // 178: 89 4c 24 2c movl %ecx, 0x2c(%esp) + // 17c: 89 44 24 30 movl %eax, 0x30(%esp) + // 180: 83 c4 18 addl $0x18, %esp + // 183: 5e popl %esi + // 184: 5f popl %edi + // 185: 5b popl %ebx + // 186: 5d popl %ebp + // 187: e9 00 00 00 00 jmp 0x18c <__JIT_ENTRY+0x18c> + // 00000188: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[396] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x18, 0x8b, + 0x5c, 0x24, 0x30, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xf8, 0x89, 0xfa, 0xf7, 0xd2, 0xbe, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xfe, 0xbd, 0xfd, + 0xff, 0xff, 0xff, 0x29, 0xfd, 0x31, 0xc9, 0x31, + 0xc0, 0x89, 0x74, 0x24, 0x14, 0x83, 0x3c, 0xb3, + 0x00, 0x0f, 0x94, 0xc0, 0x89, 0x54, 0x24, 0x0c, + 0x8d, 0x14, 0x93, 0x8d, 0x44, 0x82, 0xfc, 0x89, + 0x04, 0x24, 0x0f, 0x95, 0xc1, 0x8b, 0x43, 0xfc, + 0x89, 0xfa, 0x2b, 0x50, 0x08, 0x01, 0xca, 0x8b, + 0x4c, 0x24, 0x34, 0x89, 0x4c, 0x24, 0x08, 0x8b, + 0x74, 0x24, 0x2c, 0x89, 0x6c, 0x24, 0x10, 0x8b, + 0x0c, 0xab, 0x89, 0x5e, 0x20, 0x81, 0xca, 0x00, + 0x00, 0x00, 0x80, 0x89, 0xc5, 0x50, 0x52, 0xff, + 0x74, 0x24, 0x08, 0x51, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xe9, 0x83, 0xc4, 0x10, 0x89, 0x34, + 0x24, 0x83, 0x46, 0x20, 0xfc, 0x89, 0xc5, 0x8b, + 0x01, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x48, 0x89, 0x01, 0x75, 0x09, 0x51, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x04, + 0x24, 0x8b, 0x48, 0x20, 0x89, 0x4c, 0x24, 0x04, + 0xc7, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x44, 0x24, 0x10, 0x8b, 0x04, 0x83, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x74, + 0x24, 0x14, 0x8b, 0x04, 0xb3, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x3a, 0x47, 0x83, 0xc3, 0xf8, 0xeb, + 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x83, 0xc3, 0xfc, 0x83, 0xff, 0x01, 0x76, + 0x1c, 0x8b, 0x03, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x85, 0xed, 0x74, + 0x2d, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x2c, 0xb1, + 0x8b, 0x44, 0x24, 0x0c, 0x8d, 0x04, 0x81, 0x8b, + 0x4c, 0x24, 0x08, 0x89, 0x4c, 0x24, 0x34, 0x89, + 0x44, 0x24, 0x30, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x2c, 0x83, 0xc4, 0x18, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x44, + 0x24, 0x04, 0x8d, 0x04, 0xb0, 0x8b, 0x4c, 0x24, + 0x08, 0x89, 0x4c, 0x24, 0x34, 0x8b, 0x0c, 0x24, + 0x89, 0x4c, 0x24, 0x2c, 0x89, 0x44, 0x24, 0x30, + 0x83, 0xc4, 0x18, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_x86_64_32rx(code + 0x75, (uintptr_t)&PyObject_Vectorcall + -0x4); + patch_x86_64_32rx(code + 0x97, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc7, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xea, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0xf2, instruction->oparg); + patch_x86_64_32rx(code + 0x12c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x162, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x188, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LEN.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 7c 24 24 movl 0x24(%esp), %edi + // b: 8b 5c 24 20 movl 0x20(%esp), %ebx + // f: 8b 74 24 1c movl 0x1c(%esp), %esi + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 c0 movzwl %ax, %eax + // 1b: 89 c2 movl %eax, %edx + // 1d: f7 d2 notl %edx + // 1f: 31 c9 xorl %ecx, %ecx + // 21: 83 3c 93 00 cmpl $0x0, (%ebx,%edx,4) + // 25: 0f 94 c2 sete %dl + // 28: 0f 95 c1 setne %cl + // 2b: 01 c1 addl %eax, %ecx + // 2d: 83 f9 01 cmpl $0x1, %ecx + // 30: 75 15 jne 0x47 <__JIT_ENTRY+0x47> + // 32: bd fe ff ff ff movl $0xfffffffe, %ebp # imm = 0xFFFFFFFE + // 37: 29 c5 subl %eax, %ebp + // 39: 8b 4f 08 movl 0x8(%edi), %ecx + // 3c: 8b 89 bc bb 01 00 movl 0x1bbbc(%ecx), %ecx + // 42: 3b 0c ab cmpl (%ebx,%ebp,4), %ecx + // 45: 74 18 je 0x5f <__JIT_ENTRY+0x5f> + // 47: 89 7c 24 24 movl %edi, 0x24(%esp) + // 4b: 89 5c 24 20 movl %ebx, 0x20(%esp) + // 4f: 89 74 24 1c movl %esi, 0x1c(%esp) + // 53: 83 c4 08 addl $0x8, %esp + // 56: 5e popl %esi + // 57: 5f popl %edi + // 58: 5b popl %ebx + // 59: 5d popl %ebp + // 5a: e9 00 00 00 00 jmp 0x5f <__JIT_ENTRY+0x5f> + // 0000005b: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 5f: c1 e0 02 shll $0x2, %eax + // 62: 89 d9 movl %ebx, %ecx + // 64: 29 c1 subl %eax, %ecx + // 66: 31 c0 xorl %eax, %eax + // 68: 88 d0 movb %dl, %al + // 6a: 8d 04 85 fc ff ff ff leal -0x4(,%eax,4), %eax + // 71: 8b 04 01 movl (%ecx,%eax), %eax + // 74: 89 5e 20 movl %ebx, 0x20(%esi) + // 77: 89 04 24 movl %eax, (%esp) + // 7a: 50 pushl %eax + // 7b: e8 00 00 00 00 calll 0x80 <__JIT_ENTRY+0x80> + // 0000007c: IMAGE_REL_I386_REL32 _PyObject_Size + // 80: 83 c4 04 addl $0x4, %esp + // 83: 8b 4e 20 movl 0x20(%esi), %ecx + // 86: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8d: 85 c0 testl %eax, %eax + // 8f: 0f 88 8f 00 00 00 js 0x124 <__JIT_ENTRY+0x124> + // 95: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 99: 50 pushl %eax + // 9a: e8 00 00 00 00 calll 0x9f <__JIT_ENTRY+0x9f> + // 0000009b: IMAGE_REL_I386_REL32 _PyLong_FromSsize_t + // 9f: 83 c4 04 addl $0x4, %esp + // a2: 85 c0 testl %eax, %eax + // a4: 0f 84 84 00 00 00 je 0x12e <__JIT_ENTRY+0x12e> + // aa: 8b 4c 24 04 movl 0x4(%esp), %ecx + // ae: 89 4e 20 movl %ecx, 0x20(%esi) + // b1: 8b 14 24 movl (%esp), %edx + // b4: 8b 0a movl (%edx), %ecx + // b6: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // bc: 7f 16 jg 0xd4 <__JIT_ENTRY+0xd4> + // be: 49 decl %ecx + // bf: 89 0a movl %ecx, (%edx) + // c1: 75 11 jne 0xd4 <__JIT_ENTRY+0xd4> + // c3: 52 pushl %edx + // c4: 89 44 24 04 movl %eax, 0x4(%esp) + // c8: e8 00 00 00 00 calll 0xcd <__JIT_ENTRY+0xcd> + // 000000c9: IMAGE_REL_I386_REL32 __Py_Dealloc + // cd: 8b 44 24 04 movl 0x4(%esp), %eax + // d1: 83 c4 04 addl $0x4, %esp + // d4: 8d 0c ad 00 00 00 00 leal (,%ebp,4), %ecx + // db: 01 4e 20 addl %ecx, 0x20(%esi) + // de: 8b 0c ab movl (%ebx,%ebp,4), %ecx + // e1: 8b 11 movl (%ecx), %edx + // e3: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // e9: 7f 12 jg 0xfd <__JIT_ENTRY+0xfd> + // eb: 4a decl %edx + // ec: 89 11 movl %edx, (%ecx) + // ee: 75 0d jne 0xfd <__JIT_ENTRY+0xfd> + // f0: 51 pushl %ecx + // f1: 89 c3 movl %eax, %ebx + // f3: e8 00 00 00 00 calll 0xf8 <__JIT_ENTRY+0xf8> + // 000000f4: IMAGE_REL_I386_REL32 __Py_Dealloc + // f8: 89 d8 movl %ebx, %eax + // fa: 83 c4 04 addl $0x4, %esp + // fd: 8b 4e 20 movl 0x20(%esi), %ecx + // 100: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 107: 89 01 movl %eax, (%ecx) + // 109: 83 c1 04 addl $0x4, %ecx + // 10c: 89 7c 24 24 movl %edi, 0x24(%esp) + // 110: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 114: 89 74 24 1c movl %esi, 0x1c(%esp) + // 118: 83 c4 08 addl $0x8, %esp + // 11b: 5e popl %esi + // 11c: 5f popl %edi + // 11d: 5b popl %ebx + // 11e: 5d popl %ebp + // 11f: e9 00 00 00 00 jmp 0x124 <__JIT_ENTRY+0x124> + // 00000120: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 124: 89 7c 24 24 movl %edi, 0x24(%esp) + // 128: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 12c: eb 0c jmp 0x13a <__JIT_ENTRY+0x13a> + // 12e: 89 7c 24 24 movl %edi, 0x24(%esp) + // 132: 8b 44 24 04 movl 0x4(%esp), %eax + // 136: 89 44 24 20 movl %eax, 0x20(%esp) + // 13a: 89 74 24 1c movl %esi, 0x1c(%esp) + // 13e: 83 c4 08 addl $0x8, %esp + // 141: 5e popl %esi + // 142: 5f popl %edi + // 143: 5b popl %ebx + // 144: 5d popl %ebp + // 145: e9 00 00 00 00 jmp 0x14a <__JIT_ENTRY+0x14a> + // 00000146: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[330] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x7c, 0x24, 0x24, 0x8b, 0x5c, 0x24, 0x20, 0x8b, + 0x74, 0x24, 0x1c, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc0, 0x89, 0xc2, 0xf7, 0xd2, 0x31, + 0xc9, 0x83, 0x3c, 0x93, 0x00, 0x0f, 0x94, 0xc2, + 0x0f, 0x95, 0xc1, 0x01, 0xc1, 0x83, 0xf9, 0x01, + 0x75, 0x15, 0xbd, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc5, 0x8b, 0x4f, 0x08, 0x8b, 0x89, 0xbc, 0xbb, + 0x01, 0x00, 0x3b, 0x0c, 0xab, 0x74, 0x18, 0x89, + 0x7c, 0x24, 0x24, 0x89, 0x5c, 0x24, 0x20, 0x89, + 0x74, 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x02, 0x89, 0xd9, 0x29, 0xc1, 0x31, 0xc0, + 0x88, 0xd0, 0x8d, 0x04, 0x85, 0xfc, 0xff, 0xff, + 0xff, 0x8b, 0x04, 0x01, 0x89, 0x5e, 0x20, 0x89, + 0x04, 0x24, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, + 0x88, 0x8f, 0x00, 0x00, 0x00, 0x89, 0x4c, 0x24, + 0x04, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x85, 0xc0, 0x0f, 0x84, 0x84, 0x00, + 0x00, 0x00, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4e, + 0x20, 0x8b, 0x14, 0x24, 0x8b, 0x0a, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x16, 0x49, 0x89, + 0x0a, 0x75, 0x11, 0x52, 0x89, 0x44, 0x24, 0x04, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x44, 0x24, + 0x04, 0x83, 0xc4, 0x04, 0x8d, 0x0c, 0xad, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x4e, 0x20, 0x8b, 0x0c, + 0xab, 0x8b, 0x11, 0x81, 0xfa, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x12, 0x4a, 0x89, 0x11, 0x75, 0x0d, + 0x51, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, 0x4e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x01, 0x83, 0xc1, 0x04, 0x89, 0x7c, 0x24, 0x24, + 0x89, 0x4c, 0x24, 0x20, 0x89, 0x74, 0x24, 0x1c, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x24, + 0x89, 0x4c, 0x24, 0x20, 0xeb, 0x0c, 0x89, 0x7c, + 0x24, 0x24, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, + 0x24, 0x20, 0x89, 0x74, 0x24, 0x1c, 0x83, 0xc4, + 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_x86_64_32rx(code + 0x5b, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)&PyObject_Size + -0x4); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)&PyLong_FromSsize_t + -0x4); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xf4, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x120, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x146, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LIST_APPEND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 7c 24 24 movl 0x24(%esp), %edi + // b: 8b 74 24 20 movl 0x20(%esp), %esi + // f: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // 13: 8b 5e f4 movl -0xc(%esi), %ebx + // 16: 8b 47 08 movl 0x8(%edi), %eax + // 19: 39 98 c0 bb 01 00 cmpl %ebx, 0x1bbc0(%eax) + // 1f: 75 0c jne 0x2d <__JIT_ENTRY+0x2d> + // 21: 8b 6e f8 movl -0x8(%esi), %ebp + // 24: 8b 45 04 movl 0x4(%ebp), %eax + // 27: f6 40 57 02 testb $0x2, 0x57(%eax) + // 2b: 75 18 jne 0x45 <__JIT_ENTRY+0x45> + // 2d: 89 7c 24 24 movl %edi, 0x24(%esp) + // 31: 89 74 24 20 movl %esi, 0x20(%esp) + // 35: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 39: 83 c4 08 addl $0x8, %esp + // 3c: 5e popl %esi + // 3d: 5f popl %edi + // 3e: 5b popl %ebx + // 3f: 5d popl %ebp + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 45: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 49: 8b 46 fc movl -0x4(%esi), %eax + // 4c: 83 c6 f8 addl $-0x8, %esi + // 4f: 8b 4d 08 movl 0x8(%ebp), %ecx + // 52: 39 4d 10 cmpl %ecx, 0x10(%ebp) + // 55: 7e 0e jle 0x65 <__JIT_ENTRY+0x65> + // 57: 8b 55 0c movl 0xc(%ebp), %edx + // 5a: 89 04 8a movl %eax, (%edx,%ecx,4) + // 5d: 41 incl %ecx + // 5e: 89 4d 08 movl %ecx, 0x8(%ebp) + // 61: b2 01 movb $0x1, %dl + // 63: eb 0f jmp 0x74 <__JIT_ENTRY+0x74> + // 65: 50 pushl %eax + // 66: 55 pushl %ebp + // 67: e8 00 00 00 00 calll 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __PyList_AppendTakeRefListResize + // 6c: 83 c4 08 addl $0x8, %esp + // 6f: 85 c0 testl %eax, %eax + // 71: 0f 94 c2 sete %dl + // 74: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 78: 89 71 20 movl %esi, 0x20(%ecx) + // 7b: 8b 45 00 movl (%ebp), %eax + // 7e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 83: 7f 1c jg 0xa1 <__JIT_ENTRY+0xa1> + // 85: 48 decl %eax + // 86: 89 45 00 movl %eax, (%ebp) + // 89: 75 16 jne 0xa1 <__JIT_ENTRY+0xa1> + // 8b: 55 pushl %ebp + // 8c: 88 54 24 07 movb %dl, 0x7(%esp) + // 90: e8 00 00 00 00 calll 0x95 <__JIT_ENTRY+0x95> + // 00000091: IMAGE_REL_I386_REL32 __Py_Dealloc + // 95: 0f b6 54 24 07 movzbl 0x7(%esp), %edx + // 9a: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 9e: 83 c4 04 addl $0x4, %esp + // a1: 83 41 20 fc addl $-0x4, 0x20(%ecx) + // a5: 8b 03 movl (%ebx), %eax + // a7: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // ac: 7f 05 jg 0xb3 <__JIT_ENTRY+0xb3> + // ae: 48 decl %eax + // af: 89 03 movl %eax, (%ebx) + // b1: 74 26 je 0xd9 <__JIT_ENTRY+0xd9> + // b3: 8b 41 20 movl 0x20(%ecx), %eax + // b6: c7 41 20 00 00 00 00 movl $0x0, 0x20(%ecx) + // bd: 84 d2 testb %dl, %dl + // bf: 74 37 je 0xf8 <__JIT_ENTRY+0xf8> + // c1: 89 7c 24 24 movl %edi, 0x24(%esp) + // c5: 89 44 24 20 movl %eax, 0x20(%esp) + // c9: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // cd: 83 c4 08 addl $0x8, %esp + // d0: 5e popl %esi + // d1: 5f popl %edi + // d2: 5b popl %ebx + // d3: 5d popl %ebp + // d4: e9 00 00 00 00 jmp 0xd9 <__JIT_ENTRY+0xd9> + // 000000d5: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // d9: 53 pushl %ebx + // da: 89 d3 movl %edx, %ebx + // dc: e8 00 00 00 00 calll 0xe1 <__JIT_ENTRY+0xe1> + // 000000dd: IMAGE_REL_I386_REL32 __Py_Dealloc + // e1: 89 da movl %ebx, %edx + // e3: 8b 4c 24 08 movl 0x8(%esp), %ecx + // e7: 83 c4 04 addl $0x4, %esp + // ea: 8b 41 20 movl 0x20(%ecx), %eax + // ed: c7 41 20 00 00 00 00 movl $0x0, 0x20(%ecx) + // f4: 84 d2 testb %dl, %dl + // f6: 75 c9 jne 0xc1 <__JIT_ENTRY+0xc1> + // f8: 89 7c 24 24 movl %edi, 0x24(%esp) + // fc: 89 44 24 20 movl %eax, 0x20(%esp) + // 100: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 104: 83 c4 08 addl $0x8, %esp + // 107: 5e popl %esi + // 108: 5f popl %edi + // 109: 5b popl %ebx + // 10a: 5d popl %ebp + // 10b: e9 00 00 00 00 jmp 0x110 <__JIT_ENTRY+0x110> + // 0000010c: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[272] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x7c, 0x24, 0x24, 0x8b, 0x74, 0x24, 0x20, 0x8b, + 0x4c, 0x24, 0x1c, 0x8b, 0x5e, 0xf4, 0x8b, 0x47, + 0x08, 0x39, 0x98, 0xc0, 0xbb, 0x01, 0x00, 0x75, + 0x0c, 0x8b, 0x6e, 0xf8, 0x8b, 0x45, 0x04, 0xf6, + 0x40, 0x57, 0x02, 0x75, 0x18, 0x89, 0x7c, 0x24, + 0x24, 0x89, 0x74, 0x24, 0x20, 0x89, 0x4c, 0x24, + 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x4c, 0x24, + 0x04, 0x8b, 0x46, 0xfc, 0x83, 0xc6, 0xf8, 0x8b, + 0x4d, 0x08, 0x39, 0x4d, 0x10, 0x7e, 0x0e, 0x8b, + 0x55, 0x0c, 0x89, 0x04, 0x8a, 0x41, 0x89, 0x4d, + 0x08, 0xb2, 0x01, 0xeb, 0x0f, 0x50, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x85, + 0xc0, 0x0f, 0x94, 0xc2, 0x8b, 0x4c, 0x24, 0x04, + 0x89, 0x71, 0x20, 0x8b, 0x45, 0x00, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x1c, 0x48, 0x89, 0x45, + 0x00, 0x75, 0x16, 0x55, 0x88, 0x54, 0x24, 0x07, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb6, 0x54, + 0x24, 0x07, 0x8b, 0x4c, 0x24, 0x08, 0x83, 0xc4, + 0x04, 0x83, 0x41, 0x20, 0xfc, 0x8b, 0x03, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, + 0x03, 0x74, 0x26, 0x8b, 0x41, 0x20, 0xc7, 0x41, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x84, 0xd2, 0x74, + 0x37, 0x89, 0x7c, 0x24, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x89, 0x4c, 0x24, 0x1c, 0x83, 0xc4, 0x08, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x89, 0xd3, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xda, 0x8b, 0x4c, 0x24, 0x08, 0x83, + 0xc4, 0x04, 0x8b, 0x41, 0x20, 0xc7, 0x41, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x84, 0xd2, 0x75, 0xc9, + 0x89, 0x7c, 0x24, 0x24, 0x89, 0x44, 0x24, 0x20, + 0x89, 0x4c, 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)&_PyList_AppendTakeRefListResize + -0x4); + patch_x86_64_32rx(code + 0x91, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xdd, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x10c, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 18 subl $0x18, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 f0 movzwl %ax, %esi + // 13: 89 f5 movl %esi, %ebp + // 15: f7 d5 notl %ebp + // 17: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 1c: 29 f0 subl %esi, %eax + // 1e: 83 3c af 00 cmpl $0x0, (%edi,%ebp,4) + // 22: 0f 95 44 24 0c setne 0xc(%esp) + // 27: 0f 94 44 24 08 sete 0x8(%esp) + // 2c: 8b 14 87 movl (%edi,%eax,4), %edx + // 2f: 81 7a 04 00 00 00 00 cmpl $0x0, 0x4(%edx) + // 00000032: IMAGE_REL_I386_DIR32 _PyMethodDescr_Type + // 36: 8b 4c 24 34 movl 0x34(%esp), %ecx + // 3a: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // 3e: 74 06 je 0x46 <__JIT_ENTRY+0x46> + // 40: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 44: eb 5d jmp 0xa3 <__JIT_ENTRY+0xa3> + // 46: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 4a: 89 04 24 movl %eax, (%esp) + // 4d: 89 6c 24 14 movl %ebp, 0x14(%esp) + // 51: 8b 6a 14 movl 0x14(%edx), %ebp + // 54: 81 7d 08 80 00 00 00 cmpl $0x80, 0x8(%ebp) + // 5b: 75 3e jne 0x9b <__JIT_ENTRY+0x9b> + // 5d: 89 5c 24 10 movl %ebx, 0x10(%esp) + // 61: 8d 04 b5 00 00 00 00 leal (,%esi,4), %eax + // 68: 89 fb movl %edi, %ebx + // 6a: 29 c3 subl %eax, %ebx + // 6c: 31 c0 xorl %eax, %eax + // 6e: 0f b6 4c 24 08 movzbl 0x8(%esp), %ecx + // 73: 88 c8 movb %cl, %al + // 75: 8d 04 83 leal (%ebx,%eax,4), %eax + // 78: 83 c0 fc addl $-0x4, %eax + // 7b: 8b 08 movl (%eax), %ecx + // 7d: 8b 59 04 movl 0x4(%ecx), %ebx + // 80: 3b 5a 08 cmpl 0x8(%edx), %ebx + // 83: 74 32 je 0xb7 <__JIT_ENTRY+0xb7> + // 85: 8b 44 24 04 movl 0x4(%esp), %eax + // 89: 89 44 24 34 movl %eax, 0x34(%esp) + // 8d: 89 7c 24 30 movl %edi, 0x30(%esp) + // 91: 8b 44 24 10 movl 0x10(%esp), %eax + // 95: 89 44 24 2c movl %eax, 0x2c(%esp) + // 99: eb 10 jmp 0xab <__JIT_ENTRY+0xab> + // 9b: 8b 44 24 04 movl 0x4(%esp), %eax + // 9f: 89 44 24 34 movl %eax, 0x34(%esp) + // a3: 89 7c 24 30 movl %edi, 0x30(%esp) + // a7: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // ab: 83 c4 18 addl $0x18, %esp + // ae: 5e popl %esi + // af: 5f popl %edi + // b0: 5b popl %ebx + // b1: 5d popl %ebp + // b2: e9 00 00 00 00 jmp 0xb7 <__JIT_ENTRY+0xb7> + // 000000b3: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // b7: 31 d2 xorl %edx, %edx + // b9: 0f b6 5c 24 0c movzbl 0xc(%esp), %ebx + // be: 88 da movb %bl, %dl + // c0: 01 f2 addl %esi, %edx + // c2: 4a decl %edx + // c3: 8b 5c 24 10 movl 0x10(%esp), %ebx + // c7: 89 7b 20 movl %edi, 0x20(%ebx) + // ca: 83 c0 04 addl $0x4, %eax + // cd: 52 pushl %edx + // ce: 50 pushl %eax + // cf: 51 pushl %ecx + // d0: ff 55 04 calll *0x4(%ebp) + // d3: 83 c4 0c addl $0xc, %esp + // d6: 89 44 24 0c movl %eax, 0xc(%esp) + // da: 8b 43 20 movl 0x20(%ebx), %eax + // dd: 89 44 24 08 movl %eax, 0x8(%esp) + // e1: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // e8: 8b 14 24 movl (%esp), %edx + // eb: 8b 04 97 movl (%edi,%edx,4), %eax + // ee: 8b 08 movl (%eax), %ecx + // f0: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // f6: 7f 12 jg 0x10a <__JIT_ENTRY+0x10a> + // f8: 49 decl %ecx + // f9: 89 08 movl %ecx, (%eax) + // fb: 75 0d jne 0x10a <__JIT_ENTRY+0x10a> + // fd: 50 pushl %eax + // fe: e8 00 00 00 00 calll 0x103 <__JIT_ENTRY+0x103> + // 000000ff: IMAGE_REL_I386_REL32 __Py_Dealloc + // 103: 8b 54 24 04 movl 0x4(%esp), %edx + // 107: 83 c4 04 addl $0x4, %esp + // 10a: 8b 44 24 14 movl 0x14(%esp), %eax + // 10e: 8b 04 87 movl (%edi,%eax,4), %eax + // 111: 85 c0 testl %eax, %eax + // 113: 74 1c je 0x131 <__JIT_ENTRY+0x131> + // 115: 8b 08 movl (%eax), %ecx + // 117: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 11d: 7f 12 jg 0x131 <__JIT_ENTRY+0x131> + // 11f: 49 decl %ecx + // 120: 89 08 movl %ecx, (%eax) + // 122: 75 0d jne 0x131 <__JIT_ENTRY+0x131> + // 124: 50 pushl %eax + // 125: e8 00 00 00 00 calll 0x12a <__JIT_ENTRY+0x12a> + // 00000126: IMAGE_REL_I386_REL32 __Py_Dealloc + // 12a: 8b 54 24 04 movl 0x4(%esp), %edx + // 12e: 83 c4 04 addl $0x4, %esp + // 131: b8 00 00 00 00 movl $0x0, %eax + // 00000132: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 136: 66 85 c0 testw %ax, %ax + // 139: 74 3e je 0x179 <__JIT_ENTRY+0x179> + // 13b: 46 incl %esi + // 13c: 83 c7 fc addl $-0x4, %edi + // 13f: eb 18 jmp 0x159 <__JIT_ENTRY+0x159> + // 141: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 150: 4e decl %esi + // 151: 83 c7 fc addl $-0x4, %edi + // 154: 83 fe 01 cmpl $0x1, %esi + // 157: 76 20 jbe 0x179 <__JIT_ENTRY+0x179> + // 159: 8b 07 movl (%edi), %eax + // 15b: 8b 08 movl (%eax), %ecx + // 15d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 163: 7f eb jg 0x150 <__JIT_ENTRY+0x150> + // 165: 49 decl %ecx + // 166: 89 08 movl %ecx, (%eax) + // 168: 75 e6 jne 0x150 <__JIT_ENTRY+0x150> + // 16a: 50 pushl %eax + // 16b: e8 00 00 00 00 calll 0x170 <__JIT_ENTRY+0x170> + // 0000016c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 170: 8b 54 24 04 movl 0x4(%esp), %edx + // 174: 83 c4 04 addl $0x4, %esp + // 177: eb d7 jmp 0x150 <__JIT_ENTRY+0x150> + // 179: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 17d: 85 c9 testl %ecx, %ecx + // 17f: 8b 6c 24 14 movl 0x14(%esp), %ebp + // 183: 74 26 je 0x1ab <__JIT_ENTRY+0x1ab> + // 185: 8b 44 24 08 movl 0x8(%esp), %eax + // 189: 89 0c 90 movl %ecx, (%eax,%edx,4) + // 18c: 8d 04 a8 leal (%eax,%ebp,4), %eax + // 18f: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 193: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 197: 89 44 24 30 movl %eax, 0x30(%esp) + // 19b: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 19f: 83 c4 18 addl $0x18, %esp + // 1a2: 5e popl %esi + // 1a3: 5f popl %edi + // 1a4: 5b popl %ebx + // 1a5: 5d popl %ebp + // 1a6: e9 00 00 00 00 jmp 0x1ab <__JIT_ENTRY+0x1ab> + // 000001a7: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 1ab: 8b 44 24 08 movl 0x8(%esp), %eax + // 1af: 8d 04 90 leal (%eax,%edx,4), %eax + // 1b2: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 1b6: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 1ba: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 1be: 89 44 24 30 movl %eax, 0x30(%esp) + // 1c2: 83 c4 18 addl $0x18, %esp + // 1c5: 5e popl %esi + // 1c6: 5f popl %edi + // 1c7: 5b popl %ebx + // 1c8: 5d popl %ebp + // 1c9: e9 00 00 00 00 jmp 0x1ce <__JIT_ENTRY+0x1ce> + // 000001ca: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[462] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x18, 0x8b, + 0x7c, 0x24, 0x30, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xf0, 0x89, 0xf5, 0xf7, 0xd5, 0xb8, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xf0, 0x83, 0x3c, + 0xaf, 0x00, 0x0f, 0x95, 0x44, 0x24, 0x0c, 0x0f, + 0x94, 0x44, 0x24, 0x08, 0x8b, 0x14, 0x87, 0x81, + 0x7a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x4c, + 0x24, 0x34, 0x8b, 0x5c, 0x24, 0x2c, 0x74, 0x06, + 0x89, 0x4c, 0x24, 0x34, 0xeb, 0x5d, 0x89, 0x4c, + 0x24, 0x04, 0x89, 0x04, 0x24, 0x89, 0x6c, 0x24, + 0x14, 0x8b, 0x6a, 0x14, 0x81, 0x7d, 0x08, 0x80, + 0x00, 0x00, 0x00, 0x75, 0x3e, 0x89, 0x5c, 0x24, + 0x10, 0x8d, 0x04, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xfb, 0x29, 0xc3, 0x31, 0xc0, 0x0f, 0xb6, + 0x4c, 0x24, 0x08, 0x88, 0xc8, 0x8d, 0x04, 0x83, + 0x83, 0xc0, 0xfc, 0x8b, 0x08, 0x8b, 0x59, 0x04, + 0x3b, 0x5a, 0x08, 0x74, 0x32, 0x8b, 0x44, 0x24, + 0x04, 0x89, 0x44, 0x24, 0x34, 0x89, 0x7c, 0x24, + 0x30, 0x8b, 0x44, 0x24, 0x10, 0x89, 0x44, 0x24, + 0x2c, 0xeb, 0x10, 0x8b, 0x44, 0x24, 0x04, 0x89, + 0x44, 0x24, 0x34, 0x89, 0x7c, 0x24, 0x30, 0x89, + 0x5c, 0x24, 0x2c, 0x83, 0xc4, 0x18, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x31, + 0xd2, 0x0f, 0xb6, 0x5c, 0x24, 0x0c, 0x88, 0xda, + 0x01, 0xf2, 0x4a, 0x8b, 0x5c, 0x24, 0x10, 0x89, + 0x7b, 0x20, 0x83, 0xc0, 0x04, 0x52, 0x50, 0x51, + 0xff, 0x55, 0x04, 0x83, 0xc4, 0x0c, 0x89, 0x44, + 0x24, 0x0c, 0x8b, 0x43, 0x20, 0x89, 0x44, 0x24, + 0x08, 0xc7, 0x43, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x14, 0x24, 0x8b, 0x04, 0x97, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x08, 0x75, 0x0d, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, 0x04, 0x83, + 0xc4, 0x04, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x04, + 0x87, 0x85, 0xc0, 0x74, 0x1c, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, + 0x89, 0x08, 0x75, 0x0d, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, + 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x3e, 0x46, 0x83, 0xc7, 0xfc, 0xeb, + 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x83, 0xc7, 0xfc, 0x83, 0xfe, 0x01, 0x76, + 0x20, 0x8b, 0x07, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0xeb, + 0xd7, 0x8b, 0x4c, 0x24, 0x0c, 0x85, 0xc9, 0x8b, + 0x6c, 0x24, 0x14, 0x74, 0x26, 0x8b, 0x44, 0x24, + 0x08, 0x89, 0x0c, 0x90, 0x8d, 0x04, 0xa8, 0x8b, + 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, 0x34, 0x89, + 0x44, 0x24, 0x30, 0x89, 0x5c, 0x24, 0x2c, 0x83, + 0xc4, 0x18, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x44, 0x24, 0x08, 0x8d, + 0x04, 0x90, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4c, + 0x24, 0x34, 0x89, 0x5c, 0x24, 0x2c, 0x89, 0x44, + 0x24, 0x30, 0x83, 0xc4, 0x18, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_32(code + 0x32, (uintptr_t)&PyMethodDescr_Type); + patch_x86_64_32rx(code + 0xb3, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xff, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x126, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x132, instruction->oparg); + patch_x86_64_32rx(code + 0x16c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x1a7, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x1ca, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 18 subl $0x18, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 f0 movzwl %ax, %esi + // 13: 89 f5 movl %esi, %ebp + // 15: f7 d5 notl %ebp + // 17: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 1c: 29 f1 subl %esi, %ecx + // 1e: 83 3c af 00 cmpl $0x0, (%edi,%ebp,4) + // 22: 0f 95 44 24 0c setne 0xc(%esp) + // 27: 0f 94 44 24 08 sete 0x8(%esp) + // 2c: 8b 14 8f movl (%edi,%ecx,4), %edx + // 2f: 81 7a 04 00 00 00 00 cmpl $0x0, 0x4(%edx) + // 00000032: IMAGE_REL_I386_DIR32 _PyMethodDescr_Type + // 36: 8b 44 24 34 movl 0x34(%esp), %eax + // 3a: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // 3e: 75 59 jne 0x99 <__JIT_ENTRY+0x99> + // 40: 89 44 24 04 movl %eax, 0x4(%esp) + // 44: 89 0c 24 movl %ecx, (%esp) + // 47: 89 6c 24 14 movl %ebp, 0x14(%esp) + // 4b: 8b 6a 14 movl 0x14(%edx), %ebp + // 4e: 81 7d 08 82 00 00 00 cmpl $0x82, 0x8(%ebp) + // 55: 75 3e jne 0x95 <__JIT_ENTRY+0x95> + // 57: 89 5c 24 10 movl %ebx, 0x10(%esp) + // 5b: 8d 04 b5 00 00 00 00 leal (,%esi,4), %eax + // 62: 89 fb movl %edi, %ebx + // 64: 29 c3 subl %eax, %ebx + // 66: 31 c0 xorl %eax, %eax + // 68: 0f b6 4c 24 08 movzbl 0x8(%esp), %ecx + // 6d: 88 c8 movb %cl, %al + // 6f: 8d 04 83 leal (%ebx,%eax,4), %eax + // 72: 83 c0 fc addl $-0x4, %eax + // 75: 8b 18 movl (%eax), %ebx + // 77: 8b 4b 04 movl 0x4(%ebx), %ecx + // 7a: 3b 4a 08 cmpl 0x8(%edx), %ecx + // 7d: 74 32 je 0xb1 <__JIT_ENTRY+0xb1> + // 7f: 8b 44 24 04 movl 0x4(%esp), %eax + // 83: 89 44 24 34 movl %eax, 0x34(%esp) + // 87: 89 7c 24 30 movl %edi, 0x30(%esp) + // 8b: 8b 44 24 10 movl 0x10(%esp), %eax + // 8f: 89 44 24 2c movl %eax, 0x2c(%esp) + // 93: eb 10 jmp 0xa5 <__JIT_ENTRY+0xa5> + // 95: 8b 44 24 04 movl 0x4(%esp), %eax + // 99: 89 44 24 34 movl %eax, 0x34(%esp) + // 9d: 89 7c 24 30 movl %edi, 0x30(%esp) + // a1: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // a5: 83 c4 18 addl $0x18, %esp + // a8: 5e popl %esi + // a9: 5f popl %edi + // aa: 5b popl %ebx + // ab: 5d popl %ebp + // ac: e9 00 00 00 00 jmp 0xb1 <__JIT_ENTRY+0xb1> + // 000000ad: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // b1: 31 c9 xorl %ecx, %ecx + // b3: 0f b6 54 24 0c movzbl 0xc(%esp), %edx + // b8: 88 d1 movb %dl, %cl + // ba: 01 f1 addl %esi, %ecx + // bc: 49 decl %ecx + // bd: 89 da movl %ebx, %edx + // bf: 8b 5c 24 10 movl 0x10(%esp), %ebx + // c3: 89 7b 20 movl %edi, 0x20(%ebx) + // c6: 83 c0 04 addl $0x4, %eax + // c9: 6a 00 pushl $0x0 + // cb: 51 pushl %ecx + // cc: 50 pushl %eax + // cd: 52 pushl %edx + // ce: ff 55 04 calll *0x4(%ebp) + // d1: 83 c4 10 addl $0x10, %esp + // d4: 89 44 24 0c movl %eax, 0xc(%esp) + // d8: 8b 43 20 movl 0x20(%ebx), %eax + // db: 89 44 24 08 movl %eax, 0x8(%esp) + // df: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // e6: 8b 14 24 movl (%esp), %edx + // e9: 8b 04 97 movl (%edi,%edx,4), %eax + // ec: 8b 08 movl (%eax), %ecx + // ee: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // f4: 7f 12 jg 0x108 <__JIT_ENTRY+0x108> + // f6: 49 decl %ecx + // f7: 89 08 movl %ecx, (%eax) + // f9: 75 0d jne 0x108 <__JIT_ENTRY+0x108> + // fb: 50 pushl %eax + // fc: e8 00 00 00 00 calll 0x101 <__JIT_ENTRY+0x101> + // 000000fd: IMAGE_REL_I386_REL32 __Py_Dealloc + // 101: 8b 54 24 04 movl 0x4(%esp), %edx + // 105: 83 c4 04 addl $0x4, %esp + // 108: 8b 44 24 14 movl 0x14(%esp), %eax + // 10c: 8b 04 87 movl (%edi,%eax,4), %eax + // 10f: 85 c0 testl %eax, %eax + // 111: 74 1c je 0x12f <__JIT_ENTRY+0x12f> + // 113: 8b 08 movl (%eax), %ecx + // 115: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 11b: 7f 12 jg 0x12f <__JIT_ENTRY+0x12f> + // 11d: 49 decl %ecx + // 11e: 89 08 movl %ecx, (%eax) + // 120: 75 0d jne 0x12f <__JIT_ENTRY+0x12f> + // 122: 50 pushl %eax + // 123: e8 00 00 00 00 calll 0x128 <__JIT_ENTRY+0x128> + // 00000124: IMAGE_REL_I386_REL32 __Py_Dealloc + // 128: 8b 54 24 04 movl 0x4(%esp), %edx + // 12c: 83 c4 04 addl $0x4, %esp + // 12f: b8 00 00 00 00 movl $0x0, %eax + // 00000130: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 134: 66 85 c0 testw %ax, %ax + // 137: 74 30 je 0x169 <__JIT_ENTRY+0x169> + // 139: 46 incl %esi + // 13a: 83 c7 fc addl $-0x4, %edi + // 13d: eb 0a jmp 0x149 <__JIT_ENTRY+0x149> + // 13f: 90 nop + // 140: 4e decl %esi + // 141: 83 c7 fc addl $-0x4, %edi + // 144: 83 fe 01 cmpl $0x1, %esi + // 147: 76 20 jbe 0x169 <__JIT_ENTRY+0x169> + // 149: 8b 07 movl (%edi), %eax + // 14b: 8b 08 movl (%eax), %ecx + // 14d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 153: 7f eb jg 0x140 <__JIT_ENTRY+0x140> + // 155: 49 decl %ecx + // 156: 89 08 movl %ecx, (%eax) + // 158: 75 e6 jne 0x140 <__JIT_ENTRY+0x140> + // 15a: 50 pushl %eax + // 15b: e8 00 00 00 00 calll 0x160 <__JIT_ENTRY+0x160> + // 0000015c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 160: 8b 54 24 04 movl 0x4(%esp), %edx + // 164: 83 c4 04 addl $0x4, %esp + // 167: eb d7 jmp 0x140 <__JIT_ENTRY+0x140> + // 169: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 16d: 85 c9 testl %ecx, %ecx + // 16f: 8b 6c 24 14 movl 0x14(%esp), %ebp + // 173: 74 26 je 0x19b <__JIT_ENTRY+0x19b> + // 175: 8b 44 24 08 movl 0x8(%esp), %eax + // 179: 89 0c 90 movl %ecx, (%eax,%edx,4) + // 17c: 8d 04 a8 leal (%eax,%ebp,4), %eax + // 17f: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 183: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 187: 89 44 24 30 movl %eax, 0x30(%esp) + // 18b: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 18f: 83 c4 18 addl $0x18, %esp + // 192: 5e popl %esi + // 193: 5f popl %edi + // 194: 5b popl %ebx + // 195: 5d popl %ebp + // 196: e9 00 00 00 00 jmp 0x19b <__JIT_ENTRY+0x19b> + // 00000197: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 19b: 8b 44 24 08 movl 0x8(%esp), %eax + // 19f: 8d 04 90 leal (%eax,%edx,4), %eax + // 1a2: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 1a6: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 1aa: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 1ae: 89 44 24 30 movl %eax, 0x30(%esp) + // 1b2: 83 c4 18 addl $0x18, %esp + // 1b5: 5e popl %esi + // 1b6: 5f popl %edi + // 1b7: 5b popl %ebx + // 1b8: 5d popl %ebp + // 1b9: e9 00 00 00 00 jmp 0x1be <__JIT_ENTRY+0x1be> + // 000001ba: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[446] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x18, 0x8b, + 0x7c, 0x24, 0x30, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xf0, 0x89, 0xf5, 0xf7, 0xd5, 0xb9, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xf1, 0x83, 0x3c, + 0xaf, 0x00, 0x0f, 0x95, 0x44, 0x24, 0x0c, 0x0f, + 0x94, 0x44, 0x24, 0x08, 0x8b, 0x14, 0x8f, 0x81, + 0x7a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x44, + 0x24, 0x34, 0x8b, 0x5c, 0x24, 0x2c, 0x75, 0x59, + 0x89, 0x44, 0x24, 0x04, 0x89, 0x0c, 0x24, 0x89, + 0x6c, 0x24, 0x14, 0x8b, 0x6a, 0x14, 0x81, 0x7d, + 0x08, 0x82, 0x00, 0x00, 0x00, 0x75, 0x3e, 0x89, + 0x5c, 0x24, 0x10, 0x8d, 0x04, 0xb5, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xfb, 0x29, 0xc3, 0x31, 0xc0, + 0x0f, 0xb6, 0x4c, 0x24, 0x08, 0x88, 0xc8, 0x8d, + 0x04, 0x83, 0x83, 0xc0, 0xfc, 0x8b, 0x18, 0x8b, + 0x4b, 0x04, 0x3b, 0x4a, 0x08, 0x74, 0x32, 0x8b, + 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, 0x34, 0x89, + 0x7c, 0x24, 0x30, 0x8b, 0x44, 0x24, 0x10, 0x89, + 0x44, 0x24, 0x2c, 0xeb, 0x10, 0x8b, 0x44, 0x24, + 0x04, 0x89, 0x44, 0x24, 0x34, 0x89, 0x7c, 0x24, + 0x30, 0x89, 0x5c, 0x24, 0x2c, 0x83, 0xc4, 0x18, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x31, 0xc9, 0x0f, 0xb6, 0x54, 0x24, 0x0c, + 0x88, 0xd1, 0x01, 0xf1, 0x49, 0x89, 0xda, 0x8b, + 0x5c, 0x24, 0x10, 0x89, 0x7b, 0x20, 0x83, 0xc0, + 0x04, 0x6a, 0x00, 0x51, 0x50, 0x52, 0xff, 0x55, + 0x04, 0x83, 0xc4, 0x10, 0x89, 0x44, 0x24, 0x0c, + 0x8b, 0x43, 0x20, 0x89, 0x44, 0x24, 0x08, 0xc7, + 0x43, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x14, + 0x24, 0x8b, 0x04, 0x97, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, + 0x08, 0x75, 0x0d, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, + 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x04, 0x87, 0x85, + 0xc0, 0x74, 0x1c, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x08, + 0x75, 0x0d, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x30, 0x46, 0x83, 0xc7, 0xfc, 0xeb, 0x0a, 0x90, + 0x4e, 0x83, 0xc7, 0xfc, 0x83, 0xfe, 0x01, 0x76, + 0x20, 0x8b, 0x07, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0xeb, + 0xd7, 0x8b, 0x4c, 0x24, 0x0c, 0x85, 0xc9, 0x8b, + 0x6c, 0x24, 0x14, 0x74, 0x26, 0x8b, 0x44, 0x24, + 0x08, 0x89, 0x0c, 0x90, 0x8d, 0x04, 0xa8, 0x8b, + 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, 0x34, 0x89, + 0x44, 0x24, 0x30, 0x89, 0x5c, 0x24, 0x2c, 0x83, + 0xc4, 0x18, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x44, 0x24, 0x08, 0x8d, + 0x04, 0x90, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4c, + 0x24, 0x34, 0x89, 0x5c, 0x24, 0x2c, 0x89, 0x44, + 0x24, 0x30, 0x83, 0xc4, 0x18, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_32(code + 0x32, (uintptr_t)&PyMethodDescr_Type); + patch_x86_64_32rx(code + 0xad, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xfd, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x124, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x130, instruction->oparg); + patch_x86_64_32rx(code + 0x15c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x197, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x1ba, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_NOARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_NOARGS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 7c 24 28 movl 0x28(%esp), %edi + // b: 8b 6c 24 24 movl 0x24(%esp), %ebp + // f: 8b 74 24 20 movl 0x20(%esp), %esi + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 c0 movzwl %ax, %eax + // 1b: 89 c2 movl %eax, %edx + // 1d: f7 d2 notl %edx + // 1f: 31 c9 xorl %ecx, %ecx + // 21: 31 db xorl %ebx, %ebx + // 23: 83 7c 95 00 00 cmpl $0x0, (%ebp,%edx,4) + // 28: 0f 94 c2 sete %dl + // 2b: 0f 95 c3 setne %bl + // 2e: 01 c3 addl %eax, %ebx + // 30: 83 fb 01 cmpl $0x1, %ebx + // 33: 0f 85 f4 00 00 00 jne 0x12d <__JIT_ENTRY+0x12d> + // 39: 89 3c 24 movl %edi, (%esp) + // 3c: 89 74 24 04 movl %esi, 0x4(%esp) + // 40: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 45: 29 c6 subl %eax, %esi + // 47: 8b 7c b5 00 movl (%ebp,%esi,4), %edi + // 4b: 81 7f 04 00 00 00 00 cmpl $0x0, 0x4(%edi) + // 0000004e: IMAGE_REL_I386_DIR32 _PyMethodDescr_Type + // 52: 0f 85 e3 00 00 00 jne 0x13b <__JIT_ENTRY+0x13b> + // 58: c1 e0 02 shll $0x2, %eax + // 5b: 89 eb movl %ebp, %ebx + // 5d: 29 c3 subl %eax, %ebx + // 5f: 88 d1 movb %dl, %cl + // 61: 8d 04 8d fc ff ff ff leal -0x4(,%ecx,4), %eax + // 68: 8b 14 03 movl (%ebx,%eax), %edx + // 6b: 8b 42 04 movl 0x4(%edx), %eax + // 6e: 3b 47 08 cmpl 0x8(%edi), %eax + // 71: 0f 85 c4 00 00 00 jne 0x13b <__JIT_ENTRY+0x13b> + // 77: 8b 47 14 movl 0x14(%edi), %eax + // 7a: 83 78 08 04 cmpl $0x4, 0x8(%eax) + // 7e: 0f 85 b7 00 00 00 jne 0x13b <__JIT_ENTRY+0x13b> + // 84: 8b 1c 24 movl (%esp), %ebx + // 87: 8b 4b 24 movl 0x24(%ebx), %ecx + // 8a: 85 c9 testl %ecx, %ecx + // 8c: 8b 7c 24 04 movl 0x4(%esp), %edi + // 90: 0f 8e c4 00 00 00 jle 0x15a <__JIT_ENTRY+0x15a> + // 96: 8b 40 04 movl 0x4(%eax), %eax + // 99: 49 decl %ecx + // 9a: 89 4b 24 movl %ecx, 0x24(%ebx) + // 9d: 89 6f 20 movl %ebp, 0x20(%edi) + // a0: 6a 00 pushl $0x0 + // a2: 52 pushl %edx + // a3: 89 54 24 10 movl %edx, 0x10(%esp) + // a7: ff d0 calll *%eax + // a9: 8b 54 24 10 movl 0x10(%esp), %edx + // ad: 83 c4 08 addl $0x8, %esp + // b0: 8b 4f 20 movl 0x20(%edi), %ecx + // b3: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // ba: ff 43 24 incl 0x24(%ebx) + // bd: 89 c3 movl %eax, %ebx + // bf: 89 4f 20 movl %ecx, 0x20(%edi) + // c2: 8b 02 movl (%edx), %eax + // c4: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // c9: 7f 0e jg 0xd9 <__JIT_ENTRY+0xd9> + // cb: 48 decl %eax + // cc: 89 02 movl %eax, (%edx) + // ce: 75 09 jne 0xd9 <__JIT_ENTRY+0xd9> + // d0: 52 pushl %edx + // d1: e8 00 00 00 00 calll 0xd6 <__JIT_ENTRY+0xd6> + // 000000d2: IMAGE_REL_I386_REL32 __Py_Dealloc + // d6: 83 c4 04 addl $0x4, %esp + // d9: 8d 04 b5 00 00 00 00 leal (,%esi,4), %eax + // e0: 01 47 20 addl %eax, 0x20(%edi) + // e3: 8b 44 b5 00 movl (%ebp,%esi,4), %eax + // e7: 8b 08 movl (%eax), %ecx + // e9: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // ef: 7f 0e jg 0xff <__JIT_ENTRY+0xff> + // f1: 49 decl %ecx + // f2: 89 08 movl %ecx, (%eax) + // f4: 75 09 jne 0xff <__JIT_ENTRY+0xff> + // f6: 50 pushl %eax + // f7: e8 00 00 00 00 calll 0xfc <__JIT_ENTRY+0xfc> + // 000000f8: IMAGE_REL_I386_REL32 __Py_Dealloc + // fc: 83 c4 04 addl $0x4, %esp + // ff: 8b 47 20 movl 0x20(%edi), %eax + // 102: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 109: 85 db testl %ebx, %ebx + // 10b: 74 5b je 0x168 <__JIT_ENTRY+0x168> + // 10d: 89 18 movl %ebx, (%eax) + // 10f: 83 c0 04 addl $0x4, %eax + // 112: 8b 0c 24 movl (%esp), %ecx + // 115: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 119: 89 44 24 24 movl %eax, 0x24(%esp) + // 11d: 89 7c 24 20 movl %edi, 0x20(%esp) + // 121: 83 c4 0c addl $0xc, %esp + // 124: 5e popl %esi + // 125: 5f popl %edi + // 126: 5b popl %ebx + // 127: 5d popl %ebp + // 128: e9 00 00 00 00 jmp 0x12d <__JIT_ENTRY+0x12d> + // 00000129: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 12d: 89 7c 24 28 movl %edi, 0x28(%esp) + // 131: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 135: 89 74 24 20 movl %esi, 0x20(%esp) + // 139: eb 13 jmp 0x14e <__JIT_ENTRY+0x14e> + // 13b: 8b 04 24 movl (%esp), %eax + // 13e: 89 44 24 28 movl %eax, 0x28(%esp) + // 142: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 146: 8b 44 24 04 movl 0x4(%esp), %eax + // 14a: 89 44 24 20 movl %eax, 0x20(%esp) + // 14e: 83 c4 0c addl $0xc, %esp + // 151: 5e popl %esi + // 152: 5f popl %edi + // 153: 5b popl %ebx + // 154: 5d popl %ebp + // 155: e9 00 00 00 00 jmp 0x15a <__JIT_ENTRY+0x15a> + // 00000156: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 15a: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 15e: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 162: 89 7c 24 20 movl %edi, 0x20(%esp) + // 166: eb e6 jmp 0x14e <__JIT_ENTRY+0x14e> + // 168: 8b 0c 24 movl (%esp), %ecx + // 16b: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 16f: 89 44 24 24 movl %eax, 0x24(%esp) + // 173: 89 7c 24 20 movl %edi, 0x20(%esp) + // 177: 83 c4 0c addl $0xc, %esp + // 17a: 5e popl %esi + // 17b: 5f popl %edi + // 17c: 5b popl %ebx + // 17d: 5d popl %ebp + // 17e: e9 00 00 00 00 jmp 0x183 <__JIT_ENTRY+0x183> + // 0000017f: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[387] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x7c, 0x24, 0x28, 0x8b, 0x6c, 0x24, 0x24, 0x8b, + 0x74, 0x24, 0x20, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc0, 0x89, 0xc2, 0xf7, 0xd2, 0x31, + 0xc9, 0x31, 0xdb, 0x83, 0x7c, 0x95, 0x00, 0x00, + 0x0f, 0x94, 0xc2, 0x0f, 0x95, 0xc3, 0x01, 0xc3, + 0x83, 0xfb, 0x01, 0x0f, 0x85, 0xf4, 0x00, 0x00, + 0x00, 0x89, 0x3c, 0x24, 0x89, 0x74, 0x24, 0x04, + 0xbe, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc6, 0x8b, + 0x7c, 0xb5, 0x00, 0x81, 0x7f, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x85, 0xe3, 0x00, 0x00, 0x00, + 0xc1, 0xe0, 0x02, 0x89, 0xeb, 0x29, 0xc3, 0x88, + 0xd1, 0x8d, 0x04, 0x8d, 0xfc, 0xff, 0xff, 0xff, + 0x8b, 0x14, 0x03, 0x8b, 0x42, 0x04, 0x3b, 0x47, + 0x08, 0x0f, 0x85, 0xc4, 0x00, 0x00, 0x00, 0x8b, + 0x47, 0x14, 0x83, 0x78, 0x08, 0x04, 0x0f, 0x85, + 0xb7, 0x00, 0x00, 0x00, 0x8b, 0x1c, 0x24, 0x8b, + 0x4b, 0x24, 0x85, 0xc9, 0x8b, 0x7c, 0x24, 0x04, + 0x0f, 0x8e, 0xc4, 0x00, 0x00, 0x00, 0x8b, 0x40, + 0x04, 0x49, 0x89, 0x4b, 0x24, 0x89, 0x6f, 0x20, + 0x6a, 0x00, 0x52, 0x89, 0x54, 0x24, 0x10, 0xff, + 0xd0, 0x8b, 0x54, 0x24, 0x10, 0x83, 0xc4, 0x08, + 0x8b, 0x4f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x43, 0x24, 0x89, 0xc3, 0x89, + 0x4f, 0x20, 0x8b, 0x02, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x48, 0x89, 0x02, 0x75, 0x09, + 0x52, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8d, 0x04, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x47, 0x20, 0x8b, 0x44, 0xb5, 0x00, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x47, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xdb, 0x74, 0x5b, 0x89, 0x18, 0x83, + 0xc0, 0x04, 0x8b, 0x0c, 0x24, 0x89, 0x4c, 0x24, + 0x28, 0x89, 0x44, 0x24, 0x24, 0x89, 0x7c, 0x24, + 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, + 0x28, 0x89, 0x6c, 0x24, 0x24, 0x89, 0x74, 0x24, + 0x20, 0xeb, 0x13, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x28, 0x89, 0x6c, 0x24, 0x24, 0x8b, 0x44, + 0x24, 0x04, 0x89, 0x44, 0x24, 0x20, 0x83, 0xc4, + 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x5c, 0x24, 0x28, 0x89, 0x6c, + 0x24, 0x24, 0x89, 0x7c, 0x24, 0x20, 0xeb, 0xe6, + 0x8b, 0x0c, 0x24, 0x89, 0x4c, 0x24, 0x28, 0x89, + 0x44, 0x24, 0x24, 0x89, 0x7c, 0x24, 0x20, 0x83, + 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x4e, (uintptr_t)&PyMethodDescr_Type); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xf8, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x129, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x156, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x17f, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_O.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 1c subl $0x1c, %esp + // 7: 8b 7c 24 38 movl 0x38(%esp), %edi + // b: 8b 6c 24 34 movl 0x34(%esp), %ebp + // f: b8 00 00 00 00 movl $0x0, %eax + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 f0 movzwl %ax, %esi + // 17: 89 f3 movl %esi, %ebx + // 19: f7 d3 notl %ebx + // 1b: 31 d2 xorl %edx, %edx + // 1d: 31 c0 xorl %eax, %eax + // 1f: 83 7c 9d 00 00 cmpl $0x0, (%ebp,%ebx,4) + // 24: 0f 95 c2 setne %dl + // 27: 0f 94 44 24 08 sete 0x8(%esp) + // 2c: 01 f2 addl %esi, %edx + // 2e: 8b 4c 24 30 movl 0x30(%esp), %ecx + // 32: 83 fa 02 cmpl $0x2, %edx + // 35: 75 7c jne 0xb3 <__JIT_ENTRY+0xb3> + // 37: 89 0c 24 movl %ecx, (%esp) + // 3a: 89 7c 24 04 movl %edi, 0x4(%esp) + // 3e: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 43: 29 f7 subl %esi, %edi + // 45: 8b 54 bd 00 movl (%ebp,%edi,4), %edx + // 49: 81 7a 04 00 00 00 00 cmpl $0x0, 0x4(%edx) + // 0000004c: IMAGE_REL_I386_DIR32 _PyMethodDescr_Type + // 50: 75 4c jne 0x9e <__JIT_ENTRY+0x9e> + // 52: 8b 4a 14 movl 0x14(%edx), %ecx + // 55: 83 79 08 08 cmpl $0x8, 0x8(%ecx) + // 59: 75 43 jne 0x9e <__JIT_ENTRY+0x9e> + // 5b: 89 7c 24 18 movl %edi, 0x18(%esp) + // 5f: 8b 7c 24 04 movl 0x4(%esp), %edi + // 63: 8b 7f 24 movl 0x24(%edi), %edi + // 66: 89 7c 24 10 movl %edi, 0x10(%esp) + // 6a: 85 ff testl %edi, %edi + // 6c: 7e 30 jle 0x9e <__JIT_ENTRY+0x9e> + // 6e: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 72: 8d 0c b5 00 00 00 00 leal (,%esi,4), %ecx + // 79: 89 ef movl %ebp, %edi + // 7b: 29 cf subl %ecx, %edi + // 7d: 0f b6 4c 24 08 movzbl 0x8(%esp), %ecx + // 82: 88 c8 movb %cl, %al + // 84: 8d 0c 85 fc ff ff ff leal -0x4(,%eax,4), %ecx + // 8b: 89 7c 24 0c movl %edi, 0xc(%esp) + // 8f: 8b 04 0f movl (%edi,%ecx), %eax + // 92: 89 44 24 08 movl %eax, 0x8(%esp) + // 96: 8b 40 04 movl 0x4(%eax), %eax + // 99: 3b 42 08 cmpl 0x8(%edx), %eax + // 9c: 74 2d je 0xcb <__JIT_ENTRY+0xcb> + // 9e: 8b 44 24 04 movl 0x4(%esp), %eax + // a2: 89 44 24 38 movl %eax, 0x38(%esp) + // a6: 89 6c 24 34 movl %ebp, 0x34(%esp) + // aa: 8b 04 24 movl (%esp), %eax + // ad: 89 44 24 30 movl %eax, 0x30(%esp) + // b1: eb 0c jmp 0xbf <__JIT_ENTRY+0xbf> + // b3: 89 7c 24 38 movl %edi, 0x38(%esp) + // b7: 89 6c 24 34 movl %ebp, 0x34(%esp) + // bb: 89 4c 24 30 movl %ecx, 0x30(%esp) + // bf: 83 c4 1c addl $0x1c, %esp + // c2: 5e popl %esi + // c3: 5f popl %edi + // c4: 5b popl %ebx + // c5: 5d popl %ebp + // c6: e9 00 00 00 00 jmp 0xcb <__JIT_ENTRY+0xcb> + // 000000c7: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // cb: 8b 44 24 0c movl 0xc(%esp), %eax + // cf: 8b 44 08 04 movl 0x4(%eax,%ecx), %eax + // d3: 89 44 24 0c movl %eax, 0xc(%esp) + // d7: 8b 4c 24 14 movl 0x14(%esp), %ecx + // db: 8b 49 04 movl 0x4(%ecx), %ecx + // de: 8b 54 24 10 movl 0x10(%esp), %edx + // e2: 4a decl %edx + // e3: 8b 44 24 04 movl 0x4(%esp), %eax + // e7: 89 50 24 movl %edx, 0x24(%eax) + // ea: 8b 04 24 movl (%esp), %eax + // ed: 89 68 20 movl %ebp, 0x20(%eax) + // f0: ff 74 24 0c pushl 0xc(%esp) + // f4: ff 74 24 0c pushl 0xc(%esp) + // f8: ff d1 calll *%ecx + // fa: 8b 54 24 08 movl 0x8(%esp), %edx + // fe: 83 c4 08 addl $0x8, %esp + // 101: 8b 4a 20 movl 0x20(%edx), %ecx + // 104: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 108: c7 42 20 00 00 00 00 movl $0x0, 0x20(%edx) + // 10f: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 113: ff 41 24 incl 0x24(%ecx) + // 116: 89 44 24 10 movl %eax, 0x10(%esp) + // 11a: 8b 7c 24 18 movl 0x18(%esp), %edi + // 11e: 8b 44 bd 00 movl (%ebp,%edi,4), %eax + // 122: 8b 08 movl (%eax), %ecx + // 124: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 12a: 7f 12 jg 0x13e <__JIT_ENTRY+0x13e> + // 12c: 49 decl %ecx + // 12d: 89 08 movl %ecx, (%eax) + // 12f: 75 0d jne 0x13e <__JIT_ENTRY+0x13e> + // 131: 50 pushl %eax + // 132: e8 00 00 00 00 calll 0x137 <__JIT_ENTRY+0x137> + // 00000133: IMAGE_REL_I386_REL32 __Py_Dealloc + // 137: 8b 54 24 04 movl 0x4(%esp), %edx + // 13b: 83 c4 04 addl $0x4, %esp + // 13e: 8b 44 9d 00 movl (%ebp,%ebx,4), %eax + // 142: 85 c0 testl %eax, %eax + // 144: 74 1c je 0x162 <__JIT_ENTRY+0x162> + // 146: 8b 08 movl (%eax), %ecx + // 148: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 14e: 7f 12 jg 0x162 <__JIT_ENTRY+0x162> + // 150: 49 decl %ecx + // 151: 89 08 movl %ecx, (%eax) + // 153: 75 0d jne 0x162 <__JIT_ENTRY+0x162> + // 155: 50 pushl %eax + // 156: e8 00 00 00 00 calll 0x15b <__JIT_ENTRY+0x15b> + // 00000157: IMAGE_REL_I386_REL32 __Py_Dealloc + // 15b: 8b 54 24 04 movl 0x4(%esp), %edx + // 15f: 83 c4 04 addl $0x4, %esp + // 162: b8 00 00 00 00 movl $0x0, %eax + // 00000163: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 167: 66 85 c0 testw %ax, %ax + // 16a: 74 3e je 0x1aa <__JIT_ENTRY+0x1aa> + // 16c: 46 incl %esi + // 16d: 83 c5 fc addl $-0x4, %ebp + // 170: eb 17 jmp 0x189 <__JIT_ENTRY+0x189> + // 172: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 180: 4e decl %esi + // 181: 83 c5 fc addl $-0x4, %ebp + // 184: 83 fe 01 cmpl $0x1, %esi + // 187: 76 21 jbe 0x1aa <__JIT_ENTRY+0x1aa> + // 189: 8b 45 00 movl (%ebp), %eax + // 18c: 8b 08 movl (%eax), %ecx + // 18e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 194: 7f ea jg 0x180 <__JIT_ENTRY+0x180> + // 196: 49 decl %ecx + // 197: 89 08 movl %ecx, (%eax) + // 199: 75 e5 jne 0x180 <__JIT_ENTRY+0x180> + // 19b: 50 pushl %eax + // 19c: e8 00 00 00 00 calll 0x1a1 <__JIT_ENTRY+0x1a1> + // 0000019d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 1a1: 8b 54 24 04 movl 0x4(%esp), %edx + // 1a5: 83 c4 04 addl $0x4, %esp + // 1a8: eb d6 jmp 0x180 <__JIT_ENTRY+0x180> + // 1aa: 8b 4c 24 10 movl 0x10(%esp), %ecx + // 1ae: 85 c9 testl %ecx, %ecx + // 1b0: 74 26 je 0x1d8 <__JIT_ENTRY+0x1d8> + // 1b2: 8b 44 24 08 movl 0x8(%esp), %eax + // 1b6: 89 0c b8 movl %ecx, (%eax,%edi,4) + // 1b9: 8d 04 98 leal (%eax,%ebx,4), %eax + // 1bc: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 1c0: 89 4c 24 38 movl %ecx, 0x38(%esp) + // 1c4: 89 44 24 34 movl %eax, 0x34(%esp) + // 1c8: 89 54 24 30 movl %edx, 0x30(%esp) + // 1cc: 83 c4 1c addl $0x1c, %esp + // 1cf: 5e popl %esi + // 1d0: 5f popl %edi + // 1d1: 5b popl %ebx + // 1d2: 5d popl %ebp + // 1d3: e9 00 00 00 00 jmp 0x1d8 <__JIT_ENTRY+0x1d8> + // 000001d4: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 1d8: 8b 44 24 08 movl 0x8(%esp), %eax + // 1dc: 8d 04 b8 leal (%eax,%edi,4), %eax + // 1df: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 1e3: 89 4c 24 38 movl %ecx, 0x38(%esp) + // 1e7: 89 54 24 30 movl %edx, 0x30(%esp) + // 1eb: 89 44 24 34 movl %eax, 0x34(%esp) + // 1ef: 83 c4 1c addl $0x1c, %esp + // 1f2: 5e popl %esi + // 1f3: 5f popl %edi + // 1f4: 5b popl %ebx + // 1f5: 5d popl %ebp + // 1f6: e9 00 00 00 00 jmp 0x1fb <__JIT_ENTRY+0x1fb> + // 000001f7: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[507] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x1c, 0x8b, + 0x7c, 0x24, 0x38, 0x8b, 0x6c, 0x24, 0x34, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf0, 0x89, + 0xf3, 0xf7, 0xd3, 0x31, 0xd2, 0x31, 0xc0, 0x83, + 0x7c, 0x9d, 0x00, 0x00, 0x0f, 0x95, 0xc2, 0x0f, + 0x94, 0x44, 0x24, 0x08, 0x01, 0xf2, 0x8b, 0x4c, + 0x24, 0x30, 0x83, 0xfa, 0x02, 0x75, 0x7c, 0x89, + 0x0c, 0x24, 0x89, 0x7c, 0x24, 0x04, 0xbf, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x54, 0xbd, + 0x00, 0x81, 0x7a, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x4c, 0x8b, 0x4a, 0x14, 0x83, 0x79, 0x08, + 0x08, 0x75, 0x43, 0x89, 0x7c, 0x24, 0x18, 0x8b, + 0x7c, 0x24, 0x04, 0x8b, 0x7f, 0x24, 0x89, 0x7c, + 0x24, 0x10, 0x85, 0xff, 0x7e, 0x30, 0x89, 0x4c, + 0x24, 0x14, 0x8d, 0x0c, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xef, 0x29, 0xcf, 0x0f, 0xb6, 0x4c, + 0x24, 0x08, 0x88, 0xc8, 0x8d, 0x0c, 0x85, 0xfc, + 0xff, 0xff, 0xff, 0x89, 0x7c, 0x24, 0x0c, 0x8b, + 0x04, 0x0f, 0x89, 0x44, 0x24, 0x08, 0x8b, 0x40, + 0x04, 0x3b, 0x42, 0x08, 0x74, 0x2d, 0x8b, 0x44, + 0x24, 0x04, 0x89, 0x44, 0x24, 0x38, 0x89, 0x6c, + 0x24, 0x34, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, + 0x30, 0xeb, 0x0c, 0x89, 0x7c, 0x24, 0x38, 0x89, + 0x6c, 0x24, 0x34, 0x89, 0x4c, 0x24, 0x30, 0x83, + 0xc4, 0x1c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x44, 0x24, 0x0c, 0x8b, + 0x44, 0x08, 0x04, 0x89, 0x44, 0x24, 0x0c, 0x8b, + 0x4c, 0x24, 0x14, 0x8b, 0x49, 0x04, 0x8b, 0x54, + 0x24, 0x10, 0x4a, 0x8b, 0x44, 0x24, 0x04, 0x89, + 0x50, 0x24, 0x8b, 0x04, 0x24, 0x89, 0x68, 0x20, + 0xff, 0x74, 0x24, 0x0c, 0xff, 0x74, 0x24, 0x0c, + 0xff, 0xd1, 0x8b, 0x54, 0x24, 0x08, 0x83, 0xc4, + 0x08, 0x8b, 0x4a, 0x20, 0x89, 0x4c, 0x24, 0x08, + 0xc7, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x4c, 0x24, 0x04, 0xff, 0x41, 0x24, 0x89, 0x44, + 0x24, 0x10, 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x44, + 0xbd, 0x00, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x08, 0x75, + 0x0d, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0x8b, 0x44, + 0x9d, 0x00, 0x85, 0xc0, 0x74, 0x1c, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x08, 0x75, 0x0d, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, 0x04, 0x83, + 0xc4, 0x04, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x3e, 0x46, 0x83, 0xc5, 0xfc, + 0xeb, 0x17, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x83, 0xc5, 0xfc, 0x83, 0xfe, 0x01, 0x76, + 0x21, 0x8b, 0x45, 0x00, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0xea, 0x49, 0x89, + 0x08, 0x75, 0xe5, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, + 0xeb, 0xd6, 0x8b, 0x4c, 0x24, 0x10, 0x85, 0xc9, + 0x74, 0x26, 0x8b, 0x44, 0x24, 0x08, 0x89, 0x0c, + 0xb8, 0x8d, 0x04, 0x98, 0x8b, 0x4c, 0x24, 0x04, + 0x89, 0x4c, 0x24, 0x38, 0x89, 0x44, 0x24, 0x34, + 0x89, 0x54, 0x24, 0x30, 0x83, 0xc4, 0x1c, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x44, 0x24, 0x08, 0x8d, 0x04, 0xb8, 0x8b, + 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, 0x38, 0x89, + 0x54, 0x24, 0x30, 0x89, 0x44, 0x24, 0x34, 0x83, + 0xc4, 0x1c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_32(code + 0x4c, (uintptr_t)&PyMethodDescr_Type); + patch_x86_64_32rx(code + 0xc7, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x133, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x157, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x163, instruction->oparg); + patch_x86_64_32rx(code + 0x19d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x1d4, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x1f7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_NON_PY_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_NON_PY_GENERAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 14 subl $0x14, %esp + // 7: 8b 7c 24 2c movl 0x2c(%esp), %edi + // b: b8 00 00 00 00 movl $0x0, %eax + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 d8 movzwl %ax, %ebx + // 13: 8d 0c 9d 00 00 00 00 leal (,%ebx,4), %ecx + // 1a: 89 f8 movl %edi, %eax + // 1c: 29 c8 subl %ecx, %eax + // 1e: 89 de movl %ebx, %esi + // 20: f7 d6 notl %esi + // 22: bd fe ff ff ff movl $0xfffffffe, %ebp # imm = 0xFFFFFFFE + // 27: 29 dd subl %ebx, %ebp + // 29: 31 c9 xorl %ecx, %ecx + // 2b: 31 d2 xorl %edx, %edx + // 2d: 89 74 24 10 movl %esi, 0x10(%esp) + // 31: 83 3c b7 00 cmpl $0x0, (%edi,%esi,4) + // 35: 0f 94 c2 sete %dl + // 38: 8d 44 90 fc leal -0x4(%eax,%edx,4), %eax + // 3c: 8b 54 24 30 movl 0x30(%esp), %edx + // 40: 89 54 24 04 movl %edx, 0x4(%esp) + // 44: 0f 95 c1 setne %cl + // 47: 8b 74 24 28 movl 0x28(%esp), %esi + // 4b: 8b 14 af movl (%edi,%ebp,4), %edx + // 4e: 89 7e 20 movl %edi, 0x20(%esi) + // 51: 8d 8c 19 00 00 00 80 leal -0x80000000(%ecx,%ebx), %ecx + // 58: 6a 00 pushl $0x0 + // 5a: 51 pushl %ecx + // 5b: 50 pushl %eax + // 5c: 52 pushl %edx + // 5d: e8 00 00 00 00 calll 0x62 <__JIT_ENTRY+0x62> + // 0000005e: IMAGE_REL_I386_REL32 _PyObject_Vectorcall + // 62: 83 c4 10 addl $0x10, %esp + // 65: 89 44 24 0c movl %eax, 0xc(%esp) + // 69: 8b 46 20 movl 0x20(%esi), %eax + // 6c: 89 04 24 movl %eax, (%esp) + // 6f: 89 74 24 08 movl %esi, 0x8(%esp) + // 73: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 7a: 8b 04 af movl (%edi,%ebp,4), %eax + // 7d: 8b 08 movl (%eax), %ecx + // 7f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 85: 7f 0e jg 0x95 <__JIT_ENTRY+0x95> + // 87: 49 decl %ecx + // 88: 89 08 movl %ecx, (%eax) + // 8a: 75 09 jne 0x95 <__JIT_ENTRY+0x95> + // 8c: 50 pushl %eax + // 8d: e8 00 00 00 00 calll 0x92 <__JIT_ENTRY+0x92> + // 0000008e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 92: 83 c4 04 addl $0x4, %esp + // 95: 8b 74 24 10 movl 0x10(%esp), %esi + // 99: 8b 04 b7 movl (%edi,%esi,4), %eax + // 9c: 85 c0 testl %eax, %eax + // 9e: 74 18 je 0xb8 <__JIT_ENTRY+0xb8> + // a0: 8b 08 movl (%eax), %ecx + // a2: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a8: 7f 0e jg 0xb8 <__JIT_ENTRY+0xb8> + // aa: 49 decl %ecx + // ab: 89 08 movl %ecx, (%eax) + // ad: 75 09 jne 0xb8 <__JIT_ENTRY+0xb8> + // af: 50 pushl %eax + // b0: e8 00 00 00 00 calll 0xb5 <__JIT_ENTRY+0xb5> + // 000000b1: IMAGE_REL_I386_REL32 __Py_Dealloc + // b5: 83 c4 04 addl $0x4, %esp + // b8: b8 00 00 00 00 movl $0x0, %eax + // 000000b9: IMAGE_REL_I386_DIR32 __JIT_OPARG + // bd: 66 85 c0 testw %ax, %ax + // c0: 74 33 je 0xf5 <__JIT_ENTRY+0xf5> + // c2: 43 incl %ebx + // c3: 83 c7 fc addl $-0x4, %edi + // c6: eb 11 jmp 0xd9 <__JIT_ENTRY+0xd9> + // c8: 0f 1f 84 00 00 00 00 00 nopl (%eax,%eax) + // d0: 4b decl %ebx + // d1: 83 c7 fc addl $-0x4, %edi + // d4: 83 fb 01 cmpl $0x1, %ebx + // d7: 76 1c jbe 0xf5 <__JIT_ENTRY+0xf5> + // d9: 8b 07 movl (%edi), %eax + // db: 8b 08 movl (%eax), %ecx + // dd: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // e3: 7f eb jg 0xd0 <__JIT_ENTRY+0xd0> + // e5: 49 decl %ecx + // e6: 89 08 movl %ecx, (%eax) + // e8: 75 e6 jne 0xd0 <__JIT_ENTRY+0xd0> + // ea: 50 pushl %eax + // eb: e8 00 00 00 00 calll 0xf0 <__JIT_ENTRY+0xf0> + // 000000ec: IMAGE_REL_I386_REL32 __Py_Dealloc + // f0: 83 c4 04 addl $0x4, %esp + // f3: eb db jmp 0xd0 <__JIT_ENTRY+0xd0> + // f5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // f9: 85 c9 testl %ecx, %ecx + // fb: 74 29 je 0x126 <__JIT_ENTRY+0x126> + // fd: 8b 04 24 movl (%esp), %eax + // 100: 89 0c a8 movl %ecx, (%eax,%ebp,4) + // 103: 8d 04 b0 leal (%eax,%esi,4), %eax + // 106: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 10a: 89 4c 24 30 movl %ecx, 0x30(%esp) + // 10e: 89 44 24 2c movl %eax, 0x2c(%esp) + // 112: 8b 44 24 08 movl 0x8(%esp), %eax + // 116: 89 44 24 28 movl %eax, 0x28(%esp) + // 11a: 83 c4 14 addl $0x14, %esp + // 11d: 5e popl %esi + // 11e: 5f popl %edi + // 11f: 5b popl %ebx + // 120: 5d popl %ebp + // 121: e9 00 00 00 00 jmp 0x126 <__JIT_ENTRY+0x126> + // 00000122: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 126: 8b 04 24 movl (%esp), %eax + // 129: 8d 04 a8 leal (%eax,%ebp,4), %eax + // 12c: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 130: 89 4c 24 30 movl %ecx, 0x30(%esp) + // 134: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 138: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 13c: 89 44 24 2c movl %eax, 0x2c(%esp) + // 140: 83 c4 14 addl $0x14, %esp + // 143: 5e popl %esi + // 144: 5f popl %edi + // 145: 5b popl %ebx + // 146: 5d popl %ebp + // 147: e9 00 00 00 00 jmp 0x14c <__JIT_ENTRY+0x14c> + // 00000148: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[332] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x14, 0x8b, + 0x7c, 0x24, 0x2c, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xd8, 0x8d, 0x0c, 0x9d, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf8, 0x29, 0xc8, 0x89, 0xde, + 0xf7, 0xd6, 0xbd, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xdd, 0x31, 0xc9, 0x31, 0xd2, 0x89, 0x74, 0x24, + 0x10, 0x83, 0x3c, 0xb7, 0x00, 0x0f, 0x94, 0xc2, + 0x8d, 0x44, 0x90, 0xfc, 0x8b, 0x54, 0x24, 0x30, + 0x89, 0x54, 0x24, 0x04, 0x0f, 0x95, 0xc1, 0x8b, + 0x74, 0x24, 0x28, 0x8b, 0x14, 0xaf, 0x89, 0x7e, + 0x20, 0x8d, 0x8c, 0x19, 0x00, 0x00, 0x00, 0x80, + 0x6a, 0x00, 0x51, 0x50, 0x52, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x10, 0x89, 0x44, 0x24, + 0x0c, 0x8b, 0x46, 0x20, 0x89, 0x04, 0x24, 0x89, + 0x74, 0x24, 0x08, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x04, 0xaf, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, + 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x74, 0x24, + 0x10, 0x8b, 0x04, 0xb7, 0x85, 0xc0, 0x74, 0x18, + 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, + 0x74, 0x33, 0x43, 0x83, 0xc7, 0xfc, 0xeb, 0x11, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x83, 0xc7, 0xfc, 0x83, 0xfb, 0x01, 0x76, + 0x1c, 0x8b, 0x07, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0xeb, 0x49, 0x89, 0x08, + 0x75, 0xe6, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0xdb, 0x8b, 0x4c, 0x24, + 0x0c, 0x85, 0xc9, 0x74, 0x29, 0x8b, 0x04, 0x24, + 0x89, 0x0c, 0xa8, 0x8d, 0x04, 0xb0, 0x8b, 0x4c, + 0x24, 0x04, 0x89, 0x4c, 0x24, 0x30, 0x89, 0x44, + 0x24, 0x2c, 0x8b, 0x44, 0x24, 0x08, 0x89, 0x44, + 0x24, 0x28, 0x83, 0xc4, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, + 0x24, 0x8d, 0x04, 0xa8, 0x8b, 0x4c, 0x24, 0x04, + 0x89, 0x4c, 0x24, 0x30, 0x8b, 0x4c, 0x24, 0x08, + 0x89, 0x4c, 0x24, 0x28, 0x89, 0x44, 0x24, 0x2c, + 0x83, 0xc4, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)&PyObject_Vectorcall + -0x4); + patch_x86_64_32rx(code + 0x8e, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0xb9, instruction->oparg); + patch_x86_64_32rx(code + 0xec, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x122, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x148, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_STR_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_STR_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 44 24 14 movl 0x14(%esp), %eax + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 83 78 f8 00 cmpl $0x0, -0x8(%eax) + // 13: 75 09 jne 0x1e <__JIT_ENTRY+0x1e> + // 15: 81 78 f4 00 00 00 00 cmpl $0x0, -0xc(%eax) + // 00000018: IMAGE_REL_I386_DIR32 _PyUnicode_Type + // 1c: 74 14 je 0x32 <__JIT_ENTRY+0x32> + // 1e: 89 7c 24 18 movl %edi, 0x18(%esp) + // 22: 89 44 24 14 movl %eax, 0x14(%esp) + // 26: 89 74 24 10 movl %esi, 0x10(%esp) + // 2a: 5e popl %esi + // 2b: 5f popl %edi + // 2c: 5b popl %ebx + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 32: 8b 58 fc movl -0x4(%eax), %ebx + // 35: 89 46 20 movl %eax, 0x20(%esi) + // 38: 53 pushl %ebx + // 39: e8 00 00 00 00 calll 0x3e <__JIT_ENTRY+0x3e> + // 0000003a: IMAGE_REL_I386_REL32 _PyObject_Str + // 3e: 83 c4 04 addl $0x4, %esp + // 41: 83 46 20 f4 addl $-0xc, 0x20(%esi) + // 45: 8b 0b movl (%ebx), %ecx + // 47: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4d: 7f 12 jg 0x61 <__JIT_ENTRY+0x61> + // 4f: 49 decl %ecx + // 50: 89 0b movl %ecx, (%ebx) + // 52: 75 0d jne 0x61 <__JIT_ENTRY+0x61> + // 54: 53 pushl %ebx + // 55: 89 c3 movl %eax, %ebx + // 57: e8 00 00 00 00 calll 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5c: 89 d8 movl %ebx, %eax + // 5e: 83 c4 04 addl $0x4, %esp + // 61: 8b 4e 20 movl 0x20(%esi), %ecx + // 64: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 6b: 85 c0 testl %eax, %eax + // 6d: 74 19 je 0x88 <__JIT_ENTRY+0x88> + // 6f: 89 01 movl %eax, (%ecx) + // 71: 83 c1 04 addl $0x4, %ecx + // 74: 89 7c 24 18 movl %edi, 0x18(%esp) + // 78: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 7c: 89 74 24 10 movl %esi, 0x10(%esp) + // 80: 5e popl %esi + // 81: 5f popl %edi + // 82: 5b popl %ebx + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 00000084: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 88: 89 7c 24 18 movl %edi, 0x18(%esp) + // 8c: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 90: 89 74 24 10 movl %esi, 0x10(%esp) + // 94: 5e popl %esi + // 95: 5f popl %edi + // 96: 5b popl %ebx + // 97: e9 00 00 00 00 jmp 0x9c <__JIT_ENTRY+0x9c> + // 00000098: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[156] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x44, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x83, + 0x78, 0xf8, 0x00, 0x75, 0x09, 0x81, 0x78, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x14, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x58, 0xfc, 0x89, 0x46, 0x20, + 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x83, 0x46, 0x20, 0xf4, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, + 0x89, 0x0b, 0x75, 0x0d, 0x53, 0x89, 0xc3, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, + 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x19, 0x89, + 0x01, 0x83, 0xc1, 0x04, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x18, (uintptr_t)&PyUnicode_Type); + patch_x86_64_32rx(code + 0x2e, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)&PyObject_Str + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x98, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_TUPLE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TUPLE_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 44 24 14 movl 0x14(%esp), %eax + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 83 78 f8 00 cmpl $0x0, -0x8(%eax) + // 13: 75 09 jne 0x1e <__JIT_ENTRY+0x1e> + // 15: 81 78 f4 00 00 00 00 cmpl $0x0, -0xc(%eax) + // 00000018: IMAGE_REL_I386_DIR32 _PyTuple_Type + // 1c: 74 14 je 0x32 <__JIT_ENTRY+0x32> + // 1e: 89 7c 24 18 movl %edi, 0x18(%esp) + // 22: 89 44 24 14 movl %eax, 0x14(%esp) + // 26: 89 74 24 10 movl %esi, 0x10(%esp) + // 2a: 5e popl %esi + // 2b: 5f popl %edi + // 2c: 5b popl %ebx + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 32: 8b 58 fc movl -0x4(%eax), %ebx + // 35: 89 46 20 movl %eax, 0x20(%esi) + // 38: 53 pushl %ebx + // 39: e8 00 00 00 00 calll 0x3e <__JIT_ENTRY+0x3e> + // 0000003a: IMAGE_REL_I386_REL32 _PySequence_Tuple + // 3e: 83 c4 04 addl $0x4, %esp + // 41: 83 46 20 f4 addl $-0xc, 0x20(%esi) + // 45: 8b 0b movl (%ebx), %ecx + // 47: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4d: 7f 12 jg 0x61 <__JIT_ENTRY+0x61> + // 4f: 49 decl %ecx + // 50: 89 0b movl %ecx, (%ebx) + // 52: 75 0d jne 0x61 <__JIT_ENTRY+0x61> + // 54: 53 pushl %ebx + // 55: 89 c3 movl %eax, %ebx + // 57: e8 00 00 00 00 calll 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5c: 89 d8 movl %ebx, %eax + // 5e: 83 c4 04 addl $0x4, %esp + // 61: 8b 4e 20 movl 0x20(%esi), %ecx + // 64: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 6b: 85 c0 testl %eax, %eax + // 6d: 74 19 je 0x88 <__JIT_ENTRY+0x88> + // 6f: 89 01 movl %eax, (%ecx) + // 71: 83 c1 04 addl $0x4, %ecx + // 74: 89 7c 24 18 movl %edi, 0x18(%esp) + // 78: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 7c: 89 74 24 10 movl %esi, 0x10(%esp) + // 80: 5e popl %esi + // 81: 5f popl %edi + // 82: 5b popl %ebx + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 00000084: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 88: 89 7c 24 18 movl %edi, 0x18(%esp) + // 8c: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 90: 89 74 24 10 movl %esi, 0x10(%esp) + // 94: 5e popl %esi + // 95: 5f popl %edi + // 96: 5b popl %ebx + // 97: e9 00 00 00 00 jmp 0x9c <__JIT_ENTRY+0x9c> + // 00000098: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[156] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x44, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x83, + 0x78, 0xf8, 0x00, 0x75, 0x09, 0x81, 0x78, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x14, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x58, 0xfc, 0x89, 0x46, 0x20, + 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x83, 0x46, 0x20, 0xf4, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, + 0x89, 0x0b, 0x75, 0x0d, 0x53, 0x89, 0xc3, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, + 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x19, 0x89, + 0x01, 0x83, 0xc1, 0x04, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x18, (uintptr_t)&PyTuple_Type); + patch_x86_64_32rx(code + 0x2e, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)&PySequence_Tuple + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x98, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_TYPE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TYPE_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 44 24 18 movl 0x18(%esp), %eax + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 83 78 f8 00 cmpl $0x0, -0x8(%eax) + // 14: 75 09 jne 0x1f <__JIT_ENTRY+0x1f> + // 16: 81 78 f4 00 00 00 00 cmpl $0x0, -0xc(%eax) + // 00000019: IMAGE_REL_I386_DIR32 _PyType_Type + // 1d: 74 15 je 0x34 <__JIT_ENTRY+0x34> + // 1f: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 23: 89 44 24 18 movl %eax, 0x18(%esp) + // 27: 89 74 24 14 movl %esi, 0x14(%esp) + // 2b: 5e popl %esi + // 2c: 5f popl %edi + // 2d: 5b popl %ebx + // 2e: 5d popl %ebp + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 00000030: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 34: 8b 48 fc movl -0x4(%eax), %ecx + // 37: 8d 50 f8 leal -0x8(%eax), %edx + // 3a: 8b 59 04 movl 0x4(%ecx), %ebx + // 3d: 8b 2b movl (%ebx), %ebp + // 3f: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 45: 7f 03 jg 0x4a <__JIT_ENTRY+0x4a> + // 47: 45 incl %ebp + // 48: 89 2b movl %ebp, (%ebx) + // 4a: 89 58 f4 movl %ebx, -0xc(%eax) + // 4d: 89 56 20 movl %edx, 0x20(%esi) + // 50: 8b 01 movl (%ecx), %eax + // 52: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 57: 7f 0e jg 0x67 <__JIT_ENTRY+0x67> + // 59: 48 decl %eax + // 5a: 89 01 movl %eax, (%ecx) + // 5c: 75 09 jne 0x67 <__JIT_ENTRY+0x67> + // 5e: 51 pushl %ecx + // 5f: e8 00 00 00 00 calll 0x64 <__JIT_ENTRY+0x64> + // 00000060: IMAGE_REL_I386_REL32 __Py_Dealloc + // 64: 83 c4 04 addl $0x4, %esp + // 67: 8b 46 20 movl 0x20(%esi), %eax + // 6a: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 71: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 75: 89 44 24 18 movl %eax, 0x18(%esp) + // 79: 89 74 24 14 movl %esi, 0x14(%esp) + // 7d: 5e popl %esi + // 7e: 5f popl %edi + // 7f: 5b popl %ebx + // 80: 5d popl %ebp + // 81: e9 00 00 00 00 jmp 0x86 <__JIT_ENTRY+0x86> + // 00000082: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[129] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x44, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x83, 0x78, 0xf8, 0x00, 0x75, 0x09, 0x81, 0x78, + 0xf4, 0x00, 0x00, 0x00, 0x00, 0x74, 0x15, 0x89, + 0x7c, 0x24, 0x1c, 0x89, 0x44, 0x24, 0x18, 0x89, + 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x48, 0xfc, 0x8d, + 0x50, 0xf8, 0x8b, 0x59, 0x04, 0x8b, 0x2b, 0x81, + 0xfd, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x45, + 0x89, 0x2b, 0x89, 0x58, 0xf4, 0x89, 0x56, 0x20, + 0x8b, 0x01, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x48, 0x89, 0x01, 0x75, 0x09, 0x51, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x44, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyType_Type); + patch_x86_64_32rx(code + 0x30, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__CHECK_AND_ALLOCATE_OBJECT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_AND_ALLOCATE_OBJECT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 14 subl $0x14, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // f: 8b 54 24 28 movl 0x28(%esp), %edx + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 c0 movzwl %ax, %eax + // 1b: 89 c6 movl %eax, %esi + // 1d: f7 d6 notl %esi + // 1f: 83 3c b3 00 cmpl $0x0, (%ebx,%esi,4) + // 23: 0f 85 ff 00 00 00 jne 0x128 <__JIT_ENTRY+0x128> + // 29: bd fe ff ff ff movl $0xfffffffe, %ebp # imm = 0xFFFFFFFE + // 2e: 29 c5 subl %eax, %ebp + // 30: 8b 04 ab movl (%ebx,%ebp,4), %eax + // 33: 8b 48 04 movl 0x4(%eax), %ecx + // 36: 83 79 54 00 cmpl $0x0, 0x54(%ecx) + // 3a: 0f 89 e8 00 00 00 jns 0x128 <__JIT_ENTRY+0x128> + // 40: 81 b8 c0 00 00 00 00 00 00 00 cmpl $0x0, 0xc0(%eax) + // 00000046: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 4a: 0f 85 d8 00 00 00 jne 0x128 <__JIT_ENTRY+0x128> + // 50: 8b 8f 94 00 00 00 movl 0x94(%edi), %ecx + // 56: 85 c9 testl %ecx, %ecx + // 58: 0f 84 ca 00 00 00 je 0x128 <__JIT_ENTRY+0x128> + // 5e: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 62: 8b 88 d0 01 00 00 movl 0x1d0(%eax), %ecx + // 68: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 6c: 8b 49 18 movl 0x18(%ecx), %ecx + // 6f: 89 0c 24 movl %ecx, (%esp) + // 72: 89 44 24 0c movl %eax, 0xc(%esp) + // 76: a1 34 00 00 00 movl 0x34, %eax + // 00000077: IMAGE_REL_I386_DIR32 __Py_InitCleanup + // 7b: 89 44 24 04 movl %eax, 0x4(%esp) + // 7f: 8b 0c 24 movl (%esp), %ecx + // 82: 8b 44 24 04 movl 0x4(%esp), %eax + // 86: 03 41 34 addl 0x34(%ecx), %eax + // 89: 89 44 24 04 movl %eax, 0x4(%esp) + // 8d: 8b 44 24 0c movl 0xc(%esp), %eax + // 91: 89 14 24 movl %edx, (%esp) + // 94: 8b 97 98 00 00 00 movl 0x98(%edi), %edx + // 9a: 2b 54 24 10 subl 0x10(%esp), %edx + // 9e: c1 fa 02 sarl $0x2, %edx + // a1: 3b 54 24 04 cmpl 0x4(%esp), %edx + // a5: 8b 14 24 movl (%esp), %edx + // a8: 7e 7e jle 0x128 <__JIT_ENTRY+0x128> + // aa: 89 5a 20 movl %ebx, 0x20(%edx) + // ad: 6a 00 pushl $0x0 + // af: 50 pushl %eax + // b0: e8 00 00 00 00 calll 0xb5 <__JIT_ENTRY+0xb5> + // 000000b1: IMAGE_REL_I386_REL32 _PyType_GenericAlloc + // b5: 8b 54 24 08 movl 0x8(%esp), %edx + // b9: 83 c4 08 addl $0x8, %esp + // bc: 8b 4a 20 movl 0x20(%edx), %ecx + // bf: c7 42 20 00 00 00 00 movl $0x0, 0x20(%edx) + // c6: 85 c0 testl %eax, %eax + // c8: 74 76 je 0x140 <__JIT_ENTRY+0x140> + // ca: 89 04 b3 movl %eax, (%ebx,%esi,4) + // cd: 8b 04 ab movl (%ebx,%ebp,4), %eax + // d0: 8b 74 24 08 movl 0x8(%esp), %esi + // d4: 8b 16 movl (%esi), %edx + // d6: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // dc: 7f 03 jg 0xe1 <__JIT_ENTRY+0xe1> + // de: 42 incl %edx + // df: 89 16 movl %edx, (%esi) + // e1: 89 34 ab movl %esi, (%ebx,%ebp,4) + // e4: 8b 14 24 movl (%esp), %edx + // e7: 89 4a 20 movl %ecx, 0x20(%edx) + // ea: 8b 08 movl (%eax), %ecx + // ec: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // f2: 7f 12 jg 0x106 <__JIT_ENTRY+0x106> + // f4: 49 decl %ecx + // f5: 89 08 movl %ecx, (%eax) + // f7: 75 0d jne 0x106 <__JIT_ENTRY+0x106> + // f9: 50 pushl %eax + // fa: e8 00 00 00 00 calll 0xff <__JIT_ENTRY+0xff> + // 000000fb: IMAGE_REL_I386_REL32 __Py_Dealloc + // ff: 8b 54 24 04 movl 0x4(%esp), %edx + // 103: 83 c4 04 addl $0x4, %esp + // 106: 8b 42 20 movl 0x20(%edx), %eax + // 109: c7 42 20 00 00 00 00 movl $0x0, 0x20(%edx) + // 110: 89 7c 24 30 movl %edi, 0x30(%esp) + // 114: 89 44 24 2c movl %eax, 0x2c(%esp) + // 118: 89 54 24 28 movl %edx, 0x28(%esp) + // 11c: 83 c4 14 addl $0x14, %esp + // 11f: 5e popl %esi + // 120: 5f popl %edi + // 121: 5b popl %ebx + // 122: 5d popl %ebp + // 123: e9 00 00 00 00 jmp 0x128 <__JIT_ENTRY+0x128> + // 00000124: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 128: 89 7c 24 30 movl %edi, 0x30(%esp) + // 12c: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 130: 89 54 24 28 movl %edx, 0x28(%esp) + // 134: 83 c4 14 addl $0x14, %esp + // 137: 5e popl %esi + // 138: 5f popl %edi + // 139: 5b popl %ebx + // 13a: 5d popl %ebp + // 13b: e9 00 00 00 00 jmp 0x140 <__JIT_ENTRY+0x140> + // 0000013c: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 140: 89 7c 24 30 movl %edi, 0x30(%esp) + // 144: 89 4c 24 2c movl %ecx, 0x2c(%esp) + // 148: 89 54 24 28 movl %edx, 0x28(%esp) + // 14c: 83 c4 14 addl $0x14, %esp + // 14f: 5e popl %esi + // 150: 5f popl %edi + // 151: 5b popl %ebx + // 152: 5d popl %ebp + // 153: e9 00 00 00 00 jmp 0x158 <__JIT_ENTRY+0x158> + // 00000154: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[344] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x14, 0x8b, + 0x7c, 0x24, 0x30, 0x8b, 0x5c, 0x24, 0x2c, 0x8b, + 0x54, 0x24, 0x28, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc0, 0x89, 0xc6, 0xf7, 0xd6, 0x83, + 0x3c, 0xb3, 0x00, 0x0f, 0x85, 0xff, 0x00, 0x00, + 0x00, 0xbd, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc5, + 0x8b, 0x04, 0xab, 0x8b, 0x48, 0x04, 0x83, 0x79, + 0x54, 0x00, 0x0f, 0x89, 0xe8, 0x00, 0x00, 0x00, + 0x81, 0xb8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x85, 0xd8, 0x00, 0x00, 0x00, + 0x8b, 0x8f, 0x94, 0x00, 0x00, 0x00, 0x85, 0xc9, + 0x0f, 0x84, 0xca, 0x00, 0x00, 0x00, 0x89, 0x4c, + 0x24, 0x10, 0x8b, 0x88, 0xd0, 0x01, 0x00, 0x00, + 0x89, 0x4c, 0x24, 0x08, 0x8b, 0x49, 0x18, 0x89, + 0x0c, 0x24, 0x89, 0x44, 0x24, 0x0c, 0xa1, 0x34, + 0x00, 0x00, 0x00, 0x89, 0x44, 0x24, 0x04, 0x8b, + 0x0c, 0x24, 0x8b, 0x44, 0x24, 0x04, 0x03, 0x41, + 0x34, 0x89, 0x44, 0x24, 0x04, 0x8b, 0x44, 0x24, + 0x0c, 0x89, 0x14, 0x24, 0x8b, 0x97, 0x98, 0x00, + 0x00, 0x00, 0x2b, 0x54, 0x24, 0x10, 0xc1, 0xfa, + 0x02, 0x3b, 0x54, 0x24, 0x04, 0x8b, 0x14, 0x24, + 0x7e, 0x7e, 0x89, 0x5a, 0x20, 0x6a, 0x00, 0x50, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, + 0x08, 0x83, 0xc4, 0x08, 0x8b, 0x4a, 0x20, 0xc7, + 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x76, 0x89, 0x04, 0xb3, 0x8b, 0x04, 0xab, + 0x8b, 0x74, 0x24, 0x08, 0x8b, 0x16, 0x81, 0xfa, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x42, 0x89, + 0x16, 0x89, 0x34, 0xab, 0x8b, 0x14, 0x24, 0x89, + 0x4a, 0x20, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x08, 0x75, + 0x0d, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0x8b, 0x42, + 0x20, 0xc7, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x30, 0x89, 0x44, 0x24, 0x2c, + 0x89, 0x54, 0x24, 0x28, 0x83, 0xc4, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x30, 0x89, 0x5c, 0x24, 0x2c, + 0x89, 0x54, 0x24, 0x28, 0x83, 0xc4, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x30, 0x89, 0x4c, 0x24, 0x2c, + 0x89, 0x54, 0x24, 0x28, 0x83, 0xc4, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x46, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x77, (uintptr_t)&_Py_InitCleanup + 0x34); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)&PyType_GenericAlloc + -0x4); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x124, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x13c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x154, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_CLASS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: 8b 7e 04 movl 0x4(%esi), %edi + // 14: 83 7f 54 00 cmpl $0x0, 0x54(%edi) + // 18: 79 1f jns 0x39 <__JIT_ENTRY+0x39> + // 1a: 81 be c0 00 00 00 00 00 00 00 cmpl $0x0, 0xc0(%esi) + // 00000020: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 24: 75 13 jne 0x39 <__JIT_ENTRY+0x39> + // 26: 89 54 24 14 movl %edx, 0x14(%esp) + // 2a: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2e: 89 44 24 0c movl %eax, 0xc(%esp) + // 32: 5e popl %esi + // 33: 5f popl %edi + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 00000035: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 39: 89 54 24 14 movl %edx, 0x14(%esp) + // 3d: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 41: 89 44 24 0c movl %eax, 0xc(%esp) + // 45: 5e popl %esi + // 46: 5f popl %edi + // 47: e9 00 00 00 00 jmp 0x4c <__JIT_ENTRY+0x4c> + // 00000048: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[76] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0x8b, 0x7e, 0x04, 0x83, 0x7f, 0x54, 0x00, + 0x79, 0x1f, 0x81, 0xbe, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x13, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x20, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x35, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x48, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_METHOD_LAZY_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: bf 00 00 00 00 movl $0x0, %edi + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 16: 0f b7 ff movzwl %di, %edi + // 19: 83 7c 3e f4 00 cmpl $0x0, -0xc(%esi,%edi) + // 1e: 74 13 je 0x33 <__JIT_ENTRY+0x33> + // 20: 89 54 24 14 movl %edx, 0x14(%esp) + // 24: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 28: 89 44 24 0c movl %eax, 0xc(%esp) + // 2c: 5e popl %esi + // 2d: 5f popl %edi + // 2e: e9 00 00 00 00 jmp 0x33 <__JIT_ENTRY+0x33> + // 0000002f: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 33: 89 54 24 14 movl %edx, 0x14(%esp) + // 37: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3b: 89 44 24 0c movl %eax, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[65] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xff, 0x83, 0x7c, 0x3e, 0xf4, 0x00, 0x74, 0x13, + 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x2f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_ATTR_MODULE_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_MODULE_PUSH_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: 8b 7e 04 movl 0x4(%esi), %edi + // 14: 8b 7f 48 movl 0x48(%edi), %edi + // 17: 3b 3d 48 00 00 00 cmpl 0x48, %edi + // 00000019: IMAGE_REL_I386_DIR32 _PyModule_Type + // 1d: 75 27 jne 0x46 <__JIT_ENTRY+0x46> + // 1f: 8b 76 08 movl 0x8(%esi), %esi + // 22: 8b 76 18 movl 0x18(%esi), %esi + // 25: 81 7e 08 00 00 00 00 cmpl $0x0, 0x8(%esi) + // 00000028: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 2c: 75 18 jne 0x46 <__JIT_ENTRY+0x46> + // 2e: 89 31 movl %esi, (%ecx) + // 30: 83 c1 04 addl $0x4, %ecx + // 33: 89 54 24 14 movl %edx, 0x14(%esp) + // 37: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3b: 89 44 24 0c movl %eax, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 46: 89 54 24 14 movl %edx, 0x14(%esp) + // 4a: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4e: 89 44 24 0c movl %eax, 0xc(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[89] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0x8b, 0x7e, 0x04, 0x8b, 0x7f, 0x48, 0x3b, + 0x3d, 0x48, 0x00, 0x00, 0x00, 0x75, 0x27, 0x8b, + 0x76, 0x08, 0x8b, 0x76, 0x18, 0x81, 0x7e, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x18, 0x89, 0x31, + 0x83, 0xc1, 0x04, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyModule_Type + 0x48); + patch_32(code + 0x28, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x55, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_WITH_HINT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 8b 76 f4 movl -0xc(%esi), %esi + // 13: 85 f6 testl %esi, %esi + // 15: 74 17 je 0x2e <__JIT_ENTRY+0x2e> + // 17: 89 31 movl %esi, (%ecx) + // 19: 83 c1 04 addl $0x4, %ecx + // 1c: 89 54 24 10 movl %edx, 0x10(%esp) + // 20: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 24: 89 44 24 08 movl %eax, 0x8(%esp) + // 28: 5e popl %esi + // 29: e9 00 00 00 00 jmp 0x2e <__JIT_ENTRY+0x2e> + // 0000002a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 2e: 89 54 24 10 movl %edx, 0x10(%esp) + // 32: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 36: 89 44 24 08 movl %eax, 0x8(%esp) + // 3a: 5e popl %esi + // 3b: e9 00 00 00 00 jmp 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[64] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x8b, 0x76, 0xf4, 0x85, 0xf6, 0x74, 0x17, 0x89, + 0x31, 0x83, 0xc1, 0x04, 0x89, 0x54, 0x24, 0x10, + 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, + 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, + 0x24, 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3c, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_CALL_BOUND_METHOD_EXACT_ARGS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: 89 f7 movl %esi, %edi + // 18: f7 d7 notl %edi + // 1a: 83 3c b9 00 cmpl $0x0, (%ecx,%edi,4) + // 1e: 75 13 jne 0x33 <__JIT_ENTRY+0x33> + // 20: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 25: 29 f7 subl %esi, %edi + // 27: 8b 34 b9 movl (%ecx,%edi,4), %esi + // 2a: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 0000002d: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 31: 74 13 je 0x46 <__JIT_ENTRY+0x46> + // 33: 89 54 24 14 movl %edx, 0x14(%esp) + // 37: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3b: 89 44 24 0c movl %eax, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 46: 89 54 24 14 movl %edx, 0x14(%esp) + // 4a: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4e: 89 44 24 0c movl %eax, 0xc(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0x89, 0xf7, + 0xf7, 0xd7, 0x83, 0x3c, 0xb9, 0x00, 0x75, 0x13, + 0xbf, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, + 0x34, 0xb9, 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x2d, (uintptr_t)&PyMethod_Type); + patch_x86_64_32rx(code + 0x42, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_EG_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EG_MATCH.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 4c 24 28 movl 0x28(%esp), %ecx + // b: 8b 7c 24 20 movl 0x20(%esp), %edi + // f: 8b 44 24 24 movl 0x24(%esp), %eax + // 13: 8b 70 f8 movl -0x8(%eax), %esi + // 16: 8b 68 fc movl -0x4(%eax), %ebp + // 19: 89 47 20 movl %eax, 0x20(%edi) + // 1c: 55 pushl %ebp + // 1d: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 21: 51 pushl %ecx + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __PyEval_CheckExceptStarTypeValid + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 8b 5f 20 movl 0x20(%edi), %ebx + // 2d: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 34: 85 c0 testl %eax, %eax + // 36: 0f 88 98 00 00 00 js 0xd4 <__JIT_ENTRY+0xd4> + // 3c: c7 44 24 04 00 00 00 00 movl $0x0, 0x4(%esp) + // 44: c7 44 24 08 00 00 00 00 movl $0x0, 0x8(%esp) + // 4c: 89 5f 20 movl %ebx, 0x20(%edi) + // 4f: 8d 44 24 08 leal 0x8(%esp), %eax + // 53: 8d 4c 24 04 leal 0x4(%esp), %ecx + // 57: 50 pushl %eax + // 58: 51 pushl %ecx + // 59: 55 pushl %ebp + // 5a: 56 pushl %esi + // 5b: 57 pushl %edi + // 5c: e8 00 00 00 00 calll 0x61 <__JIT_ENTRY+0x61> + // 0000005d: IMAGE_REL_I386_REL32 __PyEval_ExceptionGroupMatch + // 61: 83 c4 14 addl $0x14, %esp + // 64: 8b 5f 20 movl 0x20(%edi), %ebx + // 67: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 6e: 8b 0e movl (%esi), %ecx + // 70: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 76: 7f 12 jg 0x8a <__JIT_ENTRY+0x8a> + // 78: 49 decl %ecx + // 79: 89 0e movl %ecx, (%esi) + // 7b: 75 0d jne 0x8a <__JIT_ENTRY+0x8a> + // 7d: 56 pushl %esi + // 7e: 89 c6 movl %eax, %esi + // 80: e8 00 00 00 00 calll 0x85 <__JIT_ENTRY+0x85> + // 00000081: IMAGE_REL_I386_REL32 __Py_Dealloc + // 85: 89 f0 movl %esi, %eax + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 4d 00 movl (%ebp), %ecx + // 8d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 93: 7f 06 jg 0x9b <__JIT_ENTRY+0x9b> + // 95: 49 decl %ecx + // 96: 89 4d 00 movl %ecx, (%ebp) + // 99: 74 6b je 0x106 <__JIT_ENTRY+0x106> + // 9b: 85 c0 testl %eax, %eax + // 9d: 78 78 js 0x117 <__JIT_ENTRY+0x117> + // 9f: 8b 44 24 04 movl 0x4(%esp), %eax + // a3: 85 c0 testl %eax, %eax + // a5: 74 70 je 0x117 <__JIT_ENTRY+0x117> + // a7: 3d 00 00 00 00 cmpl $0x0, %eax + // 000000a8: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // ac: 0f 84 83 00 00 00 je 0x135 <__JIT_ENTRY+0x135> + // b2: 83 c3 f8 addl $-0x8, %ebx + // b5: 89 5f 20 movl %ebx, 0x20(%edi) + // b8: 50 pushl %eax + // b9: e8 00 00 00 00 calll 0xbe <__JIT_ENTRY+0xbe> + // 000000ba: IMAGE_REL_I386_REL32 _PyErr_SetHandledException + // be: 83 c4 04 addl $0x4, %esp + // c1: 8b 5f 20 movl 0x20(%edi), %ebx + // c4: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // cb: 83 c3 08 addl $0x8, %ebx + // ce: 8b 44 24 04 movl 0x4(%esp), %eax + // d2: eb 66 jmp 0x13a <__JIT_ENTRY+0x13a> + // d4: 8b 06 movl (%esi), %eax + // d6: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // db: 7f 0e jg 0xeb <__JIT_ENTRY+0xeb> + // dd: 48 decl %eax + // de: 89 06 movl %eax, (%esi) + // e0: 75 09 jne 0xeb <__JIT_ENTRY+0xeb> + // e2: 56 pushl %esi + // e3: e8 00 00 00 00 calll 0xe8 <__JIT_ENTRY+0xe8> + // 000000e4: IMAGE_REL_I386_REL32 __Py_Dealloc + // e8: 83 c4 04 addl $0x4, %esp + // eb: 8b 45 00 movl (%ebp), %eax + // ee: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // f3: 7f 22 jg 0x117 <__JIT_ENTRY+0x117> + // f5: 48 decl %eax + // f6: 89 45 00 movl %eax, (%ebp) + // f9: 75 1c jne 0x117 <__JIT_ENTRY+0x117> + // fb: 55 pushl %ebp + // fc: e8 00 00 00 00 calll 0x101 <__JIT_ENTRY+0x101> + // 000000fd: IMAGE_REL_I386_REL32 __Py_Dealloc + // 101: 83 c4 04 addl $0x4, %esp + // 104: eb 11 jmp 0x117 <__JIT_ENTRY+0x117> + // 106: 55 pushl %ebp + // 107: 89 c6 movl %eax, %esi + // 109: e8 00 00 00 00 calll 0x10e <__JIT_ENTRY+0x10e> + // 0000010a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 10e: 89 f0 movl %esi, %eax + // 110: 83 c4 04 addl $0x4, %esp + // 113: 85 c0 testl %eax, %eax + // 115: 79 88 jns 0x9f <__JIT_ENTRY+0x9f> + // 117: 83 c3 f8 addl $-0x8, %ebx + // 11a: 8b 04 24 movl (%esp), %eax + // 11d: 89 44 24 28 movl %eax, 0x28(%esp) + // 121: 89 7c 24 20 movl %edi, 0x20(%esp) + // 125: 89 5c 24 24 movl %ebx, 0x24(%esp) + // 129: 83 c4 0c addl $0xc, %esp + // 12c: 5e popl %esi + // 12d: 5f popl %edi + // 12e: 5b popl %ebx + // 12f: 5d popl %ebp + // 130: e9 00 00 00 00 jmp 0x135 <__JIT_ENTRY+0x135> + // 00000131: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 135: b8 00 00 00 00 movl $0x0, %eax + // 00000136: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 13a: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 13e: 89 4b f8 movl %ecx, -0x8(%ebx) + // 141: 89 43 fc movl %eax, -0x4(%ebx) + // 144: 89 7c 24 20 movl %edi, 0x20(%esp) + // 148: 89 5c 24 24 movl %ebx, 0x24(%esp) + // 14c: 8b 04 24 movl (%esp), %eax + // 14f: 89 44 24 28 movl %eax, 0x28(%esp) + // 153: 83 c4 0c addl $0xc, %esp + // 156: 5e popl %esi + // 157: 5f popl %edi + // 158: 5b popl %ebx + // 159: 5d popl %ebp + // 15a: e9 00 00 00 00 jmp 0x15f <__JIT_ENTRY+0x15f> + // 0000015b: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[346] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x4c, 0x24, 0x28, 0x8b, 0x7c, 0x24, 0x20, 0x8b, + 0x44, 0x24, 0x24, 0x8b, 0x70, 0xf8, 0x8b, 0x68, + 0xfc, 0x89, 0x47, 0x20, 0x55, 0x89, 0x4c, 0x24, + 0x04, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x8b, 0x5f, 0x20, 0xc7, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x88, + 0x98, 0x00, 0x00, 0x00, 0xc7, 0x44, 0x24, 0x04, + 0x00, 0x00, 0x00, 0x00, 0xc7, 0x44, 0x24, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x5f, 0x20, 0x8d, + 0x44, 0x24, 0x08, 0x8d, 0x4c, 0x24, 0x04, 0x50, + 0x51, 0x55, 0x56, 0x57, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x14, 0x8b, 0x5f, 0x20, 0xc7, + 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x0e, 0x75, 0x0d, 0x56, 0x89, 0xc6, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, + 0xc4, 0x04, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, 0x4d, + 0x00, 0x74, 0x6b, 0x85, 0xc0, 0x78, 0x78, 0x8b, + 0x44, 0x24, 0x04, 0x85, 0xc0, 0x74, 0x70, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x84, 0x83, 0x00, + 0x00, 0x00, 0x83, 0xc3, 0xf8, 0x89, 0x5f, 0x20, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x5f, 0x20, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc3, 0x08, 0x8b, 0x44, + 0x24, 0x04, 0xeb, 0x66, 0x8b, 0x06, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, 0x06, + 0x75, 0x09, 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x45, 0x00, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x22, 0x48, 0x89, 0x45, + 0x00, 0x75, 0x1c, 0x55, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0xeb, 0x11, 0x55, 0x89, + 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, + 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x79, 0x88, 0x83, + 0xc3, 0xf8, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, + 0x28, 0x89, 0x7c, 0x24, 0x20, 0x89, 0x5c, 0x24, + 0x24, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x4c, 0x24, 0x08, 0x89, 0x4b, + 0xf8, 0x89, 0x43, 0xfc, 0x89, 0x7c, 0x24, 0x20, + 0x89, 0x5c, 0x24, 0x24, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x28, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, + 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_PyEval_CheckExceptStarTypeValid + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)&_PyEval_ExceptionGroupMatch + -0x4); + patch_x86_64_32rx(code + 0x81, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0xa8, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0xba, (uintptr_t)&PyErr_SetHandledException + -0x4); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xfd, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x10a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x131, state->instruction_starts[instruction->error_target] + -0x4); + patch_32(code + 0x136, (uintptr_t)&_Py_NoneStruct); +} + +void +emit__CHECK_EXC_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EXC_MATCH.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 4c 24 20 movl 0x20(%esp), %ecx + // 9: 8b 74 24 18 movl 0x18(%esp), %esi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: 8b 78 f8 movl -0x8(%eax), %edi + // 14: 8b 58 fc movl -0x4(%eax), %ebx + // 17: 89 46 20 movl %eax, 0x20(%esi) + // 1a: 53 pushl %ebx + // 1b: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 1f: 51 pushl %ecx + // 20: e8 00 00 00 00 calll 0x25 <__JIT_ENTRY+0x25> + // 00000021: IMAGE_REL_I386_REL32 __PyEval_CheckExceptTypeValid + // 25: 83 c4 08 addl $0x8, %esp + // 28: 8b 6e 20 movl 0x20(%esi), %ebp + // 2b: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 32: 85 c0 testl %eax, %eax + // 34: 78 60 js 0x96 <__JIT_ENTRY+0x96> + // 36: 89 6e 20 movl %ebp, 0x20(%esi) + // 39: 53 pushl %ebx + // 3a: 57 pushl %edi + // 3b: e8 00 00 00 00 calll 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 _PyErr_GivenExceptionMatches + // 40: 83 c4 08 addl $0x8, %esp + // 43: 8b 6e 20 movl 0x20(%esi), %ebp + // 46: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4d: 8b 0b movl (%ebx), %ecx + // 4f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 55: 7f 12 jg 0x69 <__JIT_ENTRY+0x69> + // 57: 49 decl %ecx + // 58: 89 0b movl %ecx, (%ebx) + // 5a: 75 0d jne 0x69 <__JIT_ENTRY+0x69> + // 5c: 53 pushl %ebx + // 5d: 89 c7 movl %eax, %edi + // 5f: e8 00 00 00 00 calll 0x64 <__JIT_ENTRY+0x64> + // 00000060: IMAGE_REL_I386_REL32 __Py_Dealloc + // 64: 89 f8 movl %edi, %eax + // 66: 83 c4 04 addl $0x4, %esp + // 69: 85 c0 testl %eax, %eax + // 6b: b8 00 00 00 00 movl $0x0, %eax + // 0000006c: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 70: b9 00 00 00 00 movl $0x0, %ecx + // 00000071: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 75: 0f 44 c8 cmovel %eax, %ecx + // 78: 89 4d fc movl %ecx, -0x4(%ebp) + // 7b: 8b 04 24 movl (%esp), %eax + // 7e: 89 44 24 20 movl %eax, 0x20(%esp) + // 82: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 86: 89 74 24 18 movl %esi, 0x18(%esp) + // 8a: 83 c4 04 addl $0x4, %esp + // 8d: 5e popl %esi + // 8e: 5f popl %edi + // 8f: 5b popl %ebx + // 90: 5d popl %ebp + // 91: e9 00 00 00 00 jmp 0x96 <__JIT_ENTRY+0x96> + // 00000092: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 96: 8b 03 movl (%ebx), %eax + // 98: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 9d: 7f 0e jg 0xad <__JIT_ENTRY+0xad> + // 9f: 48 decl %eax + // a0: 89 03 movl %eax, (%ebx) + // a2: 75 09 jne 0xad <__JIT_ENTRY+0xad> + // a4: 53 pushl %ebx + // a5: e8 00 00 00 00 calll 0xaa <__JIT_ENTRY+0xaa> + // 000000a6: IMAGE_REL_I386_REL32 __Py_Dealloc + // aa: 83 c4 04 addl $0x4, %esp + // ad: 83 c5 fc addl $-0x4, %ebp + // b0: 8b 04 24 movl (%esp), %eax + // b3: 89 44 24 20 movl %eax, 0x20(%esp) + // b7: 89 74 24 18 movl %esi, 0x18(%esp) + // bb: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // bf: 83 c4 04 addl $0x4, %esp + // c2: 5e popl %esi + // c3: 5f popl %edi + // c4: 5b popl %ebx + // c5: 5d popl %ebp + // c6: e9 00 00 00 00 jmp 0xcb <__JIT_ENTRY+0xcb> + // 000000c7: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[203] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x4c, 0x24, + 0x20, 0x8b, 0x74, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0x8b, 0x78, 0xf8, 0x8b, 0x58, 0xfc, 0x89, + 0x46, 0x20, 0x53, 0x89, 0x4c, 0x24, 0x04, 0x51, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x8b, 0x6e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x60, 0x89, 0x6e, + 0x20, 0x53, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x49, + 0x89, 0x0b, 0x75, 0x0d, 0x53, 0x89, 0xc7, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf8, 0x83, 0xc4, + 0x04, 0x85, 0xc0, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x44, 0xc8, + 0x89, 0x4d, 0xfc, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x20, 0x89, 0x6c, 0x24, 0x1c, 0x89, 0x74, + 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, + 0x89, 0x03, 0x75, 0x09, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x83, 0xc5, 0xfc, + 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, + 0x74, 0x24, 0x18, 0x89, 0x6c, 0x24, 0x1c, 0x83, + 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)&_PyEval_CheckExceptTypeValid + -0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)&PyErr_GivenExceptionMatches + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x6c, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x71, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x92, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 70 08 movl 0x8(%eax), %esi + // 10: 81 7e 48 00 00 00 00 cmpl $0x0, 0x48(%esi) + // 00000013: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 17: 75 12 jne 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[61] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x70, 0x08, + 0x81, 0x7e, 0x48, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x27, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x39, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_EXACT_ARGS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 54 24 18 movl 0x18(%esp), %edx + // 7: 8b 4c 24 14 movl 0x14(%esp), %ecx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: be 00 00 00 00 movl $0x0, %esi + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 f6 movzwl %si, %esi + // 17: 89 f7 movl %esi, %edi + // 19: f7 d7 notl %edi + // 1b: bb fe ff ff ff movl $0xfffffffe, %ebx # imm = 0xFFFFFFFE + // 20: 29 f3 subl %esi, %ebx + // 22: 8b 1c 99 movl (%ecx,%ebx,4), %ebx + // 25: 8b 5b 18 movl 0x18(%ebx), %ebx + // 28: 83 3c b9 01 cmpl $0x1, (%ecx,%edi,4) + // 2c: 83 de ff sbbl $-0x1, %esi + // 2f: 39 73 1c cmpl %esi, 0x1c(%ebx) + // 32: 75 14 jne 0x48 <__JIT_ENTRY+0x48> + // 34: 89 54 24 18 movl %edx, 0x18(%esp) + // 38: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 3c: 89 44 24 10 movl %eax, 0x10(%esp) + // 40: 5e popl %esi + // 41: 5f popl %edi + // 42: 5b popl %ebx + // 43: e9 00 00 00 00 jmp 0x48 <__JIT_ENTRY+0x48> + // 00000044: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 48: 89 54 24 18 movl %edx, 0x18(%esp) + // 4c: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 50: 89 44 24 10 movl %eax, 0x10(%esp) + // 54: 5e popl %esi + // 55: 5f popl %edi + // 56: 5b popl %ebx + // 57: e9 00 00 00 00 jmp 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[92] = { + 0x53, 0x57, 0x56, 0x8b, 0x54, 0x24, 0x18, 0x8b, + 0x4c, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0x89, + 0xf7, 0xf7, 0xd7, 0xbb, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xf3, 0x8b, 0x1c, 0x99, 0x8b, 0x5b, 0x18, + 0x83, 0x3c, 0xb9, 0x01, 0x83, 0xde, 0xff, 0x39, + 0x73, 0x1c, 0x75, 0x14, 0x89, 0x54, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x54, 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, + 0x89, 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_x86_64_32rx(code + 0x44, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x58, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 1b: 29 f7 subl %esi, %edi + // 1d: 8b 34 b9 movl (%ecx,%edi,4), %esi + // 20: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000023: IMAGE_REL_I386_DIR32 _PyFunction_Type + // 27: 75 1c jne 0x45 <__JIT_ENTRY+0x45> + // 29: 81 7e 48 00 00 00 00 cmpl $0x0, 0x48(%esi) + // 0000002c: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 30: 75 13 jne 0x45 <__JIT_ENTRY+0x45> + // 32: 89 54 24 14 movl %edx, 0x14(%esp) + // 36: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3a: 89 44 24 0c movl %eax, 0xc(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 45: 89 54 24 14 movl %edx, 0x14(%esp) + // 49: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4d: 89 44 24 0c movl %eax, 0xc(%esp) + // 51: 5e popl %esi + // 52: 5f popl %edi + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[88] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xbf, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x34, 0xb9, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x1c, 0x81, 0x7e, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, + 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x23, (uintptr_t)&PyFunction_Type); + patch_32(code + 0x2c, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x54, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_VERSION_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_INLINE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 54 24 0c movl 0xc(%esp), %edx + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 44 24 04 movl 0x4(%esp), %eax + // c: 81 3d 48 00 00 00 00 00 00 00 cmpl $0x0, 0x48 + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_OPERAND1_LO + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 16: 75 11 jne 0x29 <__JIT_ENTRY+0x29> + // 18: 89 54 24 0c movl %edx, 0xc(%esp) + // 1c: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 20: 89 44 24 04 movl %eax, 0x4(%esp) + // 24: e9 00 00 00 00 jmp 0x29 <__JIT_ENTRY+0x29> + // 00000025: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 29: 89 54 24 0c movl %edx, 0xc(%esp) + // 2d: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 31: 89 44 24 04 movl %eax, 0x4(%esp) + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 00000036: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[58] = { + 0x8b, 0x54, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x44, 0x24, 0x04, 0x81, 0x3d, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, + 0x89, 0x54, 0x24, 0x0c, 0x89, 0x4c, 0x24, 0x08, + 0x89, 0x44, 0x24, 0x04, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x0c, 0x89, 0x4c, 0x24, + 0x08, 0x89, 0x44, 0x24, 0x04, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (instruction->operand1 & UINT32_MAX) + 0x48); + patch_32(code + 0x12, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x25, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x36, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_KW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: bf fd ff ff ff movl $0xfffffffd, %edi # imm = 0xFFFFFFFD + // 1b: 29 f7 subl %esi, %edi + // 1d: 8b 34 b9 movl (%ecx,%edi,4), %esi + // 20: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000023: IMAGE_REL_I386_DIR32 _PyFunction_Type + // 27: 75 1c jne 0x45 <__JIT_ENTRY+0x45> + // 29: 81 7e 48 00 00 00 00 cmpl $0x0, 0x48(%esi) + // 0000002c: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 30: 75 13 jne 0x45 <__JIT_ENTRY+0x45> + // 32: 89 54 24 14 movl %edx, 0x14(%esp) + // 36: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3a: 89 44 24 0c movl %eax, 0xc(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 45: 89 54 24 14 movl %edx, 0x14(%esp) + // 49: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4d: 89 44 24 0c movl %eax, 0xc(%esp) + // 51: 5e popl %esi + // 52: 5f popl %edi + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[88] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xbf, 0xfd, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x34, 0xb9, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x1c, 0x81, 0x7e, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, + 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x23, (uintptr_t)&PyFunction_Type); + patch_32(code + 0x2c, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x54, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 1b: 29 f7 subl %esi, %edi + // 1d: 8b 34 b9 movl (%ecx,%edi,4), %esi + // 20: 8b 76 04 movl 0x4(%esi), %esi + // 23: 81 fe 00 00 00 00 cmpl $0x0, %esi + // 00000025: IMAGE_REL_I386_DIR32 _PyFunction_Type + // 29: 74 1b je 0x46 <__JIT_ENTRY+0x46> + // 2b: 81 fe 00 00 00 00 cmpl $0x0, %esi + // 0000002d: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 31: 74 13 je 0x46 <__JIT_ENTRY+0x46> + // 33: 89 54 24 14 movl %edx, 0x14(%esp) + // 37: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3b: 89 44 24 0c movl %eax, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 46: 89 54 24 14 movl %edx, 0x14(%esp) + // 4a: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4e: 89 44 24 0c movl %eax, 0xc(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[89] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xbf, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x34, 0xb9, + 0x8b, 0x76, 0x04, 0x81, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x1b, 0x81, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x25, (uintptr_t)&PyFunction_Type); + patch_32(code + 0x2d, (uintptr_t)&PyMethod_Type); + patch_x86_64_32rx(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x55, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE_KW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: bf fd ff ff ff movl $0xfffffffd, %edi # imm = 0xFFFFFFFD + // 1b: 29 f7 subl %esi, %edi + // 1d: 8b 34 b9 movl (%ecx,%edi,4), %esi + // 20: 8b 76 04 movl 0x4(%esi), %esi + // 23: 81 fe 00 00 00 00 cmpl $0x0, %esi + // 00000025: IMAGE_REL_I386_DIR32 _PyFunction_Type + // 29: 74 1b je 0x46 <__JIT_ENTRY+0x46> + // 2b: 81 fe 00 00 00 00 cmpl $0x0, %esi + // 0000002d: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 31: 74 13 je 0x46 <__JIT_ENTRY+0x46> + // 33: 89 54 24 14 movl %edx, 0x14(%esp) + // 37: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3b: 89 44 24 0c movl %eax, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 46: 89 54 24 14 movl %edx, 0x14(%esp) + // 4a: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4e: 89 44 24 0c movl %eax, 0xc(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[89] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xbf, 0xfd, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x34, 0xb9, + 0x8b, 0x76, 0x04, 0x81, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x1b, 0x81, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x25, (uintptr_t)&PyFunction_Type); + patch_32(code + 0x2d, (uintptr_t)&PyMethod_Type); + patch_x86_64_32rx(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x55, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_MANAGED_OBJECT_HAS_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_MANAGED_OBJECT_HAS_VALUES.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: 8b 7e 04 movl 0x4(%esi), %edi + // 14: 8b 7f 10 movl 0x10(%edi), %edi + // 17: 80 7c 3e 03 00 cmpb $0x0, 0x3(%esi,%edi) + // 1c: 74 13 je 0x31 <__JIT_ENTRY+0x31> + // 1e: 89 54 24 14 movl %edx, 0x14(%esp) + // 22: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 26: 89 44 24 0c movl %eax, 0xc(%esp) + // 2a: 5e popl %esi + // 2b: 5f popl %edi + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 31: 89 54 24 14 movl %edx, 0x14(%esp) + // 35: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 39: 89 44 24 0c movl %eax, 0xc(%esp) + // 3d: 5e popl %esi + // 3e: 5f popl %edi + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 00000040: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[68] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0x8b, 0x7e, 0x04, 0x8b, 0x7f, 0x10, 0x80, + 0x7c, 0x3e, 0x03, 0x00, 0x74, 0x13, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x40, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_METHOD_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 1b: 29 f7 subl %esi, %edi + // 1d: 8b 3c b9 movl (%ecx,%edi,4), %edi + // 20: 81 7f 04 00 00 00 00 cmpl $0x0, 0x4(%edi) + // 00000023: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 27: 75 1d jne 0x46 <__JIT_ENTRY+0x46> + // 29: 8b 7f 08 movl 0x8(%edi), %edi + // 2c: 81 7f 04 00 00 00 00 cmpl $0x0, 0x4(%edi) + // 0000002f: IMAGE_REL_I386_DIR32 _PyFunction_Type + // 33: 75 11 jne 0x46 <__JIT_ENTRY+0x46> + // 35: 81 7f 48 00 00 00 00 cmpl $0x0, 0x48(%edi) + // 00000038: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 3c: 75 08 jne 0x46 <__JIT_ENTRY+0x46> + // 3e: f7 d6 notl %esi + // 40: 83 3c b1 00 cmpl $0x0, (%ecx,%esi,4) + // 44: 74 13 je 0x59 <__JIT_ENTRY+0x59> + // 46: 89 54 24 14 movl %edx, 0x14(%esp) + // 4a: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4e: 89 44 24 0c movl %eax, 0xc(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 59: 89 54 24 14 movl %edx, 0x14(%esp) + // 5d: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 61: 89 44 24 0c movl %eax, 0xc(%esp) + // 65: 5e popl %esi + // 66: 5f popl %edi + // 67: e9 00 00 00 00 jmp 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[103] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xbf, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x3c, 0xb9, + 0x81, 0x7f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x1d, 0x8b, 0x7f, 0x08, 0x81, 0x7f, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x11, 0x81, 0x7f, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x08, 0xf7, 0xd6, + 0x83, 0x3c, 0xb1, 0x00, 0x74, 0x13, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x23, (uintptr_t)&PyMethod_Type); + patch_32(code + 0x2f, (uintptr_t)&PyFunction_Type); + patch_32(code + 0x38, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x55, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_METHOD_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION_KW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: bf fd ff ff ff movl $0xfffffffd, %edi # imm = 0xFFFFFFFD + // 1b: 29 f7 subl %esi, %edi + // 1d: 8b 3c b9 movl (%ecx,%edi,4), %edi + // 20: 81 7f 04 00 00 00 00 cmpl $0x0, 0x4(%edi) + // 00000023: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 27: 75 22 jne 0x4b <__JIT_ENTRY+0x4b> + // 29: 8b 7f 08 movl 0x8(%edi), %edi + // 2c: 81 7f 04 00 00 00 00 cmpl $0x0, 0x4(%edi) + // 0000002f: IMAGE_REL_I386_DIR32 _PyFunction_Type + // 33: 75 16 jne 0x4b <__JIT_ENTRY+0x4b> + // 35: 81 7f 48 00 00 00 00 cmpl $0x0, 0x48(%edi) + // 00000038: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 3c: 75 0d jne 0x4b <__JIT_ENTRY+0x4b> + // 3e: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 43: 29 f7 subl %esi, %edi + // 45: 83 3c b9 00 cmpl $0x0, (%ecx,%edi,4) + // 49: 74 13 je 0x5e <__JIT_ENTRY+0x5e> + // 4b: 89 54 24 14 movl %edx, 0x14(%esp) + // 4f: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 53: 89 44 24 0c movl %eax, 0xc(%esp) + // 57: 5e popl %esi + // 58: 5f popl %edi + // 59: e9 00 00 00 00 jmp 0x5e <__JIT_ENTRY+0x5e> + // 0000005a: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 5e: 89 54 24 14 movl %edx, 0x14(%esp) + // 62: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 66: 89 44 24 0c movl %eax, 0xc(%esp) + // 6a: 5e popl %esi + // 6b: 5f popl %edi + // 6c: e9 00 00 00 00 jmp 0x71 <__JIT_ENTRY+0x71> + // 0000006d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[108] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xbf, 0xfd, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x8b, 0x3c, 0xb9, + 0x81, 0x7f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x22, 0x8b, 0x7f, 0x08, 0x81, 0x7f, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x16, 0x81, 0x7f, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x0d, 0xbf, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xf7, 0x83, 0x3c, 0xb9, + 0x00, 0x74, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x23, (uintptr_t)&PyMethod_Type); + patch_32(code + 0x2f, (uintptr_t)&PyFunction_Type); + patch_32(code + 0x38, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x5a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_PEP_523( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PEP_523.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 72 08 movl 0x8(%edx), %esi + // 10: 83 be d8 10 00 00 00 cmpl $0x0, 0x10d8(%esi) + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x72, 0x08, + 0x83, 0xbe, 0xd8, 0x10, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_PERIODIC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: 8b 47 0c movl 0xc(%edi), %eax + // 11: 84 c0 testb %al, %al + // 13: 74 2d je 0x42 <__JIT_ENTRY+0x42> + // 15: 89 4e 20 movl %ecx, 0x20(%esi) + // 18: 57 pushl %edi + // 19: e8 00 00 00 00 calll 0x1e <__JIT_ENTRY+0x1e> + // 0000001a: IMAGE_REL_I386_REL32 __Py_HandlePending + // 1e: 83 c4 04 addl $0x4, %esp + // 21: 8b 4e 20 movl 0x20(%esi), %ecx + // 24: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 2b: 85 c0 testl %eax, %eax + // 2d: 74 13 je 0x42 <__JIT_ENTRY+0x42> + // 2f: 89 7c 24 14 movl %edi, 0x14(%esp) + // 33: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 37: 89 74 24 0c movl %esi, 0xc(%esp) + // 3b: 5e popl %esi + // 3c: 5f popl %edi + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 0000003e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 42: 89 7c 24 14 movl %edi, 0x14(%esp) + // 46: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4a: 89 74 24 0c movl %esi, 0xc(%esp) + // 4e: 5e popl %esi + // 4f: 5f popl %edi + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0x8b, 0x47, + 0x0c, 0x84, 0xc0, 0x74, 0x2d, 0x89, 0x4e, 0x20, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x13, 0x89, + 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, + 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)&_Py_HandlePending + -0x4); + patch_x86_64_32rx(code + 0x3e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC_IF_NOT_YIELD_FROM.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: b8 00 00 00 00 movl $0x0, %eax + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: a8 02 testb $0x2, %al + // 15: 75 34 jne 0x4b <__JIT_ENTRY+0x4b> + // 17: 8b 47 0c movl 0xc(%edi), %eax + // 1a: 84 c0 testb %al, %al + // 1c: 74 2d je 0x4b <__JIT_ENTRY+0x4b> + // 1e: 89 4e 20 movl %ecx, 0x20(%esi) + // 21: 57 pushl %edi + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __Py_HandlePending + // 27: 83 c4 04 addl $0x4, %esp + // 2a: 8b 4e 20 movl 0x20(%esi), %ecx + // 2d: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 34: 85 c0 testl %eax, %eax + // 36: 74 13 je 0x4b <__JIT_ENTRY+0x4b> + // 38: 89 7c 24 14 movl %edi, 0x14(%esp) + // 3c: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 40: 89 74 24 0c movl %esi, 0xc(%esp) + // 44: 5e popl %esi + // 45: 5f popl %edi + // 46: e9 00 00 00 00 jmp 0x4b <__JIT_ENTRY+0x4b> + // 00000047: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 4b: 89 7c 24 14 movl %edi, 0x14(%esp) + // 4f: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 53: 89 74 24 0c movl %esi, 0xc(%esp) + // 57: 5e popl %esi + // 58: 5f popl %edi + // 59: e9 00 00 00 00 jmp 0x5e <__JIT_ENTRY+0x5e> + // 0000005a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[89] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0xa8, 0x02, 0x75, 0x34, 0x8b, + 0x47, 0x0c, 0x84, 0xc0, 0x74, 0x2d, 0x89, 0x4e, + 0x20, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x13, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_Py_HandlePending + -0x4); + patch_x86_64_32rx(code + 0x47, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_STACK_SPACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 54 24 18 movl 0x18(%esp), %edx + // 7: 8b 4c 24 14 movl 0x14(%esp), %ecx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: 8b b2 94 00 00 00 movl 0x94(%edx), %esi + // 15: 85 f6 testl %esi, %esi + // 17: 74 2b je 0x44 <__JIT_ENTRY+0x44> + // 19: bf 00 00 00 00 movl $0x0, %edi + // 0000001a: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1e: 0f b7 ff movzwl %di, %edi + // 21: bb fe ff ff ff movl $0xfffffffe, %ebx # imm = 0xFFFFFFFE + // 26: 29 fb subl %edi, %ebx + // 28: 8b 3c 99 movl (%ecx,%ebx,4), %edi + // 2b: 8b 7f 18 movl 0x18(%edi), %edi + // 2e: 8b 9a 98 00 00 00 movl 0x98(%edx), %ebx + // 34: 29 f3 subl %esi, %ebx + // 36: c1 fb 02 sarl $0x2, %ebx + // 39: 3b 5f 34 cmpl 0x34(%edi), %ebx + // 3c: 7e 06 jle 0x44 <__JIT_ENTRY+0x44> + // 3e: 83 7a 1c 01 cmpl $0x1, 0x1c(%edx) + // 42: 7f 14 jg 0x58 <__JIT_ENTRY+0x58> + // 44: 89 54 24 18 movl %edx, 0x18(%esp) + // 48: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 4c: 89 44 24 10 movl %eax, 0x10(%esp) + // 50: 5e popl %esi + // 51: 5f popl %edi + // 52: 5b popl %ebx + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 58: 89 54 24 18 movl %edx, 0x18(%esp) + // 5c: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 60: 89 44 24 10 movl %eax, 0x10(%esp) + // 64: 5e popl %esi + // 65: 5f popl %edi + // 66: 5b popl %ebx + // 67: e9 00 00 00 00 jmp 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[103] = { + 0x53, 0x57, 0x56, 0x8b, 0x54, 0x24, 0x18, 0x8b, + 0x4c, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0x8b, + 0xb2, 0x94, 0x00, 0x00, 0x00, 0x85, 0xf6, 0x74, + 0x2b, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xff, 0xbb, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xfb, + 0x8b, 0x3c, 0x99, 0x8b, 0x7f, 0x18, 0x8b, 0x9a, + 0x98, 0x00, 0x00, 0x00, 0x29, 0xf3, 0xc1, 0xfb, + 0x02, 0x3b, 0x5f, 0x34, 0x7e, 0x06, 0x83, 0x7a, + 0x1c, 0x01, 0x7f, 0x14, 0x89, 0x54, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x54, 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, + 0x89, 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1a, instruction->oparg); + patch_x86_64_32rx(code + 0x54, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_STACK_SPACE_OPERAND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE_OPERAND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b b2 94 00 00 00 movl 0x94(%edx), %esi + // 14: 85 f6 testl %esi, %esi + // 16: 74 19 je 0x31 <__JIT_ENTRY+0x31> + // 18: 8b ba 98 00 00 00 movl 0x98(%edx), %edi + // 1e: 29 f7 subl %esi, %edi + // 20: c1 ff 02 sarl $0x2, %edi + // 23: 81 ff 00 00 00 00 cmpl $0x0, %edi + // 00000025: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 29: 7e 06 jle 0x31 <__JIT_ENTRY+0x31> + // 2b: 83 7a 1c 01 cmpl $0x1, 0x1c(%edx) + // 2f: 7f 13 jg 0x44 <__JIT_ENTRY+0x44> + // 31: 89 54 24 14 movl %edx, 0x14(%esp) + // 35: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 39: 89 44 24 0c movl %eax, 0xc(%esp) + // 3d: 5e popl %esi + // 3e: 5f popl %edi + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 00000040: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 44: 89 54 24 14 movl %edx, 0x14(%esp) + // 48: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4c: 89 44 24 0c movl %eax, 0xc(%esp) + // 50: 5e popl %esi + // 51: 5f popl %edi + // 52: e9 00 00 00 00 jmp 0x57 <__JIT_ENTRY+0x57> + // 00000053: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[82] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0xb2, + 0x94, 0x00, 0x00, 0x00, 0x85, 0xf6, 0x74, 0x19, + 0x8b, 0xba, 0x98, 0x00, 0x00, 0x00, 0x29, 0xf7, + 0xc1, 0xff, 0x02, 0x81, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x06, 0x83, 0x7a, 0x1c, 0x01, 0x7f, + 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x14, + 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, + 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x25, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x40, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_VALIDITY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 54 24 0c movl 0xc(%esp), %edx + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 44 24 04 movl 0x4(%esp), %eax + // c: f6 05 12 00 00 00 01 testb $0x1, 0x12 + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 89 54 24 0c movl %edx, 0xc(%esp) + // 19: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 1d: 89 44 24 04 movl %eax, 0x4(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 26: 89 54 24 0c movl %edx, 0xc(%esp) + // 2a: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 2e: 89 44 24 04 movl %eax, 0x4(%esp) + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[50] = { + 0x8b, 0x54, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x44, 0x24, 0x04, 0xf6, 0x05, 0x12, 0x00, + 0x00, 0x00, 0x01, 0x75, 0x11, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x0c, 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, + 0x24, 0x04, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (uintptr_t)executor + 0x12); + patch_x86_64_32rx(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_VALIDITY_AND_SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY_AND_SET_IP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 54 24 0c movl 0xc(%esp), %edx + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 44 24 04 movl 0x4(%esp), %eax + // c: f6 05 12 00 00 00 01 testb $0x1, 0x12 + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 89 54 24 0c movl %edx, 0xc(%esp) + // 19: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 1d: 89 44 24 04 movl %eax, 0x4(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 26: c7 40 1c 00 00 00 00 movl $0x0, 0x1c(%eax) + // 00000029: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 2d: 89 54 24 0c movl %edx, 0xc(%esp) + // 31: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 35: 89 44 24 04 movl %eax, 0x4(%esp) + // 39: e9 00 00 00 00 jmp 0x3e <__JIT_ENTRY+0x3e> + // 0000003a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[57] = { + 0x8b, 0x54, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x44, 0x24, 0x04, 0xf6, 0x05, 0x12, 0x00, + 0x00, 0x00, 0x01, 0x75, 0x11, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x40, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x04, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (uintptr_t)executor + 0x12); + patch_x86_64_32rx(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x29, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__COMPARE_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 12: 8b 44 24 20 movl 0x20(%esp), %eax + // 16: b9 00 00 00 00 movl $0x0, %ecx + // 00000017: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1b: 0f b7 c9 movzwl %cx, %ecx + // 1e: 8b 70 f8 movl -0x8(%eax), %esi + // 21: 8b 58 fc movl -0x4(%eax), %ebx + // 24: 89 47 20 movl %eax, 0x20(%edi) + // 27: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 2b: 89 c8 movl %ecx, %eax + // 2d: c1 e8 05 shrl $0x5, %eax + // 30: 50 pushl %eax + // 31: 53 pushl %ebx + // 32: 56 pushl %esi + // 33: e8 00 00 00 00 calll 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 _PyObject_RichCompare + // 38: 83 c4 0c addl $0xc, %esp + // 3b: 8b 6f 20 movl 0x20(%edi), %ebp + // 3e: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 45: 8b 0e movl (%esi), %ecx + // 47: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4d: 7f 05 jg 0x54 <__JIT_ENTRY+0x54> + // 4f: 49 decl %ecx + // 50: 89 0e movl %ecx, (%esi) + // 52: 74 1e je 0x72 <__JIT_ENTRY+0x72> + // 54: 8b 0b movl (%ebx), %ecx + // 56: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 5c: 7f 2b jg 0x89 <__JIT_ENTRY+0x89> + // 5e: 49 decl %ecx + // 5f: 89 0b movl %ecx, (%ebx) + // 61: 75 26 jne 0x89 <__JIT_ENTRY+0x89> + // 63: 53 pushl %ebx + // 64: 89 c6 movl %eax, %esi + // 66: e8 00 00 00 00 calll 0x6b <__JIT_ENTRY+0x6b> + // 00000067: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6b: 89 f0 movl %esi, %eax + // 6d: 83 c4 04 addl $0x4, %esp + // 70: eb 17 jmp 0x89 <__JIT_ENTRY+0x89> + // 72: 56 pushl %esi + // 73: 89 c6 movl %eax, %esi + // 75: e8 00 00 00 00 calll 0x7a <__JIT_ENTRY+0x7a> + // 00000076: IMAGE_REL_I386_REL32 __Py_Dealloc + // 7a: 89 f0 movl %esi, %eax + // 7c: 83 c4 04 addl $0x4, %esp + // 7f: 8b 0b movl (%ebx), %ecx + // 81: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 87: 7e d5 jle 0x5e <__JIT_ENTRY+0x5e> + // 89: 85 c0 testl %eax, %eax + // 8b: 74 0c je 0x99 <__JIT_ENTRY+0x99> + // 8d: f6 44 24 04 10 testb $0x10, 0x4(%esp) + // 92: 75 1c jne 0xb0 <__JIT_ENTRY+0xb0> + // 94: 83 c5 f8 addl $-0x8, %ebp + // 97: eb 54 jmp 0xed <__JIT_ENTRY+0xed> + // 99: 83 c5 f8 addl $-0x8, %ebp + // 9c: 8b 04 24 movl (%esp), %eax + // 9f: 89 44 24 24 movl %eax, 0x24(%esp) + // a3: 89 7c 24 1c movl %edi, 0x1c(%esp) + // a7: 89 6c 24 20 movl %ebp, 0x20(%esp) + // ab: e9 88 00 00 00 jmp 0x138 <__JIT_ENTRY+0x138> + // b0: 83 c5 f8 addl $-0x8, %ebp + // b3: 89 6f 20 movl %ebp, 0x20(%edi) + // b6: 50 pushl %eax + // b7: 89 c6 movl %eax, %esi + // b9: e8 00 00 00 00 calll 0xbe <__JIT_ENTRY+0xbe> + // 000000ba: IMAGE_REL_I386_REL32 _PyObject_IsTrue + // be: 83 c4 04 addl $0x4, %esp + // c1: 8b 0e movl (%esi), %ecx + // c3: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // c9: 7f 07 jg 0xd2 <__JIT_ENTRY+0xd2> + // cb: 89 f2 movl %esi, %edx + // cd: 49 decl %ecx + // ce: 89 0e movl %ecx, (%esi) + // d0: 74 3c je 0x10e <__JIT_ENTRY+0x10e> + // d2: 8b 6f 20 movl 0x20(%edi), %ebp + // d5: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // dc: 85 c0 testl %eax, %eax + // de: 78 49 js 0x129 <__JIT_ENTRY+0x129> + // e0: b9 00 00 00 00 movl $0x0, %ecx + // 000000e1: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // e5: b8 00 00 00 00 movl $0x0, %eax + // 000000e6: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // ea: 0f 44 c1 cmovel %ecx, %eax + // ed: 89 45 00 movl %eax, (%ebp) + // f0: 83 c5 04 addl $0x4, %ebp + // f3: 8b 04 24 movl (%esp), %eax + // f6: 89 44 24 24 movl %eax, 0x24(%esp) + // fa: 89 6c 24 20 movl %ebp, 0x20(%esp) + // fe: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 102: 83 c4 08 addl $0x8, %esp + // 105: 5e popl %esi + // 106: 5f popl %edi + // 107: 5b popl %ebx + // 108: 5d popl %ebp + // 109: e9 00 00 00 00 jmp 0x10e <__JIT_ENTRY+0x10e> + // 0000010a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 10e: 52 pushl %edx + // 10f: 89 c6 movl %eax, %esi + // 111: e8 00 00 00 00 calll 0x116 <__JIT_ENTRY+0x116> + // 00000112: IMAGE_REL_I386_REL32 __Py_Dealloc + // 116: 89 f0 movl %esi, %eax + // 118: 83 c4 04 addl $0x4, %esp + // 11b: 8b 6f 20 movl 0x20(%edi), %ebp + // 11e: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 125: 85 c0 testl %eax, %eax + // 127: 79 b7 jns 0xe0 <__JIT_ENTRY+0xe0> + // 129: 8b 04 24 movl (%esp), %eax + // 12c: 89 44 24 24 movl %eax, 0x24(%esp) + // 130: 89 6c 24 20 movl %ebp, 0x20(%esp) + // 134: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 138: 83 c4 08 addl $0x8, %esp + // 13b: 5e popl %esi + // 13c: 5f popl %edi + // 13d: 5b popl %ebx + // 13e: 5d popl %ebp + // 13f: e9 00 00 00 00 jmp 0x144 <__JIT_ENTRY+0x144> + // 00000140: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[324] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x7c, + 0x24, 0x1c, 0x8b, 0x44, 0x24, 0x20, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, 0x70, + 0xf8, 0x8b, 0x58, 0xfc, 0x89, 0x47, 0x20, 0x89, + 0x4c, 0x24, 0x04, 0x89, 0xc8, 0xc1, 0xe8, 0x05, + 0x50, 0x53, 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x0c, 0x8b, 0x6f, 0x20, 0xc7, 0x47, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, + 0x89, 0x0e, 0x74, 0x1e, 0x8b, 0x0b, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x2b, 0x49, 0x89, + 0x0b, 0x75, 0x26, 0x53, 0x89, 0xc6, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, + 0xeb, 0x17, 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x8b, + 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, + 0xd5, 0x85, 0xc0, 0x74, 0x0c, 0xf6, 0x44, 0x24, + 0x04, 0x10, 0x75, 0x1c, 0x83, 0xc5, 0xf8, 0xeb, + 0x54, 0x83, 0xc5, 0xf8, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x24, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x6c, 0x24, 0x20, 0xe9, 0x88, 0x00, 0x00, 0x00, + 0x83, 0xc5, 0xf8, 0x89, 0x6f, 0x20, 0x50, 0x89, + 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x07, 0x89, 0xf2, 0x49, 0x89, 0x0e, + 0x74, 0x3c, 0x8b, 0x6f, 0x20, 0xc7, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x49, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x44, 0xc1, 0x89, 0x45, 0x00, + 0x83, 0xc5, 0x04, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x24, 0x89, 0x6c, 0x24, 0x20, 0x89, 0x7c, + 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x52, 0x89, + 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, + 0x83, 0xc4, 0x04, 0x8b, 0x6f, 0x20, 0xc7, 0x47, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x79, + 0xb7, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, + 0x89, 0x6c, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x1c, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, instruction->oparg); + patch_x86_64_32rx(code + 0x34, (uintptr_t)&PyObject_RichCompare + -0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xba, (uintptr_t)&PyObject_IsTrue + -0x4); + patch_32(code + 0xe1, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0xe6, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x10a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x112, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x140, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__COMPARE_OP_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 14 subl $0x14, %esp + // 7: 8b 7c 24 30 movl 0x30(%esp), %edi + // b: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // f: 8b 54 24 28 movl 0x28(%esp), %edx + // 13: 8b 73 f8 movl -0x8(%ebx), %esi + // 16: 8b 6b fc movl -0x4(%ebx), %ebp + // 19: f2 0f 10 46 08 movsd 0x8(%esi), %xmm0 + // 1e: f2 0f 10 4d 08 movsd 0x8(%ebp), %xmm1 + // 23: 8b 06 movl (%esi), %eax + // 25: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 2a: 7f 05 jg 0x31 <__JIT_ENTRY+0x31> + // 2c: 48 decl %eax + // 2d: 89 06 movl %eax, (%esi) + // 2f: 74 5b je 0x8c <__JIT_ENTRY+0x8c> + // 31: 8d 73 fc leal -0x4(%ebx), %esi + // 34: 8b 45 00 movl (%ebp), %eax + // 37: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 3c: 0f 8f 99 00 00 00 jg 0xdb <__JIT_ENTRY+0xdb> + // 42: 48 decl %eax + // 43: 89 45 00 movl %eax, (%ebp) + // 46: 0f 85 8f 00 00 00 jne 0xdb <__JIT_ENTRY+0xdb> + // 4c: f2 0f 11 4c 24 04 movsd %xmm1, 0x4(%esp) + // 52: f2 0f 11 44 24 0c movsd %xmm0, 0xc(%esp) + // 58: 89 14 24 movl %edx, (%esp) + // 5b: a1 50 14 00 00 movl 0x1450, %eax + // 0000005c: IMAGE_REL_I386_DIR32 __PyRuntime + // 60: 85 c0 testl %eax, %eax + // 62: 74 0e je 0x72 <__JIT_ENTRY+0x72> + // 64: ff 35 54 14 00 00 pushl 0x1454 + // 00000066: IMAGE_REL_I386_DIR32 __PyRuntime + // 6a: 6a 01 pushl $0x1 + // 6c: 55 pushl %ebp + // 6d: ff d0 calll *%eax + // 6f: 83 c4 0c addl $0xc, %esp + // 72: 55 pushl %ebp + // 73: e8 00 00 00 00 calll 0x78 <__JIT_ENTRY+0x78> + // 00000074: IMAGE_REL_I386_REL32 __PyFloat_ExactDealloc + // 78: 83 c4 04 addl $0x4, %esp + // 7b: 8b 14 24 movl (%esp), %edx + // 7e: f2 0f 10 44 24 0c movsd 0xc(%esp), %xmm0 + // 84: f2 0f 10 4c 24 04 movsd 0x4(%esp), %xmm1 + // 8a: eb 4f jmp 0xdb <__JIT_ENTRY+0xdb> + // 8c: f2 0f 11 4c 24 04 movsd %xmm1, 0x4(%esp) + // 92: f2 0f 11 44 24 0c movsd %xmm0, 0xc(%esp) + // 98: 89 14 24 movl %edx, (%esp) + // 9b: a1 50 14 00 00 movl 0x1450, %eax + // 0000009c: IMAGE_REL_I386_DIR32 __PyRuntime + // a0: 85 c0 testl %eax, %eax + // a2: 74 0e je 0xb2 <__JIT_ENTRY+0xb2> + // a4: ff 35 54 14 00 00 pushl 0x1454 + // 000000a6: IMAGE_REL_I386_DIR32 __PyRuntime + // aa: 6a 01 pushl $0x1 + // ac: 56 pushl %esi + // ad: ff d0 calll *%eax + // af: 83 c4 0c addl $0xc, %esp + // b2: 56 pushl %esi + // b3: e8 00 00 00 00 calll 0xb8 <__JIT_ENTRY+0xb8> + // 000000b4: IMAGE_REL_I386_REL32 __PyFloat_ExactDealloc + // b8: 83 c4 04 addl $0x4, %esp + // bb: 8b 14 24 movl (%esp), %edx + // be: f2 0f 10 44 24 0c movsd 0xc(%esp), %xmm0 + // c4: f2 0f 10 4c 24 04 movsd 0x4(%esp), %xmm1 + // ca: 8d 73 fc leal -0x4(%ebx), %esi + // cd: 8b 45 00 movl (%ebp), %eax + // d0: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // d5: 0f 8e 67 ff ff ff jle 0x42 <__JIT_ENTRY+0x42> + // db: 31 c0 xorl %eax, %eax + // dd: 66 0f 2e c1 ucomisd %xmm1, %xmm0 + // e1: 0f 93 c0 setae %al + // e4: 01 c0 addl %eax, %eax + // e6: 31 c9 xorl %ecx, %ecx + // e8: 66 0f 2e c8 ucomisd %xmm0, %xmm1 + // ec: 0f 93 c1 setae %cl + // ef: 09 c1 orl %eax, %ecx + // f1: b8 00 00 00 00 movl $0x0, %eax + // 000000f2: IMAGE_REL_I386_DIR32 __JIT_OPARG + // f6: 0f a3 c8 btl %ecx, %eax + // f9: b8 00 00 00 00 movl $0x0, %eax + // 000000fa: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // fe: b9 00 00 00 00 movl $0x0, %ecx + // 000000ff: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 103: 0f 43 c8 cmovael %eax, %ecx + // 106: 89 4b f8 movl %ecx, -0x8(%ebx) + // 109: 89 7c 24 30 movl %edi, 0x30(%esp) + // 10d: 89 74 24 2c movl %esi, 0x2c(%esp) + // 111: 89 54 24 28 movl %edx, 0x28(%esp) + // 115: 83 c4 14 addl $0x14, %esp + // 118: 5e popl %esi + // 119: 5f popl %edi + // 11a: 5b popl %ebx + // 11b: 5d popl %ebp + // 11c: e9 00 00 00 00 jmp 0x121 <__JIT_ENTRY+0x121> + // 0000011d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[284] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x14, 0x8b, + 0x7c, 0x24, 0x30, 0x8b, 0x5c, 0x24, 0x2c, 0x8b, + 0x54, 0x24, 0x28, 0x8b, 0x73, 0xf8, 0x8b, 0x6b, + 0xfc, 0xf2, 0x0f, 0x10, 0x46, 0x08, 0xf2, 0x0f, + 0x10, 0x4d, 0x08, 0x8b, 0x06, 0x3d, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, 0x06, 0x74, + 0x5b, 0x8d, 0x73, 0xfc, 0x8b, 0x45, 0x00, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x0f, 0x8f, 0x99, 0x00, + 0x00, 0x00, 0x48, 0x89, 0x45, 0x00, 0x0f, 0x85, + 0x8f, 0x00, 0x00, 0x00, 0xf2, 0x0f, 0x11, 0x4c, + 0x24, 0x04, 0xf2, 0x0f, 0x11, 0x44, 0x24, 0x0c, + 0x89, 0x14, 0x24, 0xa1, 0x50, 0x14, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, + 0x00, 0x00, 0x6a, 0x01, 0x55, 0xff, 0xd0, 0x83, + 0xc4, 0x0c, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x14, 0x24, 0xf2, 0x0f, + 0x10, 0x44, 0x24, 0x0c, 0xf2, 0x0f, 0x10, 0x4c, + 0x24, 0x04, 0xeb, 0x4f, 0xf2, 0x0f, 0x11, 0x4c, + 0x24, 0x04, 0xf2, 0x0f, 0x11, 0x44, 0x24, 0x0c, + 0x89, 0x14, 0x24, 0xa1, 0x50, 0x14, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, + 0x00, 0x00, 0x6a, 0x01, 0x56, 0xff, 0xd0, 0x83, + 0xc4, 0x0c, 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x14, 0x24, 0xf2, 0x0f, + 0x10, 0x44, 0x24, 0x0c, 0xf2, 0x0f, 0x10, 0x4c, + 0x24, 0x04, 0x8d, 0x73, 0xfc, 0x8b, 0x45, 0x00, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x0f, 0x8e, 0x67, + 0xff, 0xff, 0xff, 0x31, 0xc0, 0x66, 0x0f, 0x2e, + 0xc1, 0x0f, 0x93, 0xc0, 0x01, 0xc0, 0x31, 0xc9, + 0x66, 0x0f, 0x2e, 0xc8, 0x0f, 0x93, 0xc1, 0x09, + 0xc1, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xa3, + 0xc8, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x43, 0xc8, 0x89, 0x4b, + 0xf8, 0x89, 0x7c, 0x24, 0x30, 0x89, 0x74, 0x24, + 0x2c, 0x89, 0x54, 0x24, 0x28, 0x83, 0xc4, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x5c, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x66, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x74, (uintptr_t)&_PyFloat_ExactDealloc + -0x4); + patch_32(code + 0x9c, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0xa6, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)&_PyFloat_ExactDealloc + -0x4); + patch_32(code + 0xf2, instruction->oparg); + patch_32(code + 0xfa, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0xff, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__COMPARE_OP_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 18 subl $0x18, %esp + // 7: 8b 44 24 34 movl 0x34(%esp), %eax + // b: 8b 7c 24 30 movl 0x30(%esp), %edi + // f: 8b 54 24 2c movl 0x2c(%esp), %edx + // 13: 8b 6f f8 movl -0x8(%edi), %ebp + // 16: 8b 75 08 movl 0x8(%ebp), %esi + // 19: 83 fe 10 cmpl $0x10, %esi + // 1c: 73 0b jae 0x29 <__JIT_ENTRY+0x29> + // 1e: 8b 5f fc movl -0x4(%edi), %ebx + // 21: 8b 4b 08 movl 0x8(%ebx), %ecx + // 24: 83 f9 10 cmpl $0x10, %ecx + // 27: 72 18 jb 0x41 <__JIT_ENTRY+0x41> + // 29: 89 44 24 34 movl %eax, 0x34(%esp) + // 2d: 89 7c 24 30 movl %edi, 0x30(%esp) + // 31: 89 54 24 2c movl %edx, 0x2c(%esp) + // 35: 83 c4 18 addl $0x18, %esp + // 38: 5e popl %esi + // 39: 5f popl %edi + // 3a: 5b popl %ebx + // 3b: 5d popl %ebp + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 0000003d: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 41: 89 44 24 10 movl %eax, 0x10(%esp) + // 45: 8b 45 00 movl (%ebp), %eax + // 48: 89 54 24 14 movl %edx, 0x14(%esp) + // 4c: 89 da movl %ebx, %edx + // 4e: 8b 5d 0c movl 0xc(%ebp), %ebx + // 51: 89 5c 24 0c movl %ebx, 0xc(%esp) + // 55: 89 54 24 08 movl %edx, 0x8(%esp) + // 59: 8b 5a 0c movl 0xc(%edx), %ebx + // 5c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 61: 7f 2c jg 0x8f <__JIT_ENTRY+0x8f> + // 63: 48 decl %eax + // 64: 89 45 00 movl %eax, (%ebp) + // 67: 75 26 jne 0x8f <__JIT_ENTRY+0x8f> + // 69: 89 0c 24 movl %ecx, (%esp) + // 6c: a1 50 14 00 00 movl 0x1450, %eax + // 0000006d: IMAGE_REL_I386_DIR32 __PyRuntime + // 71: 85 c0 testl %eax, %eax + // 73: 74 0e je 0x83 <__JIT_ENTRY+0x83> + // 75: ff 35 54 14 00 00 pushl 0x1454 + // 00000077: IMAGE_REL_I386_DIR32 __PyRuntime + // 7b: 6a 01 pushl $0x1 + // 7d: 55 pushl %ebp + // 7e: ff d0 calll *%eax + // 80: 83 c4 0c addl $0xc, %esp + // 83: 55 pushl %ebp + // 84: e8 00 00 00 00 calll 0x89 <__JIT_ENTRY+0x89> + // 00000085: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 89: 83 c4 04 addl $0x4, %esp + // 8c: 8b 0c 24 movl (%esp), %ecx + // 8f: 8d 57 fc leal -0x4(%edi), %edx + // 92: 8b 6c 24 08 movl 0x8(%esp), %ebp + // 96: 8b 45 00 movl (%ebp), %eax + // 99: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 9e: 7f 34 jg 0xd4 <__JIT_ENTRY+0xd4> + // a0: 48 decl %eax + // a1: 89 45 00 movl %eax, (%ebp) + // a4: 75 2e jne 0xd4 <__JIT_ENTRY+0xd4> + // a6: 89 54 24 04 movl %edx, 0x4(%esp) + // aa: 89 0c 24 movl %ecx, (%esp) + // ad: a1 50 14 00 00 movl 0x1450, %eax + // 000000ae: IMAGE_REL_I386_DIR32 __PyRuntime + // b2: 85 c0 testl %eax, %eax + // b4: 74 0e je 0xc4 <__JIT_ENTRY+0xc4> + // b6: ff 35 54 14 00 00 pushl 0x1454 + // 000000b8: IMAGE_REL_I386_DIR32 __PyRuntime + // bc: 6a 01 pushl $0x1 + // be: 55 pushl %ebp + // bf: ff d0 calll *%eax + // c1: 83 c4 0c addl $0xc, %esp + // c4: 55 pushl %ebp + // c5: e8 00 00 00 00 calll 0xca <__JIT_ENTRY+0xca> + // 000000c6: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // ca: 83 c4 04 addl $0x4, %esp + // cd: 8b 0c 24 movl (%esp), %ecx + // d0: 8b 54 24 04 movl 0x4(%esp), %edx + // d4: 83 e6 03 andl $0x3, %esi + // d7: b8 01 00 00 00 movl $0x1, %eax + // dc: 29 f0 subl %esi, %eax + // de: 8b 74 24 0c movl 0xc(%esp), %esi + // e2: 0f af f0 imull %eax, %esi + // e5: 83 e1 03 andl $0x3, %ecx + // e8: b8 01 00 00 00 movl $0x1, %eax + // ed: 29 c8 subl %ecx, %eax + // ef: 0f af d8 imull %eax, %ebx + // f2: 31 c9 xorl %ecx, %ecx + // f4: 31 c0 xorl %eax, %eax + // f6: 39 de cmpl %ebx, %esi + // f8: 0f 9d c1 setge %cl + // fb: 0f 9e c0 setle %al + // fe: 01 c9 addl %ecx, %ecx + // 100: 09 c8 orl %ecx, %eax + // 102: b9 00 00 00 00 movl $0x0, %ecx + // 00000103: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 107: 0f a3 c1 btl %eax, %ecx + // 10a: b8 00 00 00 00 movl $0x0, %eax + // 0000010b: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 10f: b9 00 00 00 00 movl $0x0, %ecx + // 00000110: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 114: 0f 43 c8 cmovael %eax, %ecx + // 117: 89 4f f8 movl %ecx, -0x8(%edi) + // 11a: 8b 44 24 10 movl 0x10(%esp), %eax + // 11e: 89 44 24 34 movl %eax, 0x34(%esp) + // 122: 89 54 24 30 movl %edx, 0x30(%esp) + // 126: 8b 44 24 14 movl 0x14(%esp), %eax + // 12a: 89 44 24 2c movl %eax, 0x2c(%esp) + // 12e: 83 c4 18 addl $0x18, %esp + // 131: 5e popl %esi + // 132: 5f popl %edi + // 133: 5b popl %ebx + // 134: 5d popl %ebp + // 135: e9 00 00 00 00 jmp 0x13a <__JIT_ENTRY+0x13a> + // 00000136: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[309] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x18, 0x8b, + 0x44, 0x24, 0x34, 0x8b, 0x7c, 0x24, 0x30, 0x8b, + 0x54, 0x24, 0x2c, 0x8b, 0x6f, 0xf8, 0x8b, 0x75, + 0x08, 0x83, 0xfe, 0x10, 0x73, 0x0b, 0x8b, 0x5f, + 0xfc, 0x8b, 0x4b, 0x08, 0x83, 0xf9, 0x10, 0x72, + 0x18, 0x89, 0x44, 0x24, 0x34, 0x89, 0x7c, 0x24, + 0x30, 0x89, 0x54, 0x24, 0x2c, 0x83, 0xc4, 0x18, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x44, 0x24, 0x10, 0x8b, 0x45, 0x00, + 0x89, 0x54, 0x24, 0x14, 0x89, 0xda, 0x8b, 0x5d, + 0x0c, 0x89, 0x5c, 0x24, 0x0c, 0x89, 0x54, 0x24, + 0x08, 0x8b, 0x5a, 0x0c, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x2c, 0x48, 0x89, 0x45, 0x00, 0x75, + 0x26, 0x89, 0x0c, 0x24, 0xa1, 0x50, 0x14, 0x00, + 0x00, 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, + 0x14, 0x00, 0x00, 0x6a, 0x01, 0x55, 0xff, 0xd0, + 0x83, 0xc4, 0x0c, 0x55, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x0c, 0x24, 0x8d, + 0x57, 0xfc, 0x8b, 0x6c, 0x24, 0x08, 0x8b, 0x45, + 0x00, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x34, + 0x48, 0x89, 0x45, 0x00, 0x75, 0x2e, 0x89, 0x54, + 0x24, 0x04, 0x89, 0x0c, 0x24, 0xa1, 0x50, 0x14, + 0x00, 0x00, 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, + 0x54, 0x14, 0x00, 0x00, 0x6a, 0x01, 0x55, 0xff, + 0xd0, 0x83, 0xc4, 0x0c, 0x55, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x0c, 0x24, + 0x8b, 0x54, 0x24, 0x04, 0x83, 0xe6, 0x03, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x29, 0xf0, 0x8b, 0x74, + 0x24, 0x0c, 0x0f, 0xaf, 0xf0, 0x83, 0xe1, 0x03, + 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xc8, 0x0f, + 0xaf, 0xd8, 0x31, 0xc9, 0x31, 0xc0, 0x39, 0xde, + 0x0f, 0x9d, 0xc1, 0x0f, 0x9e, 0xc0, 0x01, 0xc9, + 0x09, 0xc8, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xa3, 0xc1, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x43, 0xc8, 0x89, + 0x4f, 0xf8, 0x8b, 0x44, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x34, 0x89, 0x54, 0x24, 0x30, 0x8b, 0x44, + 0x24, 0x14, 0x89, 0x44, 0x24, 0x2c, 0x83, 0xc4, + 0x18, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x6d, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x77, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x85, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_32(code + 0xae, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0xb8, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0xc6, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_32(code + 0x103, instruction->oparg); + patch_32(code + 0x10b, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x110, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__COMPARE_OP_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_STR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 6c 24 20 movl 0x20(%esp), %ebp + // 12: 8b 44 24 1c movl 0x1c(%esp), %eax + // 16: 89 44 24 04 movl %eax, 0x4(%esp) + // 1a: 8b 5d f8 movl -0x8(%ebp), %ebx + // 1d: 8b 7d fc movl -0x4(%ebp), %edi + // 20: 57 pushl %edi + // 21: 53 pushl %ebx + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __PyUnicode_Equal + // 27: 83 c4 08 addl $0x8, %esp + // 2a: 89 c6 movl %eax, %esi + // 2c: 8b 03 movl (%ebx), %eax + // 2e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 33: 7f 05 jg 0x3a <__JIT_ENTRY+0x3a> + // 35: 48 decl %eax + // 36: 89 03 movl %eax, (%ebx) + // 38: 74 33 je 0x6d <__JIT_ENTRY+0x6d> + // 3a: 8d 5d fc leal -0x4(%ebp), %ebx + // 3d: 8b 07 movl (%edi), %eax + // 3f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 44: 7f 53 jg 0x99 <__JIT_ENTRY+0x99> + // 46: 48 decl %eax + // 47: 89 07 movl %eax, (%edi) + // 49: 75 4e jne 0x99 <__JIT_ENTRY+0x99> + // 4b: a1 50 14 00 00 movl 0x1450, %eax + // 0000004c: IMAGE_REL_I386_DIR32 __PyRuntime + // 50: 85 c0 testl %eax, %eax + // 52: 74 0e je 0x62 <__JIT_ENTRY+0x62> + // 54: ff 35 54 14 00 00 pushl 0x1454 + // 00000056: IMAGE_REL_I386_DIR32 __PyRuntime + // 5a: 6a 01 pushl $0x1 + // 5c: 57 pushl %edi + // 5d: ff d0 calll *%eax + // 5f: 83 c4 0c addl $0xc, %esp + // 62: 57 pushl %edi + // 63: e8 00 00 00 00 calll 0x68 <__JIT_ENTRY+0x68> + // 00000064: IMAGE_REL_I386_REL32 __PyUnicode_ExactDealloc + // 68: 83 c4 04 addl $0x4, %esp + // 6b: eb 2c jmp 0x99 <__JIT_ENTRY+0x99> + // 6d: a1 50 14 00 00 movl 0x1450, %eax + // 0000006e: IMAGE_REL_I386_DIR32 __PyRuntime + // 72: 85 c0 testl %eax, %eax + // 74: 74 0e je 0x84 <__JIT_ENTRY+0x84> + // 76: ff 35 54 14 00 00 pushl 0x1454 + // 00000078: IMAGE_REL_I386_DIR32 __PyRuntime + // 7c: 6a 01 pushl $0x1 + // 7e: 53 pushl %ebx + // 7f: ff d0 calll *%eax + // 81: 83 c4 0c addl $0xc, %esp + // 84: 53 pushl %ebx + // 85: e8 00 00 00 00 calll 0x8a <__JIT_ENTRY+0x8a> + // 00000086: IMAGE_REL_I386_REL32 __PyUnicode_ExactDealloc + // 8a: 83 c4 04 addl $0x4, %esp + // 8d: 8d 5d fc leal -0x4(%ebp), %ebx + // 90: 8b 07 movl (%edi), %eax + // 92: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 97: 7e ad jle 0x46 <__JIT_ENTRY+0x46> + // 99: b8 00 00 00 00 movl $0x0, %eax + // 0000009a: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 9e: 83 c6 07 addl $0x7, %esi + // a1: 66 85 c6 testw %ax, %si + // a4: b8 00 00 00 00 movl $0x0, %eax + // 000000a5: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // a9: b9 00 00 00 00 movl $0x0, %ecx + // 000000aa: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // ae: 0f 44 c8 cmovel %eax, %ecx + // b1: 89 4d f8 movl %ecx, -0x8(%ebp) + // b4: 8b 04 24 movl (%esp), %eax + // b7: 89 44 24 24 movl %eax, 0x24(%esp) + // bb: 89 5c 24 20 movl %ebx, 0x20(%esp) + // bf: 8b 44 24 04 movl 0x4(%esp), %eax + // c3: 89 44 24 1c movl %eax, 0x1c(%esp) + // c7: 83 c4 08 addl $0x8, %esp + // ca: 5e popl %esi + // cb: 5f popl %edi + // cc: 5b popl %ebx + // cd: 5d popl %ebp + // ce: e9 00 00 00 00 jmp 0xd3 <__JIT_ENTRY+0xd3> + // 000000cf: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[206] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x6c, + 0x24, 0x20, 0x8b, 0x44, 0x24, 0x1c, 0x89, 0x44, + 0x24, 0x04, 0x8b, 0x5d, 0xf8, 0x8b, 0x7d, 0xfc, + 0x57, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x89, 0xc6, 0x8b, 0x03, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x48, 0x89, 0x03, + 0x74, 0x33, 0x8d, 0x5d, 0xfc, 0x8b, 0x07, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x53, 0x48, 0x89, + 0x07, 0x75, 0x4e, 0xa1, 0x50, 0x14, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, + 0x00, 0x00, 0x6a, 0x01, 0x57, 0xff, 0xd0, 0x83, + 0xc4, 0x0c, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0x2c, 0xa1, 0x50, 0x14, + 0x00, 0x00, 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, + 0x54, 0x14, 0x00, 0x00, 0x6a, 0x01, 0x53, 0xff, + 0xd0, 0x83, 0xc4, 0x0c, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8d, 0x5d, 0xfc, + 0x8b, 0x07, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7e, + 0xad, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc6, + 0x07, 0x66, 0x85, 0xc6, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x44, + 0xc8, 0x89, 0x4d, 0xf8, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x24, 0x89, 0x5c, 0x24, 0x20, 0x8b, + 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, 0x1c, 0x83, + 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_PyUnicode_Equal + -0x4); + patch_32(code + 0x4c, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x56, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x64, (uintptr_t)&_PyUnicode_ExactDealloc + -0x4); + patch_32(code + 0x6e, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x78, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x86, (uintptr_t)&_PyUnicode_ExactDealloc + -0x4); + patch_32(code + 0x9a, instruction->oparg); + patch_32(code + 0xa5, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0xaa, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__CONTAINS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: 8b 70 f8 movl -0x8(%eax), %esi + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: 89 47 20 movl %eax, 0x20(%edi) + // 1d: 56 pushl %esi + // 1e: 53 pushl %ebx + // 1f: e8 00 00 00 00 calll 0x24 <__JIT_ENTRY+0x24> + // 00000020: IMAGE_REL_I386_REL32 _PySequence_Contains + // 24: 83 c4 08 addl $0x8, %esp + // 27: 8b 6f 20 movl 0x20(%edi), %ebp + // 2a: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 31: 8b 0e movl (%esi), %ecx + // 33: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 39: 7f 05 jg 0x40 <__JIT_ENTRY+0x40> + // 3b: 49 decl %ecx + // 3c: 89 0e movl %ecx, (%esi) + // 3e: 74 1e je 0x5e <__JIT_ENTRY+0x5e> + // 40: 8b 0b movl (%ebx), %ecx + // 42: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 48: 7f 2b jg 0x75 <__JIT_ENTRY+0x75> + // 4a: 49 decl %ecx + // 4b: 89 0b movl %ecx, (%ebx) + // 4d: 75 26 jne 0x75 <__JIT_ENTRY+0x75> + // 4f: 53 pushl %ebx + // 50: 89 c6 movl %eax, %esi + // 52: e8 00 00 00 00 calll 0x57 <__JIT_ENTRY+0x57> + // 00000053: IMAGE_REL_I386_REL32 __Py_Dealloc + // 57: 89 f0 movl %esi, %eax + // 59: 83 c4 04 addl $0x4, %esp + // 5c: eb 17 jmp 0x75 <__JIT_ENTRY+0x75> + // 5e: 56 pushl %esi + // 5f: 89 c6 movl %eax, %esi + // 61: e8 00 00 00 00 calll 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __Py_Dealloc + // 66: 89 f0 movl %esi, %eax + // 68: 83 c4 04 addl $0x4, %esp + // 6b: 8b 0b movl (%ebx), %ecx + // 6d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 73: 7e d5 jle 0x4a <__JIT_ENTRY+0x4a> + // 75: 85 c0 testl %eax, %eax + // 77: 78 38 js 0xb1 <__JIT_ENTRY+0xb1> + // 79: b9 00 00 00 00 movl $0x0, %ecx + // 0000007a: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 7e: 0f b7 c9 movzwl %cx, %ecx + // 81: 39 c8 cmpl %ecx, %eax + // 83: b8 00 00 00 00 movl $0x0, %eax + // 00000084: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 88: b9 00 00 00 00 movl $0x0, %ecx + // 00000089: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 8d: 0f 44 c8 cmovel %eax, %ecx + // 90: 89 4d f8 movl %ecx, -0x8(%ebp) + // 93: 83 c5 fc addl $-0x4, %ebp + // 96: 8b 04 24 movl (%esp), %eax + // 99: 89 44 24 20 movl %eax, 0x20(%esp) + // 9d: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // a1: 89 7c 24 18 movl %edi, 0x18(%esp) + // a5: 83 c4 04 addl $0x4, %esp + // a8: 5e popl %esi + // a9: 5f popl %edi + // aa: 5b popl %ebx + // ab: 5d popl %ebp + // ac: e9 00 00 00 00 jmp 0xb1 <__JIT_ENTRY+0xb1> + // 000000ad: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // b1: 83 c5 f8 addl $-0x8, %ebp + // b4: 8b 04 24 movl (%esp), %eax + // b7: 89 44 24 20 movl %eax, 0x20(%esp) + // bb: 89 7c 24 18 movl %edi, 0x18(%esp) + // bf: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // c3: 83 c4 04 addl $0x4, %esp + // c6: 5e popl %esi + // c7: 5f popl %edi + // c8: 5b popl %ebx + // c9: 5d popl %ebp + // ca: e9 00 00 00 00 jmp 0xcf <__JIT_ENTRY+0xcf> + // 000000cb: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[207] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x70, 0xf8, 0x8b, + 0x58, 0xfc, 0x89, 0x47, 0x20, 0x56, 0x53, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x8b, + 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, 0x74, 0x1e, + 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x2b, 0x49, 0x89, 0x0b, 0x75, 0x26, 0x53, + 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x83, 0xc4, 0x04, 0xeb, 0x17, 0x56, 0x89, + 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, + 0x83, 0xc4, 0x04, 0x8b, 0x0b, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7e, 0xd5, 0x85, 0xc0, 0x78, + 0x38, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc9, 0x39, 0xc8, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x44, 0xc8, + 0x89, 0x4d, 0xf8, 0x83, 0xc5, 0xfc, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x6c, 0x24, + 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc5, 0xf8, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x18, 0x89, + 0x6c, 0x24, 0x1c, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x20, (uintptr_t)&PySequence_Contains + -0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x7a, instruction->oparg); + patch_32(code + 0x84, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x89, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0xad, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xcb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CONTAINS_OP_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 4c 24 20 movl 0x20(%esp), %ecx + // 9: 8b 44 24 1c movl 0x1c(%esp), %eax + // d: 8b 7c 24 18 movl 0x18(%esp), %edi + // 11: 8b 70 fc movl -0x4(%eax), %esi + // 14: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000017: IMAGE_REL_I386_DIR32 _PyDict_Type + // 1b: 74 18 je 0x35 <__JIT_ENTRY+0x35> + // 1d: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 21: 89 44 24 1c movl %eax, 0x1c(%esp) + // 25: 89 7c 24 18 movl %edi, 0x18(%esp) + // 29: 83 c4 04 addl $0x4, %esp + // 2c: 5e popl %esi + // 2d: 5f popl %edi + // 2e: 5b popl %ebx + // 2f: 5d popl %ebp + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 00000031: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 35: 89 0c 24 movl %ecx, (%esp) + // 38: 8b 58 f8 movl -0x8(%eax), %ebx + // 3b: 89 47 20 movl %eax, 0x20(%edi) + // 3e: 53 pushl %ebx + // 3f: 56 pushl %esi + // 40: e8 00 00 00 00 calll 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 _PyDict_Contains + // 45: 83 c4 08 addl $0x8, %esp + // 48: 8b 6f 20 movl 0x20(%edi), %ebp + // 4b: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 52: 8b 0b movl (%ebx), %ecx + // 54: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 5a: 7f 12 jg 0x6e <__JIT_ENTRY+0x6e> + // 5c: 49 decl %ecx + // 5d: 89 0b movl %ecx, (%ebx) + // 5f: 75 0d jne 0x6e <__JIT_ENTRY+0x6e> + // 61: 53 pushl %ebx + // 62: 89 c3 movl %eax, %ebx + // 64: e8 00 00 00 00 calll 0x69 <__JIT_ENTRY+0x69> + // 00000065: IMAGE_REL_I386_REL32 __Py_Dealloc + // 69: 89 d8 movl %ebx, %eax + // 6b: 83 c4 04 addl $0x4, %esp + // 6e: 8b 0e movl (%esi), %ecx + // 70: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 76: 7f 05 jg 0x7d <__JIT_ENTRY+0x7d> + // 78: 49 decl %ecx + // 79: 89 0e movl %ecx, (%esi) + // 7b: 74 3c je 0xb9 <__JIT_ENTRY+0xb9> + // 7d: 85 c0 testl %eax, %eax + // 7f: 78 49 js 0xca <__JIT_ENTRY+0xca> + // 81: b9 00 00 00 00 movl $0x0, %ecx + // 00000082: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 86: 0f b7 c9 movzwl %cx, %ecx + // 89: 39 c8 cmpl %ecx, %eax + // 8b: b8 00 00 00 00 movl $0x0, %eax + // 0000008c: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 90: b9 00 00 00 00 movl $0x0, %ecx + // 00000091: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 95: 0f 44 c8 cmovel %eax, %ecx + // 98: 89 4d f8 movl %ecx, -0x8(%ebp) + // 9b: 83 c5 fc addl $-0x4, %ebp + // 9e: 8b 04 24 movl (%esp), %eax + // a1: 89 44 24 20 movl %eax, 0x20(%esp) + // a5: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // a9: 89 7c 24 18 movl %edi, 0x18(%esp) + // ad: 83 c4 04 addl $0x4, %esp + // b0: 5e popl %esi + // b1: 5f popl %edi + // b2: 5b popl %ebx + // b3: 5d popl %ebp + // b4: e9 00 00 00 00 jmp 0xb9 <__JIT_ENTRY+0xb9> + // 000000b5: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // b9: 56 pushl %esi + // ba: 89 c6 movl %eax, %esi + // bc: e8 00 00 00 00 calll 0xc1 <__JIT_ENTRY+0xc1> + // 000000bd: IMAGE_REL_I386_REL32 __Py_Dealloc + // c1: 89 f0 movl %esi, %eax + // c3: 83 c4 04 addl $0x4, %esp + // c6: 85 c0 testl %eax, %eax + // c8: 79 b7 jns 0x81 <__JIT_ENTRY+0x81> + // ca: 83 c5 f8 addl $-0x8, %ebp + // cd: 8b 04 24 movl (%esp), %eax + // d0: 89 44 24 20 movl %eax, 0x20(%esp) + // d4: 89 7c 24 18 movl %edi, 0x18(%esp) + // d8: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // dc: 83 c4 04 addl $0x4, %esp + // df: 5e popl %esi + // e0: 5f popl %edi + // e1: 5b popl %ebx + // e2: 5d popl %ebp + // e3: e9 00 00 00 00 jmp 0xe8 <__JIT_ENTRY+0xe8> + // 000000e4: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[232] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x4c, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x7c, 0x24, + 0x18, 0x8b, 0x70, 0xfc, 0x81, 0x7e, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x18, 0x89, 0x4c, 0x24, + 0x20, 0x89, 0x44, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x0c, 0x24, + 0x8b, 0x58, 0xf8, 0x89, 0x47, 0x20, 0x53, 0x56, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x8b, 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x0b, 0x75, + 0x0d, 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, 0x0e, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, + 0x49, 0x89, 0x0e, 0x74, 0x3c, 0x85, 0xc0, 0x78, + 0x49, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc9, 0x39, 0xc8, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x44, 0xc8, + 0x89, 0x4d, 0xf8, 0x83, 0xc5, 0xfc, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x6c, 0x24, + 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x85, 0xc0, + 0x79, 0xb7, 0x83, 0xc5, 0xf8, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x6c, 0x24, 0x1c, 0x83, 0xc4, 0x04, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, (uintptr_t)&PyDict_Type); + patch_x86_64_32rx(code + 0x31, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)&PyDict_Contains + -0x4); + patch_x86_64_32rx(code + 0x65, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x82, instruction->oparg); + patch_32(code + 0x8c, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x91, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0xb5, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xe4, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CONTAINS_OP_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_SET.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 74 24 20 movl 0x20(%esp), %esi + // 9: 8b 44 24 1c movl 0x1c(%esp), %eax + // d: 8b 7c 24 18 movl 0x18(%esp), %edi + // 11: 8b 58 fc movl -0x4(%eax), %ebx + // 14: 8b 4b 04 movl 0x4(%ebx), %ecx + // 17: 81 f9 00 00 00 00 cmpl $0x0, %ecx + // 00000019: IMAGE_REL_I386_DIR32 _PySet_Type + // 1d: 0f 94 c2 sete %dl + // 20: 81 f9 00 00 00 00 cmpl $0x0, %ecx + // 00000022: IMAGE_REL_I386_DIR32 _PyFrozenSet_Type + // 26: 0f 94 c1 sete %cl + // 29: 08 d1 orb %dl, %cl + // 2b: 0f 84 84 00 00 00 je 0xb5 <__JIT_ENTRY+0xb5> + // 31: 89 34 24 movl %esi, (%esp) + // 34: 8b 70 f8 movl -0x8(%eax), %esi + // 37: 89 47 20 movl %eax, 0x20(%edi) + // 3a: 56 pushl %esi + // 3b: 53 pushl %ebx + // 3c: e8 00 00 00 00 calll 0x41 <__JIT_ENTRY+0x41> + // 0000003d: IMAGE_REL_I386_REL32 __PySet_Contains + // 41: 83 c4 08 addl $0x8, %esp + // 44: 8b 6f 20 movl 0x20(%edi), %ebp + // 47: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 4e: 8b 0e movl (%esi), %ecx + // 50: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 56: 7f 12 jg 0x6a <__JIT_ENTRY+0x6a> + // 58: 49 decl %ecx + // 59: 89 0e movl %ecx, (%esi) + // 5b: 75 0d jne 0x6a <__JIT_ENTRY+0x6a> + // 5d: 56 pushl %esi + // 5e: 89 c6 movl %eax, %esi + // 60: e8 00 00 00 00 calll 0x65 <__JIT_ENTRY+0x65> + // 00000061: IMAGE_REL_I386_REL32 __Py_Dealloc + // 65: 89 f0 movl %esi, %eax + // 67: 83 c4 04 addl $0x4, %esp + // 6a: 8b 0b movl (%ebx), %ecx + // 6c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 72: 7f 05 jg 0x79 <__JIT_ENTRY+0x79> + // 74: 49 decl %ecx + // 75: 89 0b movl %ecx, (%ebx) + // 77: 74 54 je 0xcd <__JIT_ENTRY+0xcd> + // 79: 85 c0 testl %eax, %eax + // 7b: 8b 14 24 movl (%esp), %edx + // 7e: 78 61 js 0xe1 <__JIT_ENTRY+0xe1> + // 80: b9 00 00 00 00 movl $0x0, %ecx + // 00000081: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 85: 0f b7 c9 movzwl %cx, %ecx + // 88: 39 c8 cmpl %ecx, %eax + // 8a: b8 00 00 00 00 movl $0x0, %eax + // 0000008b: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 8f: b9 00 00 00 00 movl $0x0, %ecx + // 00000090: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 94: 0f 44 c8 cmovel %eax, %ecx + // 97: 89 4d f8 movl %ecx, -0x8(%ebp) + // 9a: 83 c5 fc addl $-0x4, %ebp + // 9d: 89 54 24 20 movl %edx, 0x20(%esp) + // a1: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // a5: 89 7c 24 18 movl %edi, 0x18(%esp) + // a9: 83 c4 04 addl $0x4, %esp + // ac: 5e popl %esi + // ad: 5f popl %edi + // ae: 5b popl %ebx + // af: 5d popl %ebp + // b0: e9 00 00 00 00 jmp 0xb5 <__JIT_ENTRY+0xb5> + // 000000b1: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // b5: 89 74 24 20 movl %esi, 0x20(%esp) + // b9: 89 44 24 1c movl %eax, 0x1c(%esp) + // bd: 89 7c 24 18 movl %edi, 0x18(%esp) + // c1: 83 c4 04 addl $0x4, %esp + // c4: 5e popl %esi + // c5: 5f popl %edi + // c6: 5b popl %ebx + // c7: 5d popl %ebp + // c8: e9 00 00 00 00 jmp 0xcd <__JIT_ENTRY+0xcd> + // 000000c9: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // cd: 53 pushl %ebx + // ce: 89 c6 movl %eax, %esi + // d0: e8 00 00 00 00 calll 0xd5 <__JIT_ENTRY+0xd5> + // 000000d1: IMAGE_REL_I386_REL32 __Py_Dealloc + // d5: 89 f0 movl %esi, %eax + // d7: 83 c4 04 addl $0x4, %esp + // da: 85 c0 testl %eax, %eax + // dc: 8b 14 24 movl (%esp), %edx + // df: 79 9f jns 0x80 <__JIT_ENTRY+0x80> + // e1: 83 c5 f8 addl $-0x8, %ebp + // e4: 89 54 24 20 movl %edx, 0x20(%esp) + // e8: 89 7c 24 18 movl %edi, 0x18(%esp) + // ec: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // f0: 83 c4 04 addl $0x4, %esp + // f3: 5e popl %esi + // f4: 5f popl %edi + // f5: 5b popl %ebx + // f6: 5d popl %ebp + // f7: e9 00 00 00 00 jmp 0xfc <__JIT_ENTRY+0xfc> + // 000000f8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[252] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x74, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x7c, 0x24, + 0x18, 0x8b, 0x58, 0xfc, 0x8b, 0x4b, 0x04, 0x81, + 0xf9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc2, + 0x81, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x94, + 0xc1, 0x08, 0xd1, 0x0f, 0x84, 0x84, 0x00, 0x00, + 0x00, 0x89, 0x34, 0x24, 0x8b, 0x70, 0xf8, 0x89, + 0x47, 0x20, 0x56, 0x53, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x08, 0x8b, 0x6f, 0x20, 0xc7, + 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x0e, 0x75, 0x0d, 0x56, 0x89, 0xc6, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, + 0xc4, 0x04, 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0b, 0x74, + 0x54, 0x85, 0xc0, 0x8b, 0x14, 0x24, 0x78, 0x61, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x39, 0xc8, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x44, 0xc8, 0x89, + 0x4d, 0xf8, 0x83, 0xc5, 0xfc, 0x89, 0x54, 0x24, + 0x20, 0x89, 0x6c, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x74, 0x24, + 0x20, 0x89, 0x44, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x53, 0x89, 0xc6, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, + 0xc4, 0x04, 0x85, 0xc0, 0x8b, 0x14, 0x24, 0x79, + 0x9f, 0x83, 0xc5, 0xf8, 0x89, 0x54, 0x24, 0x20, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x6c, 0x24, 0x1c, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PySet_Type); + patch_32(code + 0x22, (uintptr_t)&PyFrozenSet_Type); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)&_PySet_Contains + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x81, instruction->oparg); + patch_32(code + 0x8b, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x90, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc9, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xd1, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xf8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CONVERT_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONVERT_VALUE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 44 24 14 movl 0x14(%esp), %eax + // f: b9 00 00 00 00 movl $0x0, %ecx + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 c9 movzwl %cx, %ecx + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: 89 46 20 movl %eax, 0x20(%esi) + // 1d: 53 pushl %ebx + // 1e: ff 14 8d 00 00 00 00 calll *(,%ecx,4) + // 00000021: IMAGE_REL_I386_DIR32 __PyEval_ConversionFuncs + // 25: 83 c4 04 addl $0x4, %esp + // 28: 83 46 20 fc addl $-0x4, 0x20(%esi) + // 2c: 8b 0b movl (%ebx), %ecx + // 2e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 34: 7f 05 jg 0x3b <__JIT_ENTRY+0x3b> + // 36: 49 decl %ecx + // 37: 89 0b movl %ecx, (%ebx) + // 39: 74 27 je 0x62 <__JIT_ENTRY+0x62> + // 3b: 8b 4e 20 movl 0x20(%esi), %ecx + // 3e: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 45: 85 c0 testl %eax, %eax + // 47: 74 34 je 0x7d <__JIT_ENTRY+0x7d> + // 49: 89 01 movl %eax, (%ecx) + // 4b: 83 c1 04 addl $0x4, %ecx + // 4e: 89 7c 24 18 movl %edi, 0x18(%esp) + // 52: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 56: 89 74 24 10 movl %esi, 0x10(%esp) + // 5a: 5e popl %esi + // 5b: 5f popl %edi + // 5c: 5b popl %ebx + // 5d: e9 00 00 00 00 jmp 0x62 <__JIT_ENTRY+0x62> + // 0000005e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 62: 53 pushl %ebx + // 63: 89 c3 movl %eax, %ebx + // 65: e8 00 00 00 00 calll 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6a: 89 d8 movl %ebx, %eax + // 6c: 83 c4 04 addl $0x4, %esp + // 6f: 8b 4e 20 movl 0x20(%esi), %ecx + // 72: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 79: 85 c0 testl %eax, %eax + // 7b: 75 cc jne 0x49 <__JIT_ENTRY+0x49> + // 7d: 89 7c 24 18 movl %edi, 0x18(%esp) + // 81: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 85: 89 74 24 10 movl %esi, 0x10(%esp) + // 89: 5e popl %esi + // 8a: 5f popl %edi + // 8b: 5b popl %ebx + // 8c: e9 00 00 00 00 jmp 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[145] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x44, 0x24, 0x14, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, + 0x58, 0xfc, 0x89, 0x46, 0x20, 0x53, 0xff, 0x14, + 0x8d, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x83, 0x46, 0x20, 0xfc, 0x8b, 0x0b, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, + 0x0b, 0x74, 0x27, 0x8b, 0x4e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x34, 0x89, 0x01, 0x83, 0xc1, 0x04, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, + 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x75, 0xcc, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, + 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_32(code + 0x21, (uintptr_t)&_PyEval_ConversionFuncs); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x66, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x8d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__COPY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: c1 e6 02 shll $0x2, %esi + // 19: f7 de negl %esi + // 1b: 8b 34 32 movl (%edx,%esi), %esi + // 1e: 8b 3e movl (%esi), %edi + // 20: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 26: 7f 03 jg 0x2b <__JIT_ENTRY+0x2b> + // 28: 47 incl %edi + // 29: 89 3e movl %edi, (%esi) + // 2b: 89 32 movl %esi, (%edx) + // 2d: 83 c2 04 addl $0x4, %edx + // 30: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 34: 89 54 24 10 movl %edx, 0x10(%esp) + // 38: 89 44 24 0c movl %eax, 0xc(%esp) + // 3c: 5e popl %esi + // 3d: 5f popl %edi + // 3e: e9 00 00 00 00 jmp 0x43 <__JIT_ENTRY+0x43> + // 0000003f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[62] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xc1, 0xe6, + 0x02, 0xf7, 0xde, 0x8b, 0x34, 0x32, 0x8b, 0x3e, + 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x47, 0x89, 0x3e, 0x89, 0x32, 0x83, 0xc2, 0x04, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x54, 0x24, 0x10, + 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); +} + +void +emit__COPY_FREE_VARS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY_FREE_VARS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // b: 8b 74 24 28 movl 0x28(%esp), %esi + // f: 8b 44 24 24 movl 0x24(%esp), %eax + // 13: b9 00 00 00 00 movl $0x0, %ecx + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 66 85 c9 testw %cx, %cx + // 1b: 74 5a je 0x77 <__JIT_ENTRY+0x77> + // 1d: 89 5c 24 08 movl %ebx, 0x8(%esp) + // 21: 89 74 24 0c movl %esi, 0xc(%esp) + // 25: 0f b7 c9 movzwl %cx, %ecx + // 28: 89 0c 24 movl %ecx, (%esp) + // 2b: 8b 08 movl (%eax), %ecx + // 2d: 8b 49 30 movl 0x30(%ecx), %ecx + // 30: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 34: 8b 48 08 movl 0x8(%eax), %ecx + // 37: 8b 79 24 movl 0x24(%ecx), %edi + // 3a: b9 00 00 00 00 movl $0x0, %ecx + // 0000003b: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 3f: 31 ed xorl %ebp, %ebp + // 41: 66 83 f9 01 cmpw $0x1, %cx + // 45: 75 48 jne 0x8f <__JIT_ENTRY+0x8f> + // 47: 8b 14 24 movl (%esp), %edx + // 4a: f6 c2 01 testb $0x1, %dl + // 4d: 8b 74 24 0c movl 0xc(%esp), %esi + // 51: 8b 5c 24 08 movl 0x8(%esp), %ebx + // 55: 74 20 je 0x77 <__JIT_ENTRY+0x77> + // 57: 8b 54 24 04 movl 0x4(%esp), %edx + // 5b: 2b 14 24 subl (%esp), %edx + // 5e: 8b 4c af 0c movl 0xc(%edi,%ebp,4), %ecx + // 62: 01 ea addl %ebp, %edx + // 64: 89 d7 movl %edx, %edi + // 66: 8b 11 movl (%ecx), %edx + // 68: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 6e: 7f 03 jg 0x73 <__JIT_ENTRY+0x73> + // 70: 42 incl %edx + // 71: 89 11 movl %edx, (%ecx) + // 73: 89 4c b8 28 movl %ecx, 0x28(%eax,%edi,4) + // 77: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 7b: 89 74 24 28 movl %esi, 0x28(%esp) + // 7f: 89 44 24 24 movl %eax, 0x24(%esp) + // 83: 83 c4 10 addl $0x10, %esp + // 86: 5e popl %esi + // 87: 5f popl %edi + // 88: 5b popl %ebx + // 89: 5d popl %ebp + // 8a: e9 00 00 00 00 jmp 0x8f <__JIT_ENTRY+0x8f> + // 0000008b: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 8f: 8b 14 24 movl (%esp), %edx + // 92: 89 d3 movl %edx, %ebx + // 94: 83 e3 fe andl $-0x2, %ebx + // 97: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 9b: 8d 0c 8d 00 00 00 00 leal (,%ecx,4), %ecx + // a2: 8d 14 95 00 00 00 00 leal (,%edx,4), %edx + // a9: 29 d1 subl %edx, %ecx + // ab: 8d 14 01 leal (%ecx,%eax), %edx + // ae: 83 c2 2c addl $0x2c, %edx + // b1: 31 ed xorl %ebp, %ebp + // b3: eb 19 jmp 0xce <__JIT_ENTRY+0xce> + // b5: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // c0: 89 0c aa movl %ecx, (%edx,%ebp,4) + // c3: 83 c5 02 addl $0x2, %ebp + // c6: 39 eb cmpl %ebp, %ebx + // c8: 0f 84 79 ff ff ff je 0x47 <__JIT_ENTRY+0x47> + // ce: 8b 4c af 0c movl 0xc(%edi,%ebp,4), %ecx + // d2: 8b 31 movl (%ecx), %esi + // d4: 81 fe ff ff ff 3f cmpl $0x3fffffff, %esi # imm = 0x3FFFFFFF + // da: 7f 03 jg 0xdf <__JIT_ENTRY+0xdf> + // dc: 46 incl %esi + // dd: 89 31 movl %esi, (%ecx) + // df: 89 4c aa fc movl %ecx, -0x4(%edx,%ebp,4) + // e3: 8b 4c af 10 movl 0x10(%edi,%ebp,4), %ecx + // e7: 8b 31 movl (%ecx), %esi + // e9: 81 fe ff ff ff 3f cmpl $0x3fffffff, %esi # imm = 0x3FFFFFFF + // ef: 7f cf jg 0xc0 <__JIT_ENTRY+0xc0> + // f1: 46 incl %esi + // f2: 89 31 movl %esi, (%ecx) + // f4: eb ca jmp 0xc0 <__JIT_ENTRY+0xc0> + const unsigned char code_body[246] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x5c, 0x24, 0x2c, 0x8b, 0x74, 0x24, 0x28, 0x8b, + 0x44, 0x24, 0x24, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc9, 0x74, 0x5a, 0x89, 0x5c, 0x24, + 0x08, 0x89, 0x74, 0x24, 0x0c, 0x0f, 0xb7, 0xc9, + 0x89, 0x0c, 0x24, 0x8b, 0x08, 0x8b, 0x49, 0x30, + 0x89, 0x4c, 0x24, 0x04, 0x8b, 0x48, 0x08, 0x8b, + 0x79, 0x24, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x31, + 0xed, 0x66, 0x83, 0xf9, 0x01, 0x75, 0x48, 0x8b, + 0x14, 0x24, 0xf6, 0xc2, 0x01, 0x8b, 0x74, 0x24, + 0x0c, 0x8b, 0x5c, 0x24, 0x08, 0x74, 0x20, 0x8b, + 0x54, 0x24, 0x04, 0x2b, 0x14, 0x24, 0x8b, 0x4c, + 0xaf, 0x0c, 0x01, 0xea, 0x89, 0xd7, 0x8b, 0x11, + 0x81, 0xfa, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x42, 0x89, 0x11, 0x89, 0x4c, 0xb8, 0x28, 0x89, + 0x5c, 0x24, 0x2c, 0x89, 0x74, 0x24, 0x28, 0x89, + 0x44, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x14, 0x24, 0x89, 0xd3, 0x83, 0xe3, 0xfe, 0x8b, + 0x4c, 0x24, 0x04, 0x8d, 0x0c, 0x8d, 0x00, 0x00, + 0x00, 0x00, 0x8d, 0x14, 0x95, 0x00, 0x00, 0x00, + 0x00, 0x29, 0xd1, 0x8d, 0x14, 0x01, 0x83, 0xc2, + 0x2c, 0x31, 0xed, 0xeb, 0x19, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x0c, 0xaa, 0x83, 0xc5, 0x02, 0x39, 0xeb, + 0x0f, 0x84, 0x79, 0xff, 0xff, 0xff, 0x8b, 0x4c, + 0xaf, 0x0c, 0x8b, 0x31, 0x81, 0xfe, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x03, 0x46, 0x89, 0x31, 0x89, + 0x4c, 0xaa, 0xfc, 0x8b, 0x4c, 0xaf, 0x10, 0x8b, + 0x31, 0x81, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0xcf, 0x46, 0x89, 0x31, 0xeb, 0xca, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x3b, instruction->oparg); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__CREATE_INIT_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CREATE_INIT_FRAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 7c 24 2c movl 0x2c(%esp), %edi + // b: 8b 6c 24 28 movl 0x28(%esp), %ebp + // f: 8b 74 24 24 movl 0x24(%esp), %esi + // 13: b8 00 00 00 00 movl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 c8 movzwl %ax, %ecx + // 1b: 8d 04 8d 00 00 00 00 leal (,%ecx,4), %eax + // 22: 89 ea movl %ebp, %edx + // 24: 29 c2 subl %eax, %edx + // 26: 89 14 24 movl %edx, (%esp) + // 29: 89 6e 20 movl %ebp, 0x20(%esi) + // 2c: 8b 9f 94 00 00 00 movl 0x94(%edi), %ebx + // 32: a1 34 00 00 00 movl 0x34, %eax + // 00000033: IMAGE_REL_I386_DIR32 __Py_InitCleanup + // 37: 8d 04 83 leal (%ebx,%eax,4), %eax + // 3a: 89 7c 24 0c movl %edi, 0xc(%esp) + // 3e: 89 87 94 00 00 00 movl %eax, 0x94(%edi) + // 44: 89 73 04 movl %esi, 0x4(%ebx) + // 47: c7 43 08 00 00 00 00 movl $0x0, 0x8(%ebx) + // 0000004a: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 4e: c7 03 00 00 00 00 movl $0x0, (%ebx) + // 00000050: IMAGE_REL_I386_DIR32 __Py_InitCleanup + // 54: c7 43 14 00 00 00 00 movl $0x0, 0x14(%ebx) + // 5b: a1 30 00 00 00 movl 0x30, %eax + // 0000005c: IMAGE_REL_I386_DIR32 __Py_InitCleanup + // 60: 8d 44 83 2c leal 0x2c(%ebx,%eax,4), %eax + // 64: 89 43 20 movl %eax, 0x20(%ebx) + // 67: 89 c8 movl %ecx, %eax + // 69: f7 d0 notl %eax + // 6b: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 70: 29 cf subl %ecx, %edi + // 72: c7 43 18 00 00 00 00 movl $0x0, 0x18(%ebx) + // 79: c7 43 1c 80 00 00 00 movl $0x80, 0x1c(%ebx) + // 0000007c: IMAGE_REL_I386_DIR32 __Py_InitCleanup + // 80: c7 43 24 00 00 00 00 movl $0x0, 0x24(%ebx) + // 87: 8b 56 20 movl 0x20(%esi), %edx + // 8a: 89 54 24 04 movl %edx, 0x4(%esp) + // 8e: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 95: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 99: 8b 6c 85 00 movl (%ebp,%eax,4), %ebp + // 9d: 8b 45 00 movl (%ebp), %eax + // a0: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // a5: 7f 04 jg 0xab <__JIT_ENTRY+0xab> + // a7: 40 incl %eax + // a8: 89 45 00 movl %eax, (%ebp) + // ab: 89 6b 28 movl %ebp, 0x28(%ebx) + // ae: 8b 44 24 04 movl 0x4(%esp), %eax + // b2: 89 46 20 movl %eax, 0x20(%esi) + // b5: 41 incl %ecx + // b6: 8b 04 24 movl (%esp), %eax + // b9: 83 c0 fc addl $-0x4, %eax + // bc: 8d 2c bd 00 00 00 00 leal (,%edi,4), %ebp + // c3: 53 pushl %ebx + // c4: 6a 00 pushl $0x0 + // c6: 51 pushl %ecx + // c7: 50 pushl %eax + // c8: 6a 00 pushl $0x0 + // ca: 8b 44 24 1c movl 0x1c(%esp), %eax + // ce: ff 34 b8 pushl (%eax,%edi,4) + // d1: 8b 7c 24 24 movl 0x24(%esp), %edi + // d5: 57 pushl %edi + // d6: e8 00 00 00 00 calll 0xdb <__JIT_ENTRY+0xdb> + // 000000d7: IMAGE_REL_I386_REL32 __PyEvalFramePushAndInit + // db: 83 c4 1c addl $0x1c, %esp + // de: 03 6e 20 addl 0x20(%esi), %ebp + // e1: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // e8: 85 c0 testl %eax, %eax + // ea: 74 27 je 0x113 <__JIT_ENTRY+0x113> + // ec: 66 c7 46 24 04 00 movw $0x4, 0x24(%esi) + // f2: ff 4f 1c decl 0x1c(%edi) + // f5: 89 45 00 movl %eax, (%ebp) + // f8: 83 c5 04 addl $0x4, %ebp + // fb: 89 7c 24 2c movl %edi, 0x2c(%esp) + // ff: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 103: 89 74 24 24 movl %esi, 0x24(%esp) + // 107: 83 c4 10 addl $0x10, %esp + // 10a: 5e popl %esi + // 10b: 5f popl %edi + // 10c: 5b popl %ebx + // 10d: 5d popl %ebp + // 10e: e9 00 00 00 00 jmp 0x113 <__JIT_ENTRY+0x113> + // 0000010f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 113: 53 pushl %ebx + // 114: 57 pushl %edi + // 115: e8 00 00 00 00 calll 0x11a <__JIT_ENTRY+0x11a> + // 00000116: IMAGE_REL_I386_REL32 __PyEval_FrameClearAndPop + // 11a: 83 c4 08 addl $0x8, %esp + // 11d: 89 7c 24 2c movl %edi, 0x2c(%esp) + // 121: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 125: 89 74 24 24 movl %esi, 0x24(%esp) + // 129: 83 c4 10 addl $0x10, %esp + // 12c: 5e popl %esi + // 12d: 5f popl %edi + // 12e: 5b popl %ebx + // 12f: 5d popl %ebp + // 130: e9 00 00 00 00 jmp 0x135 <__JIT_ENTRY+0x135> + // 00000131: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[309] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x7c, 0x24, 0x2c, 0x8b, 0x6c, 0x24, 0x28, 0x8b, + 0x74, 0x24, 0x24, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc8, 0x8d, 0x04, 0x8d, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xea, 0x29, 0xc2, 0x89, 0x14, + 0x24, 0x89, 0x6e, 0x20, 0x8b, 0x9f, 0x94, 0x00, + 0x00, 0x00, 0xa1, 0x34, 0x00, 0x00, 0x00, 0x8d, + 0x04, 0x83, 0x89, 0x7c, 0x24, 0x0c, 0x89, 0x87, + 0x94, 0x00, 0x00, 0x00, 0x89, 0x73, 0x04, 0xc7, + 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xc7, 0x43, 0x14, 0x00, + 0x00, 0x00, 0x00, 0xa1, 0x30, 0x00, 0x00, 0x00, + 0x8d, 0x44, 0x83, 0x2c, 0x89, 0x43, 0x20, 0x89, + 0xc8, 0xf7, 0xd0, 0xbf, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xcf, 0xc7, 0x43, 0x18, 0x00, 0x00, 0x00, + 0x00, 0xc7, 0x43, 0x1c, 0x80, 0x00, 0x00, 0x00, + 0xc7, 0x43, 0x24, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x56, 0x20, 0x89, 0x54, 0x24, 0x04, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x6c, 0x24, + 0x08, 0x8b, 0x6c, 0x85, 0x00, 0x8b, 0x45, 0x00, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x04, 0x40, + 0x89, 0x45, 0x00, 0x89, 0x6b, 0x28, 0x8b, 0x44, + 0x24, 0x04, 0x89, 0x46, 0x20, 0x41, 0x8b, 0x04, + 0x24, 0x83, 0xc0, 0xfc, 0x8d, 0x2c, 0xbd, 0x00, + 0x00, 0x00, 0x00, 0x53, 0x6a, 0x00, 0x51, 0x50, + 0x6a, 0x00, 0x8b, 0x44, 0x24, 0x1c, 0xff, 0x34, + 0xb8, 0x8b, 0x7c, 0x24, 0x24, 0x57, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x1c, 0x03, 0x6e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x27, 0x66, 0xc7, 0x46, 0x24, + 0x04, 0x00, 0xff, 0x4f, 0x1c, 0x89, 0x45, 0x00, + 0x83, 0xc5, 0x04, 0x89, 0x7c, 0x24, 0x2c, 0x89, + 0x6c, 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, + 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x53, 0x57, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x08, 0x89, 0x7c, 0x24, + 0x2c, 0x89, 0x6c, 0x24, 0x28, 0x89, 0x74, 0x24, + 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x33, (uintptr_t)&_Py_InitCleanup + 0x34); + patch_32(code + 0x4a, (uintptr_t)&_Py_NoneStruct); + patch_32(code + 0x50, (uintptr_t)&_Py_InitCleanup); + patch_32(code + 0x5c, (uintptr_t)&_Py_InitCleanup + 0x30); + patch_32(code + 0x7c, (uintptr_t)&_Py_InitCleanup + 0x80); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)&_PyEvalFramePushAndInit + -0x4); + patch_x86_64_32rx(code + 0x10f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x116, (uintptr_t)&_PyEval_FrameClearAndPop + -0x4); + patch_x86_64_32rx(code + 0x131, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_ATTR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c9 movzwl %cx, %ecx + // 18: 8b 68 fc movl -0x4(%eax), %ebp + // 1b: 8b 16 movl (%esi), %edx + // 1d: 8b 52 10 movl 0x10(%edx), %edx + // 20: 8b 4c 8a 0c movl 0xc(%edx,%ecx,4), %ecx + // 24: 89 46 20 movl %eax, 0x20(%esi) + // 27: 51 pushl %ecx + // 28: 55 pushl %ebp + // 29: e8 00 00 00 00 calll 0x2e <__JIT_ENTRY+0x2e> + // 0000002a: IMAGE_REL_I386_REL32 _PyObject_DelAttr + // 2e: 83 c4 08 addl $0x8, %esp + // 31: 8b 5e 20 movl 0x20(%esi), %ebx + // 34: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3b: 8b 4d 00 movl (%ebp), %ecx + // 3e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 44: 7f 06 jg 0x4c <__JIT_ENTRY+0x4c> + // 46: 49 decl %ecx + // 47: 89 4d 00 movl %ecx, (%ebp) + // 4a: 74 1c je 0x68 <__JIT_ENTRY+0x68> + // 4c: 83 c3 fc addl $-0x4, %ebx + // 4f: 85 c0 testl %eax, %eax + // 51: 74 29 je 0x7c <__JIT_ENTRY+0x7c> + // 53: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 57: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 5b: 89 74 24 14 movl %esi, 0x14(%esp) + // 5f: 5e popl %esi + // 60: 5f popl %edi + // 61: 5b popl %ebx + // 62: 5d popl %ebp + // 63: e9 00 00 00 00 jmp 0x68 <__JIT_ENTRY+0x68> + // 00000064: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 68: 55 pushl %ebp + // 69: 89 c5 movl %eax, %ebp + // 6b: e8 00 00 00 00 calll 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 70: 89 e8 movl %ebp, %eax + // 72: 83 c4 04 addl $0x4, %esp + // 75: 83 c3 fc addl $-0x4, %ebx + // 78: 85 c0 testl %eax, %eax + // 7a: 75 d7 jne 0x53 <__JIT_ENTRY+0x53> + // 7c: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 80: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 84: 89 74 24 14 movl %esi, 0x14(%esp) + // 88: 5e popl %esi + // 89: 5f popl %edi + // 8a: 5b popl %ebx + // 8b: 5d popl %ebp + // 8c: e9 00 00 00 00 jmp 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[140] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x8b, 0x68, 0xfc, 0x8b, 0x16, 0x8b, 0x52, 0x10, + 0x8b, 0x4c, 0x8a, 0x0c, 0x89, 0x46, 0x20, 0x51, + 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x08, 0x8b, 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x4d, 0x00, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, + 0x4d, 0x00, 0x74, 0x1c, 0x83, 0xc3, 0xfc, 0x85, + 0xc0, 0x74, 0x29, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x5c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xe8, 0x83, 0xc4, 0x04, 0x83, 0xc3, 0xfc, + 0x85, 0xc0, 0x75, 0xd7, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x5c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)&PyObject_DelAttr + -0x4); + patch_x86_64_32rx(code + 0x64, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__DELETE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_DEREF.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 54 24 14 movl 0x14(%esp), %edx + // f: b8 00 00 00 00 movl $0x0, %eax + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 c8 movzwl %ax, %ecx + // 17: 8b 5c 8e 28 movl 0x28(%esi,%ecx,4), %ebx + // 1b: 8b 43 08 movl 0x8(%ebx), %eax + // 1e: c7 43 08 00 00 00 00 movl $0x0, 0x8(%ebx) + // 25: 89 56 20 movl %edx, 0x20(%esi) + // 28: 85 c0 testl %eax, %eax + // 2a: 74 36 je 0x62 <__JIT_ENTRY+0x62> + // 2c: 8b 08 movl (%eax), %ecx + // 2e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 34: 7f 0e jg 0x44 <__JIT_ENTRY+0x44> + // 36: 49 decl %ecx + // 37: 89 08 movl %ecx, (%eax) + // 39: 75 09 jne 0x44 <__JIT_ENTRY+0x44> + // 3b: 50 pushl %eax + // 3c: e8 00 00 00 00 calll 0x41 <__JIT_ENTRY+0x41> + // 0000003d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 41: 83 c4 04 addl $0x4, %esp + // 44: 8b 46 20 movl 0x20(%esi), %eax + // 47: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4e: 89 7c 24 18 movl %edi, 0x18(%esp) + // 52: 89 44 24 14 movl %eax, 0x14(%esp) + // 56: 89 74 24 10 movl %esi, 0x10(%esp) + // 5a: 5e popl %esi + // 5b: 5f popl %edi + // 5c: 5b popl %ebx + // 5d: e9 00 00 00 00 jmp 0x62 <__JIT_ENTRY+0x62> + // 0000005e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 62: 51 pushl %ecx + // 63: ff 36 pushl (%esi) + // 65: 57 pushl %edi + // 66: e8 00 00 00 00 calll 0x6b <__JIT_ENTRY+0x6b> + // 00000067: IMAGE_REL_I386_REL32 __PyEval_FormatExcUnbound + // 6b: 83 c4 0c addl $0xc, %esp + // 6e: 8b 46 20 movl 0x20(%esi), %eax + // 71: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 78: 89 7c 24 18 movl %edi, 0x18(%esp) + // 7c: 89 44 24 14 movl %eax, 0x14(%esp) + // 80: 89 74 24 10 movl %esi, 0x10(%esp) + // 84: 5e popl %esi + // 85: 5f popl %edi + // 86: 5b popl %ebx + // 87: e9 00 00 00 00 jmp 0x8c <__JIT_ENTRY+0x8c> + // 00000088: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[140] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x54, 0x24, 0x14, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc8, 0x8b, + 0x5c, 0x8e, 0x28, 0x8b, 0x43, 0x08, 0xc7, 0x43, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x89, 0x56, 0x20, + 0x85, 0xc0, 0x74, 0x36, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, + 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x51, 0xff, 0x36, 0x57, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x46, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)&_PyEval_FormatExcUnbound + -0x4); + patch_x86_64_32rx(code + 0x88, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_FAST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: b8 00 00 00 00 movl $0x0, %eax + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 d0 movzwl %ax, %edx + // 16: 8b 44 96 28 movl 0x28(%esi,%edx,4), %eax + // 1a: 85 c0 testl %eax, %eax + // 1c: 74 40 je 0x5e <__JIT_ENTRY+0x5e> + // 1e: c7 44 96 28 00 00 00 00 movl $0x0, 0x28(%esi,%edx,4) + // 26: 89 4e 20 movl %ecx, 0x20(%esi) + // 29: 8b 08 movl (%eax), %ecx + // 2b: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 31: 7f 0e jg 0x41 <__JIT_ENTRY+0x41> + // 33: 49 decl %ecx + // 34: 89 08 movl %ecx, (%eax) + // 36: 75 09 jne 0x41 <__JIT_ENTRY+0x41> + // 38: 50 pushl %eax + // 39: e8 00 00 00 00 calll 0x3e <__JIT_ENTRY+0x3e> + // 0000003a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 3e: 83 c4 04 addl $0x4, %esp + // 41: 8b 46 20 movl 0x20(%esi), %eax + // 44: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4b: 89 7c 24 14 movl %edi, 0x14(%esp) + // 4f: 89 44 24 10 movl %eax, 0x10(%esp) + // 53: 89 74 24 0c movl %esi, 0xc(%esp) + // 57: 5e popl %esi + // 58: 5f popl %edi + // 59: e9 00 00 00 00 jmp 0x5e <__JIT_ENTRY+0x5e> + // 0000005a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5e: 89 4e 20 movl %ecx, 0x20(%esi) + // 61: 8b 06 movl (%esi), %eax + // 63: 52 pushl %edx + // 64: ff 70 48 pushl 0x48(%eax) + // 67: e8 00 00 00 00 calll 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 _PyTuple_GetItem + // 6c: 83 c4 08 addl $0x8, %esp + // 6f: 50 pushl %eax + // 70: 68 00 00 00 00 pushl $0x0 + // 00000071: IMAGE_REL_I386_DIR32 ??_C@_0EK@CHGBBAMA@cannot?5access?5local?5variable?5?8?$CFs@ + // 75: ff 35 00 00 00 00 pushl 0x0 + // 00000077: IMAGE_REL_I386_DIR32 _PyExc_UnboundLocalError + // 7b: 57 pushl %edi + // 7c: e8 00 00 00 00 calll 0x81 <__JIT_ENTRY+0x81> + // 0000007d: IMAGE_REL_I386_REL32 __PyEval_FormatExcCheckArg + // 81: 83 c4 10 addl $0x10, %esp + // 84: 8b 46 20 movl 0x20(%esi), %eax + // 87: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8e: 89 7c 24 14 movl %edi, 0x14(%esp) + // 92: 89 44 24 10 movl %eax, 0x10(%esp) + // 96: 89 74 24 0c movl %esi, 0xc(%esp) + // 9a: 5e popl %esi + // 9b: 5f popl %edi + // 9c: e9 00 00 00 00 jmp 0xa1 <__JIT_ENTRY+0xa1> + // 0000009d: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[161] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd0, 0x8b, 0x44, + 0x96, 0x28, 0x85, 0xc0, 0x74, 0x40, 0xc7, 0x44, + 0x96, 0x28, 0x00, 0x00, 0x00, 0x00, 0x89, 0x4e, + 0x20, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x4e, + 0x20, 0x8b, 0x06, 0x52, 0xff, 0x70, 0x48, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x50, + 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x10, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, 0x89, 0x74, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + const unsigned char data_body[80] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)&PyTuple_GetItem + -0x4); + patch_32(code + 0x71, (uintptr_t)data); + patch_32(code + 0x77, (uintptr_t)&PyExc_UnboundLocalError); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)&_PyEval_FormatExcCheckArg + -0x4); + patch_x86_64_32rx(code + 0x9d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_GLOBAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c9 movzwl %cx, %ecx + // 18: 8b 16 movl (%esi), %edx + // 1a: 8b 6e 0c movl 0xc(%esi), %ebp + // 1d: 8b 52 10 movl 0x10(%edx), %edx + // 20: 8b 5c 8a 0c movl 0xc(%edx,%ecx,4), %ebx + // 24: 89 46 20 movl %eax, 0x20(%esi) + // 27: 6a 00 pushl $0x0 + // 29: 53 pushl %ebx + // 2a: 55 pushl %ebp + // 2b: e8 00 00 00 00 calll 0x30 <__JIT_ENTRY+0x30> + // 0000002c: IMAGE_REL_I386_REL32 _PyDict_Pop + // 30: 83 c4 0c addl $0xc, %esp + // 33: 8b 4e 20 movl 0x20(%esi), %ecx + // 36: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 17 js 0x58 <__JIT_ENTRY+0x58> + // 41: 74 1f je 0x62 <__JIT_ENTRY+0x62> + // 43: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 47: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 4b: 89 74 24 14 movl %esi, 0x14(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: 5b popl %ebx + // 52: 5d popl %ebp + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 58: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 5c: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 60: eb 2a jmp 0x8c <__JIT_ENTRY+0x8c> + // 62: 89 4e 20 movl %ecx, 0x20(%esi) + // 65: 53 pushl %ebx + // 66: 68 00 00 00 00 pushl $0x0 + // 00000067: IMAGE_REL_I386_DIR32 ??_C@_0BN@DBLGJMNF@name?5?8?$CF?4200s?8?5is?5not?5defined?$AA@ + // 6b: ff 35 00 00 00 00 pushl 0x0 + // 0000006d: IMAGE_REL_I386_DIR32 _PyExc_NameError + // 71: 57 pushl %edi + // 72: e8 00 00 00 00 calll 0x77 <__JIT_ENTRY+0x77> + // 00000073: IMAGE_REL_I386_REL32 __PyEval_FormatExcCheckArg + // 77: 83 c4 10 addl $0x10, %esp + // 7a: 8b 46 20 movl 0x20(%esi), %eax + // 7d: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 84: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 88: 89 44 24 18 movl %eax, 0x18(%esp) + // 8c: 89 74 24 14 movl %esi, 0x14(%esp) + // 90: 5e popl %esi + // 91: 5f popl %edi + // 92: 5b popl %ebx + // 93: 5d popl %ebp + // 94: e9 00 00 00 00 jmp 0x99 <__JIT_ENTRY+0x99> + // 00000095: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[153] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x8b, 0x16, 0x8b, 0x6e, 0x0c, 0x8b, 0x52, 0x10, + 0x8b, 0x5c, 0x8a, 0x0c, 0x89, 0x46, 0x20, 0x6a, + 0x00, 0x53, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x0c, 0x8b, 0x4e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, + 0x17, 0x74, 0x1f, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x4c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x4c, 0x24, 0x18, + 0xeb, 0x2a, 0x89, 0x4e, 0x20, 0x53, 0x68, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x10, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x44, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: "name '%.200s' is not defined\x00" + // 1d: 00 00 00 + const unsigned char data_body[32] = { + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 0x2e, + 0x32, 0x30, 0x30, 0x73, 0x27, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)&PyDict_Pop + -0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x67, (uintptr_t)data); + patch_32(code + 0x6d, (uintptr_t)&PyExc_NameError); + patch_x86_64_32rx(code + 0x73, (uintptr_t)&_PyEval_FormatExcCheckArg + -0x4); + patch_x86_64_32rx(code + 0x95, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_NAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 4c 24 14 movl 0x14(%esp), %ecx + // f: b8 00 00 00 00 movl $0x0, %eax + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 d0 movzwl %ax, %edx + // 17: 8b 1e movl (%esi), %ebx + // 19: 8b 46 14 movl 0x14(%esi), %eax + // 1c: 8b 5b 10 movl 0x10(%ebx), %ebx + // 1f: 8b 5c 93 0c movl 0xc(%ebx,%edx,4), %ebx + // 23: 89 4e 20 movl %ecx, 0x20(%esi) + // 26: 85 c0 testl %eax, %eax + // 28: 74 44 je 0x6e <__JIT_ENTRY+0x6e> + // 2a: 53 pushl %ebx + // 2b: 50 pushl %eax + // 2c: e8 00 00 00 00 calll 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 _PyObject_DelItem + // 31: 83 c4 08 addl $0x8, %esp + // 34: 8b 4e 20 movl 0x20(%esi), %ecx + // 37: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3e: 85 c0 testl %eax, %eax + // 40: 74 5f je 0xa1 <__JIT_ENTRY+0xa1> + // 42: 89 4e 20 movl %ecx, 0x20(%esi) + // 45: 53 pushl %ebx + // 46: 68 00 00 00 00 pushl $0x0 + // 00000047: IMAGE_REL_I386_DIR32 ??_C@_0BN@DBLGJMNF@name?5?8?$CF?4200s?8?5is?5not?5defined?$AA@ + // 4b: ff 35 00 00 00 00 pushl 0x0 + // 0000004d: IMAGE_REL_I386_DIR32 _PyExc_NameError + // 51: 57 pushl %edi + // 52: e8 00 00 00 00 calll 0x57 <__JIT_ENTRY+0x57> + // 00000053: IMAGE_REL_I386_REL32 __PyEval_FormatExcCheckArg + // 57: 83 c4 10 addl $0x10, %esp + // 5a: 8b 46 20 movl 0x20(%esi), %eax + // 5d: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 64: 89 7c 24 18 movl %edi, 0x18(%esp) + // 68: 89 44 24 14 movl %eax, 0x14(%esp) + // 6c: eb 27 jmp 0x95 <__JIT_ENTRY+0x95> + // 6e: 53 pushl %ebx + // 6f: 68 00 00 00 00 pushl $0x0 + // 00000070: IMAGE_REL_I386_DIR32 ??_C@_0BL@HJKLBJNK@no?5locals?5when?5deleting?5?$CFR?$AA@ + // 74: ff 35 00 00 00 00 pushl 0x0 + // 00000076: IMAGE_REL_I386_DIR32 _PyExc_SystemError + // 7a: 57 pushl %edi + // 7b: e8 00 00 00 00 calll 0x80 <__JIT_ENTRY+0x80> + // 0000007c: IMAGE_REL_I386_REL32 __PyErr_Format + // 80: 83 c4 10 addl $0x10, %esp + // 83: 8b 46 20 movl 0x20(%esi), %eax + // 86: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8d: 89 44 24 14 movl %eax, 0x14(%esp) + // 91: 89 7c 24 18 movl %edi, 0x18(%esp) + // 95: 89 74 24 10 movl %esi, 0x10(%esp) + // 99: 5e popl %esi + // 9a: 5f popl %edi + // 9b: 5b popl %ebx + // 9c: e9 00 00 00 00 jmp 0xa1 <__JIT_ENTRY+0xa1> + // 0000009d: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // a1: 89 7c 24 18 movl %edi, 0x18(%esp) + // a5: 89 4c 24 14 movl %ecx, 0x14(%esp) + // a9: 89 74 24 10 movl %esi, 0x10(%esp) + // ad: 5e popl %esi + // ae: 5f popl %edi + // af: 5b popl %ebx + // b0: e9 00 00 00 00 jmp 0xb5 <__JIT_ENTRY+0xb5> + // 000000b1: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[176] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x4c, 0x24, 0x14, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd0, 0x8b, + 0x1e, 0x8b, 0x46, 0x14, 0x8b, 0x5b, 0x10, 0x8b, + 0x5c, 0x93, 0x0c, 0x89, 0x4e, 0x20, 0x85, 0xc0, + 0x74, 0x44, 0x53, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x08, 0x8b, 0x4e, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x5f, 0x89, 0x4e, 0x20, 0x53, 0x68, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x10, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x44, 0x24, 0x14, 0xeb, 0x27, 0x53, 0x68, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x10, 0x8b, 0x46, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x44, 0x24, + 0x14, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, + 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x4c, 0x24, + 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, + }; + // 0: "no locals when deleting %R\x00name '%.200s' is not defined\x00" + const unsigned char data_body[56] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x52, 0x00, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)&PyObject_DelItem + -0x4); + patch_32(code + 0x47, (uintptr_t)data + 0x1b); + patch_32(code + 0x4d, (uintptr_t)&PyExc_NameError); + patch_x86_64_32rx(code + 0x53, (uintptr_t)&_PyEval_FormatExcCheckArg + -0x4); + patch_32(code + 0x70, (uintptr_t)data); + patch_32(code + 0x76, (uintptr_t)&PyExc_SystemError); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0x9d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_SUBSCR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: 8b 70 f8 movl -0x8(%eax), %esi + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: 89 47 20 movl %eax, 0x20(%edi) + // 1d: 53 pushl %ebx + // 1e: 56 pushl %esi + // 1f: e8 00 00 00 00 calll 0x24 <__JIT_ENTRY+0x24> + // 00000020: IMAGE_REL_I386_REL32 _PyObject_DelItem + // 24: 83 c4 08 addl $0x8, %esp + // 27: 8b 6f 20 movl 0x20(%edi), %ebp + // 2a: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 31: 8b 0e movl (%esi), %ecx + // 33: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 39: 7f 05 jg 0x40 <__JIT_ENTRY+0x40> + // 3b: 49 decl %ecx + // 3c: 89 0e movl %ecx, (%esi) + // 3e: 74 1e je 0x5e <__JIT_ENTRY+0x5e> + // 40: 8b 0b movl (%ebx), %ecx + // 42: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 48: 7f 2b jg 0x75 <__JIT_ENTRY+0x75> + // 4a: 49 decl %ecx + // 4b: 89 0b movl %ecx, (%ebx) + // 4d: 75 26 jne 0x75 <__JIT_ENTRY+0x75> + // 4f: 53 pushl %ebx + // 50: 89 c6 movl %eax, %esi + // 52: e8 00 00 00 00 calll 0x57 <__JIT_ENTRY+0x57> + // 00000053: IMAGE_REL_I386_REL32 __Py_Dealloc + // 57: 89 f0 movl %esi, %eax + // 59: 83 c4 04 addl $0x4, %esp + // 5c: eb 17 jmp 0x75 <__JIT_ENTRY+0x75> + // 5e: 56 pushl %esi + // 5f: 89 c6 movl %eax, %esi + // 61: e8 00 00 00 00 calll 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __Py_Dealloc + // 66: 89 f0 movl %esi, %eax + // 68: 83 c4 04 addl $0x4, %esp + // 6b: 8b 0b movl (%ebx), %ecx + // 6d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 73: 7e d5 jle 0x4a <__JIT_ENTRY+0x4a> + // 75: 83 c5 f8 addl $-0x8, %ebp + // 78: 85 c0 testl %eax, %eax + // 7a: 74 1b je 0x97 <__JIT_ENTRY+0x97> + // 7c: 8b 04 24 movl (%esp), %eax + // 7f: 89 44 24 20 movl %eax, 0x20(%esp) + // 83: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 87: 89 7c 24 18 movl %edi, 0x18(%esp) + // 8b: 83 c4 04 addl $0x4, %esp + // 8e: 5e popl %esi + // 8f: 5f popl %edi + // 90: 5b popl %ebx + // 91: 5d popl %ebp + // 92: e9 00 00 00 00 jmp 0x97 <__JIT_ENTRY+0x97> + // 00000093: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 97: 8b 04 24 movl (%esp), %eax + // 9a: 89 44 24 20 movl %eax, 0x20(%esp) + // 9e: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // a2: 89 7c 24 18 movl %edi, 0x18(%esp) + // a6: 83 c4 04 addl $0x4, %esp + // a9: 5e popl %esi + // aa: 5f popl %edi + // ab: 5b popl %ebx + // ac: 5d popl %ebp + // ad: e9 00 00 00 00 jmp 0xb2 <__JIT_ENTRY+0xb2> + // 000000ae: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[173] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x70, 0xf8, 0x8b, + 0x58, 0xfc, 0x89, 0x47, 0x20, 0x53, 0x56, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x8b, + 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, 0x74, 0x1e, + 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x2b, 0x49, 0x89, 0x0b, 0x75, 0x26, 0x53, + 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x83, 0xc4, 0x04, 0xeb, 0x17, 0x56, 0x89, + 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, + 0x83, 0xc4, 0x04, 0x8b, 0x0b, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7e, 0xd5, 0x83, 0xc5, 0xf8, + 0x85, 0xc0, 0x74, 0x1b, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x20, 0x89, 0x6c, 0x24, 0x1c, 0x89, + 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x6c, + 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x20, (uintptr_t)&PyObject_DelItem + -0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x93, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DEOPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DEOPT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 08 movl 0x8(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 0c movl 0xc(%esp), %edx + // c: c7 82 a4 00 00 00 00 00 00 00 movl $0x0, 0xa4(%edx) + // 00000012: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 16: 89 41 20 movl %eax, 0x20(%ecx) + // 19: 8b 01 movl (%ecx), %eax + // 1b: b9 00 00 00 00 movl $0x0, %ecx + // 0000001c: IMAGE_REL_I386_DIR32 __JIT_TARGET + // 20: 8d 04 48 leal (%eax,%ecx,2), %eax + // 23: 05 80 00 00 00 addl $0x80, %eax + // 28: c3 retl + const unsigned char code_body[41] = { + 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x0c, 0xc7, 0x82, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x41, + 0x20, 0x8b, 0x01, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x8d, 0x04, 0x48, 0x05, 0x80, 0x00, 0x00, 0x00, + 0xc3, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, (uintptr_t)executor); + patch_32(code + 0x1c, instruction->target); +} + +void +emit__DICT_MERGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_MERGE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 7c 24 20 movl 0x20(%esp), %edi + // 9: 8b 74 24 18 movl 0x18(%esp), %esi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: b9 00 00 00 00 movl $0x0, %ecx + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 16: 0f b7 c9 movzwl %cx, %ecx + // 19: 8b 58 fc movl -0x4(%eax), %ebx + // 1c: ba fc ff ff ff movl $0xfffffffc, %edx # imm = 0xFFFFFFFC + // 21: 29 ca subl %ecx, %edx + // 23: f7 d1 notl %ecx + // 25: 8b 0c 88 movl (%eax,%ecx,4), %ecx + // 28: 8b 14 90 movl (%eax,%edx,4), %edx + // 2b: 89 14 24 movl %edx, (%esp) + // 2e: 89 46 20 movl %eax, 0x20(%esi) + // 31: 6a 02 pushl $0x2 + // 33: 53 pushl %ebx + // 34: 51 pushl %ecx + // 35: e8 00 00 00 00 calll 0x3a <__JIT_ENTRY+0x3a> + // 00000036: IMAGE_REL_I386_REL32 __PyDict_MergeEx + // 3a: 83 c4 0c addl $0xc, %esp + // 3d: 8b 6e 20 movl 0x20(%esi), %ebp + // 40: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 47: 85 c0 testl %eax, %eax + // 49: 78 32 js 0x7d <__JIT_ENTRY+0x7d> + // 4b: 8b 03 movl (%ebx), %eax + // 4d: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 52: 7f 0e jg 0x62 <__JIT_ENTRY+0x62> + // 54: 48 decl %eax + // 55: 89 03 movl %eax, (%ebx) + // 57: 75 09 jne 0x62 <__JIT_ENTRY+0x62> + // 59: 53 pushl %ebx + // 5a: e8 00 00 00 00 calll 0x5f <__JIT_ENTRY+0x5f> + // 0000005b: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5f: 83 c4 04 addl $0x4, %esp + // 62: 83 c5 fc addl $-0x4, %ebp + // 65: 89 7c 24 20 movl %edi, 0x20(%esp) + // 69: 89 74 24 18 movl %esi, 0x18(%esp) + // 6d: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 71: 83 c4 04 addl $0x4, %esp + // 74: 5e popl %esi + // 75: 5f popl %edi + // 76: 5b popl %ebx + // 77: 5d popl %ebp + // 78: e9 00 00 00 00 jmp 0x7d <__JIT_ENTRY+0x7d> + // 00000079: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 7d: 89 6e 20 movl %ebp, 0x20(%esi) + // 80: 53 pushl %ebx + // 81: ff 74 24 04 pushl 0x4(%esp) + // 85: 57 pushl %edi + // 86: e8 00 00 00 00 calll 0x8b <__JIT_ENTRY+0x8b> + // 00000087: IMAGE_REL_I386_REL32 __PyEval_FormatKwargsError + // 8b: 83 c4 0c addl $0xc, %esp + // 8e: 8b 6e 20 movl 0x20(%esi), %ebp + // 91: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 98: 8b 03 movl (%ebx), %eax + // 9a: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 9f: 7f 0e jg 0xaf <__JIT_ENTRY+0xaf> + // a1: 48 decl %eax + // a2: 89 03 movl %eax, (%ebx) + // a4: 75 09 jne 0xaf <__JIT_ENTRY+0xaf> + // a6: 53 pushl %ebx + // a7: e8 00 00 00 00 calll 0xac <__JIT_ENTRY+0xac> + // 000000a8: IMAGE_REL_I386_REL32 __Py_Dealloc + // ac: 83 c4 04 addl $0x4, %esp + // af: 83 c5 fc addl $-0x4, %ebp + // b2: 89 7c 24 20 movl %edi, 0x20(%esp) + // b6: 89 74 24 18 movl %esi, 0x18(%esp) + // ba: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // be: 83 c4 04 addl $0x4, %esp + // c1: 5e popl %esi + // c2: 5f popl %edi + // c3: 5b popl %ebx + // c4: 5d popl %ebp + // c5: e9 00 00 00 00 jmp 0xca <__JIT_ENTRY+0xca> + // 000000c6: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[202] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, + 0x20, 0x8b, 0x74, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc9, 0x8b, 0x58, 0xfc, 0xba, 0xfc, 0xff, 0xff, + 0xff, 0x29, 0xca, 0xf7, 0xd1, 0x8b, 0x0c, 0x88, + 0x8b, 0x14, 0x90, 0x89, 0x14, 0x24, 0x89, 0x46, + 0x20, 0x6a, 0x02, 0x53, 0x51, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x6e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x32, 0x8b, 0x03, 0x3d, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, 0x03, 0x75, + 0x09, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x83, 0xc5, 0xfc, 0x89, 0x7c, 0x24, + 0x20, 0x89, 0x74, 0x24, 0x18, 0x89, 0x6c, 0x24, + 0x1c, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x6e, 0x20, + 0x53, 0xff, 0x74, 0x24, 0x04, 0x57, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x6e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x03, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x48, 0x89, 0x03, 0x75, 0x09, 0x53, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x83, + 0xc5, 0xfc, 0x89, 0x7c, 0x24, 0x20, 0x89, 0x74, + 0x24, 0x18, 0x89, 0x6c, 0x24, 0x1c, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, instruction->oparg); + patch_x86_64_32rx(code + 0x36, (uintptr_t)&_PyDict_MergeEx + -0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x87, (uintptr_t)&_PyEval_FormatKwargsError + -0x4); + patch_x86_64_32rx(code + 0xa8, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc6, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DICT_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_UPDATE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: f7 d1 notl %ecx + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: c1 e1 02 shll $0x2, %ecx + // 1d: 81 c9 00 00 fc ff orl $0xfffc0000, %ecx # imm = 0xFFFC0000 + // 23: 8b 0c 08 movl (%eax,%ecx), %ecx + // 26: 89 46 20 movl %eax, 0x20(%esi) + // 29: 53 pushl %ebx + // 2a: 51 pushl %ecx + // 2b: e8 00 00 00 00 calll 0x30 <__JIT_ENTRY+0x30> + // 0000002c: IMAGE_REL_I386_REL32 _PyDict_Update + // 30: 83 c4 08 addl $0x8, %esp + // 33: 8b 6e 20 movl 0x20(%esi), %ebp + // 36: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 2f js 0x70 <__JIT_ENTRY+0x70> + // 41: 8b 03 movl (%ebx), %eax + // 43: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 48: 7f 0e jg 0x58 <__JIT_ENTRY+0x58> + // 4a: 48 decl %eax + // 4b: 89 03 movl %eax, (%ebx) + // 4d: 75 09 jne 0x58 <__JIT_ENTRY+0x58> + // 4f: 53 pushl %ebx + // 50: e8 00 00 00 00 calll 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __Py_Dealloc + // 55: 83 c4 04 addl $0x4, %esp + // 58: 83 c5 fc addl $-0x4, %ebp + // 5b: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 5f: 89 74 24 14 movl %esi, 0x14(%esp) + // 63: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 67: 5e popl %esi + // 68: 5f popl %edi + // 69: 5b popl %ebx + // 6a: 5d popl %ebp + // 6b: e9 00 00 00 00 jmp 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 70: 89 6e 20 movl %ebp, 0x20(%esi) + // 73: ff 35 00 00 00 00 pushl 0x0 + // 00000075: IMAGE_REL_I386_DIR32 _PyExc_AttributeError + // 79: 57 pushl %edi + // 7a: e8 00 00 00 00 calll 0x7f <__JIT_ENTRY+0x7f> + // 0000007b: IMAGE_REL_I386_REL32 __PyErr_ExceptionMatches + // 7f: 83 c4 08 addl $0x8, %esp + // 82: 8b 6e 20 movl 0x20(%esi), %ebp + // 85: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8c: 85 c0 testl %eax, %eax + // 8e: 74 27 je 0xb7 <__JIT_ENTRY+0xb7> + // 90: 89 6e 20 movl %ebp, 0x20(%esi) + // 93: 8b 43 04 movl 0x4(%ebx), %eax + // 96: ff 70 0c pushl 0xc(%eax) + // 99: 68 00 00 00 00 pushl $0x0 + // 0000009a: IMAGE_REL_I386_DIR32 ??_C@_0CB@CMJMJEG@?8?$CF?4200s?8?5object?5is?5not?5a?5mapping@ + // 9e: ff 35 00 00 00 00 pushl 0x0 + // 000000a0: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // a4: 57 pushl %edi + // a5: e8 00 00 00 00 calll 0xaa <__JIT_ENTRY+0xaa> + // 000000a6: IMAGE_REL_I386_REL32 __PyErr_Format + // aa: 83 c4 10 addl $0x10, %esp + // ad: 8b 6e 20 movl 0x20(%esi), %ebp + // b0: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // b7: 8b 03 movl (%ebx), %eax + // b9: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // be: 7f 0e jg 0xce <__JIT_ENTRY+0xce> + // c0: 48 decl %eax + // c1: 89 03 movl %eax, (%ebx) + // c3: 75 09 jne 0xce <__JIT_ENTRY+0xce> + // c5: 53 pushl %ebx + // c6: e8 00 00 00 00 calll 0xcb <__JIT_ENTRY+0xcb> + // 000000c7: IMAGE_REL_I386_REL32 __Py_Dealloc + // cb: 83 c4 04 addl $0x4, %esp + // ce: 83 c5 fc addl $-0x4, %ebp + // d1: 89 7c 24 1c movl %edi, 0x1c(%esp) + // d5: 89 74 24 14 movl %esi, 0x14(%esp) + // d9: 89 6c 24 18 movl %ebp, 0x18(%esp) + // dd: 5e popl %esi + // de: 5f popl %edi + // df: 5b popl %ebx + // e0: 5d popl %ebp + // e1: e9 00 00 00 00 jmp 0xe6 <__JIT_ENTRY+0xe6> + // 000000e2: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[230] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd1, 0x8b, + 0x58, 0xfc, 0xc1, 0xe1, 0x02, 0x81, 0xc9, 0x00, + 0x00, 0xfc, 0xff, 0x8b, 0x0c, 0x08, 0x89, 0x46, + 0x20, 0x53, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, + 0x2f, 0x8b, 0x03, 0x3d, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0e, 0x48, 0x89, 0x03, 0x75, 0x09, 0x53, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x83, 0xc5, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x74, 0x24, 0x14, 0x89, 0x6c, 0x24, 0x18, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x6e, 0x20, 0xff, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x27, + 0x89, 0x6e, 0x20, 0x8b, 0x43, 0x04, 0xff, 0x70, + 0x0c, 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x57, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x10, 0x8b, 0x6e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x48, 0x89, 0x03, 0x75, 0x09, 0x53, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x83, 0xc5, + 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x74, 0x24, + 0x14, 0x89, 0x6c, 0x24, 0x18, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'%.200s' object is not a mapping\x00" + // 21: 00 00 00 00 00 00 00 + const unsigned char data_body[40] = { + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)&PyDict_Update + -0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x75, (uintptr_t)&PyExc_AttributeError); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)&_PyErr_ExceptionMatches + -0x4); + patch_32(code + 0x9a, (uintptr_t)data); + patch_32(code + 0xa0, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0xc7, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xe2, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__END_FOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_FOR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 41 fc movl -0x4(%ecx), %eax + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 89 4e 20 movl %ecx, 0x20(%esi) + // 17: 8b 08 movl (%eax), %ecx + // 19: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1f: 7f 0e jg 0x2f <__JIT_ENTRY+0x2f> + // 21: 49 decl %ecx + // 22: 89 08 movl %ecx, (%eax) + // 24: 75 09 jne 0x2f <__JIT_ENTRY+0x2f> + // 26: 50 pushl %eax + // 27: e8 00 00 00 00 calll 0x2c <__JIT_ENTRY+0x2c> + // 00000028: IMAGE_REL_I386_REL32 __Py_Dealloc + // 2c: 83 c4 04 addl $0x4, %esp + // 2f: 8b 46 20 movl 0x20(%esi), %eax + // 32: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 39: 89 7c 24 14 movl %edi, 0x14(%esp) + // 3d: 89 44 24 10 movl %eax, 0x10(%esp) + // 41: 89 74 24 0c movl %esi, 0xc(%esp) + // 45: 5e popl %esi + // 46: 5f popl %edi + // 47: e9 00 00 00 00 jmp 0x4c <__JIT_ENTRY+0x4c> + // 00000048: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[71] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x41, + 0xfc, 0x83, 0xc1, 0xfc, 0x89, 0x4e, 0x20, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, + 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x28, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__END_SEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_SEND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 7c 24 20 movl 0x20(%esp), %edi + // 9: 8b 6c 24 1c movl 0x1c(%esp), %ebp + // d: 8b 54 24 18 movl 0x18(%esp), %edx + // 11: 8d 5d fc leal -0x4(%ebp), %ebx + // 14: 8b 45 f8 movl -0x8(%ebp), %eax + // 17: 8b 75 fc movl -0x4(%ebp), %esi + // 1a: 8b 08 movl (%eax), %ecx + // 1c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 22: 7f 16 jg 0x3a <__JIT_ENTRY+0x3a> + // 24: 49 decl %ecx + // 25: 89 08 movl %ecx, (%eax) + // 27: 75 11 jne 0x3a <__JIT_ENTRY+0x3a> + // 29: 50 pushl %eax + // 2a: 89 54 24 04 movl %edx, 0x4(%esp) + // 2e: e8 00 00 00 00 calll 0x33 <__JIT_ENTRY+0x33> + // 0000002f: IMAGE_REL_I386_REL32 __Py_Dealloc + // 33: 8b 54 24 04 movl 0x4(%esp), %edx + // 37: 83 c4 04 addl $0x4, %esp + // 3a: 89 75 f8 movl %esi, -0x8(%ebp) + // 3d: 89 7c 24 20 movl %edi, 0x20(%esp) + // 41: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 45: 89 54 24 18 movl %edx, 0x18(%esp) + // 49: 83 c4 04 addl $0x4, %esp + // 4c: 5e popl %esi + // 4d: 5f popl %edi + // 4e: 5b popl %ebx + // 4f: 5d popl %ebp + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, + 0x20, 0x8b, 0x6c, 0x24, 0x1c, 0x8b, 0x54, 0x24, + 0x18, 0x8d, 0x5d, 0xfc, 0x8b, 0x45, 0xf8, 0x8b, + 0x75, 0xfc, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x16, 0x49, 0x89, 0x08, 0x75, + 0x11, 0x50, 0x89, 0x54, 0x24, 0x04, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, 0x04, 0x83, + 0xc4, 0x04, 0x89, 0x75, 0xf8, 0x89, 0x7c, 0x24, + 0x20, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x54, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__ERROR_POP_N( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ERROR_POP_N.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 44 24 0c movl 0xc(%esp), %eax + // 5: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 9: 8b 54 24 10 movl 0x10(%esp), %edx + // d: c7 82 a4 00 00 00 00 00 00 00 movl $0x0, 0xa4(%edx) + // 00000013: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 17: 8b 11 movl (%ecx), %edx + // 19: be 00 00 00 00 movl $0x0, %esi + // 0000001a: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1e: 8d 14 72 leal (%edx,%esi,2), %edx + // 21: 81 c2 80 00 00 00 addl $0x80, %edx + // 27: 89 51 1c movl %edx, 0x1c(%ecx) + // 2a: 89 41 20 movl %eax, 0x20(%ecx) + // 2d: 31 c0 xorl %eax, %eax + // 2f: 5e popl %esi + // 30: c3 retl + const unsigned char code_body[49] = { + 0x56, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, + 0x08, 0x8b, 0x54, 0x24, 0x10, 0xc7, 0x82, 0xa4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x11, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x14, + 0x72, 0x81, 0xc2, 0x80, 0x00, 0x00, 0x00, 0x89, + 0x51, 0x1c, 0x89, 0x41, 0x20, 0x31, 0xc0, 0x5e, + 0xc3, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)executor); + patch_32(code + 0x1a, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__EXIT_INIT_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_INIT_CHECK.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 44 24 10 movl 0x10(%esp), %eax + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: 8b 48 fc movl -0x4(%eax), %ecx + // 11: 81 f9 00 00 00 00 cmpl $0x0, %ecx + // 00000013: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 17: 74 39 je 0x52 <__JIT_ENTRY+0x52> + // 19: 89 46 20 movl %eax, 0x20(%esi) + // 1c: 8b 41 04 movl 0x4(%ecx), %eax + // 1f: ff 70 0c pushl 0xc(%eax) + // 22: 68 00 00 00 00 pushl $0x0 + // 00000023: IMAGE_REL_I386_DIR32 ??_C@_0CM@HKPEOANK@__init__?$CI?$CJ?5should?5return?5None?0?5n@ + // 27: ff 35 00 00 00 00 pushl 0x0 + // 00000029: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // 2d: e8 00 00 00 00 calll 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 _PyErr_Format + // 32: 83 c4 0c addl $0xc, %esp + // 35: 8b 46 20 movl 0x20(%esi), %eax + // 38: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3f: 89 44 24 10 movl %eax, 0x10(%esp) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 74 24 0c movl %esi, 0xc(%esp) + // 4b: 5e popl %esi + // 4c: 5f popl %edi + // 4d: e9 00 00 00 00 jmp 0x52 <__JIT_ENTRY+0x52> + // 0000004e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 52: 83 c0 fc addl $-0x4, %eax + // 55: 89 7c 24 14 movl %edi, 0x14(%esp) + // 59: 89 44 24 10 movl %eax, 0x10(%esp) + // 5d: 89 74 24 0c movl %esi, 0xc(%esp) + // 61: 5e popl %esi + // 62: 5f popl %edi + // 63: e9 00 00 00 00 jmp 0x68 <__JIT_ENTRY+0x68> + // 00000064: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[99] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x44, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0x8b, 0x48, + 0xfc, 0x81, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x39, 0x89, 0x46, 0x20, 0x8b, 0x41, 0x04, 0xff, + 0x70, 0x0c, 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc0, 0xfc, 0x89, 0x7c, 0x24, + 0x14, 0x89, 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, + 0x0c, 0x5e, 0x5f, + }; + // 0: "__init__() should return None, not '%.200s'\x00" + // 2c: 00 00 00 00 + const unsigned char data_body[48] = { + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x5f, + 0x28, 0x29, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x27, 0x25, 0x2e, 0x32, 0x30, + 0x30, 0x73, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&_Py_NoneStruct); + patch_32(code + 0x23, (uintptr_t)data); + patch_32(code + 0x29, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)&PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0x4e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__EXIT_TRACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_TRACE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 7c 24 20 movl 0x20(%esp), %edi + // 9: 8b 54 24 1c movl 0x1c(%esp), %edx + // d: 8b 74 24 18 movl 0x18(%esp), %esi + // 11: 8b 2e movl (%esi), %ebp + // 13: 8b 1d 00 00 00 00 movl 0x0, %ebx + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 19: a1 08 00 00 00 movl 0x8, %eax + // 0000001a: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1e: 85 c0 testl %eax, %eax + // 20: 0f 84 fa 00 00 00 je 0x120 <__JIT_ENTRY+0x120> + // 26: f6 40 12 01 testb $0x1, 0x12(%eax) + // 2a: 0f 85 b2 00 00 00 jne 0xe2 <__JIT_ENTRY+0xe2> + // 30: 66 c7 05 04 00 00 00 fc ff movw $0xfffc, 0x4 # imm = 0xFFFC + // 00000033: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 39: 89 56 20 movl %edx, 0x20(%esi) + // 3c: c7 05 08 00 00 00 00 00 00 00 movl $0x0, 0x8 + // 0000003e: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 46: 8b 08 movl (%eax), %ecx + // 48: 81 f9 00 00 00 40 cmpl $0x40000000, %ecx # imm = 0x40000000 + // 4e: 0f 8d c2 00 00 00 jge 0x116 <__JIT_ENTRY+0x116> + // 54: 49 decl %ecx + // 55: 89 08 movl %ecx, (%eax) + // 57: 75 09 jne 0x62 <__JIT_ENTRY+0x62> + // 59: 50 pushl %eax + // 5a: e8 00 00 00 00 calll 0x5f <__JIT_ENTRY+0x5f> + // 0000005b: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5f: 83 c4 04 addl $0x4, %esp + // 62: a1 08 00 00 00 movl 0x8, %eax + // 00000063: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 67: 8b 56 20 movl 0x20(%esi), %edx + // 6a: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 71: c7 87 a4 00 00 00 00 00 00 00 movl $0x0, 0xa4(%edi) + // 00000077: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 7b: 85 c0 testl %eax, %eax + // 7d: 75 6d jne 0xec <__JIT_ENTRY+0xec> + // 7f: 8d 04 5d 80 00 00 00 leal 0x80(,%ebx,2), %eax + // 86: 01 e8 addl %ebp, %eax + // 88: 0f b7 1d 04 00 00 00 movzwl 0x4, %ebx + // 0000008b: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 8f: 83 fb 0f cmpl $0xf, %ebx + // 92: 0f 83 ab 00 00 00 jae 0x143 <__JIT_ENTRY+0x143> + // 98: 80 38 ff cmpb $-0x1, (%eax) + // 9b: 0f 84 b7 00 00 00 je 0x158 <__JIT_ENTRY+0x158> + // a1: 0f b6 0d 12 00 00 00 movzbl 0x12, %ecx + // 000000a4: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // a8: c1 e9 02 shrl $0x2, %ecx + // ab: 41 incl %ecx + // ac: 89 56 20 movl %edx, 0x20(%esi) + // af: 89 e2 movl %esp, %edx + // b1: 51 pushl %ecx + // b2: 52 pushl %edx + // b3: 89 c5 movl %eax, %ebp + // b5: 50 pushl %eax + // b6: 56 pushl %esi + // b7: e8 00 00 00 00 calll 0xbc <__JIT_ENTRY+0xbc> + // 000000b8: IMAGE_REL_I386_REL32 __PyOptimizer_Optimize + // bc: 83 c4 10 addl $0x10, %esp + // bf: 8b 56 20 movl 0x20(%esi), %edx + // c2: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // c9: 85 c0 testl %eax, %eax + // cb: 0f 8e b7 00 00 00 jle 0x188 <__JIT_ENTRY+0x188> + // d1: 66 c7 05 04 00 00 00 fc ff movw $0xfffc, 0x4 # imm = 0xFFFC + // 000000d4: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // da: 8b 04 24 movl (%esp), %eax + // dd: e9 8e 00 00 00 jmp 0x170 <__JIT_ENTRY+0x170> + // e2: c7 87 a4 00 00 00 00 00 00 00 movl $0x0, 0xa4(%edi) + // 000000e8: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // ec: 8b 08 movl (%eax), %ecx + // ee: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // f4: 7f 08 jg 0xfe <__JIT_ENTRY+0xfe> + // f6: 41 incl %ecx + // f7: 89 08 movl %ecx, (%eax) + // f9: a1 08 00 00 00 movl 0x8, %eax + // 000000fa: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // fe: 8b 40 54 movl 0x54(%eax), %eax + // 101: 89 7c 24 20 movl %edi, 0x20(%esp) + // 105: 89 54 24 1c movl %edx, 0x1c(%esp) + // 109: 89 74 24 18 movl %esi, 0x18(%esp) + // 10d: 83 c4 04 addl $0x4, %esp + // 110: 5e popl %esi + // 111: 5f popl %edi + // 112: 5b popl %ebx + // 113: 5d popl %ebp + // 114: ff e0 jmpl *%eax + // 116: 8b 56 20 movl 0x20(%esi), %edx + // 119: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 120: c7 87 a4 00 00 00 00 00 00 00 movl $0x0, 0xa4(%edi) + // 00000126: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 12a: 8d 04 5d 80 00 00 00 leal 0x80(,%ebx,2), %eax + // 131: 01 e8 addl %ebp, %eax + // 133: 0f b7 1d 04 00 00 00 movzwl 0x4, %ebx + // 00000136: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 13a: 83 fb 0f cmpl $0xf, %ebx + // 13d: 0f 82 55 ff ff ff jb 0x98 <__JIT_ENTRY+0x98> + // 143: 83 c3 f0 addl $-0x10, %ebx + // 146: 66 89 1d 04 00 00 00 movw %bx, 0x4 + // 00000149: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 14d: 89 56 20 movl %edx, 0x20(%esi) + // 150: 83 c4 04 addl $0x4, %esp + // 153: 5e popl %esi + // 154: 5f popl %edi + // 155: 5b popl %ebx + // 156: 5d popl %ebp + // 157: c3 retl + // 158: 8b 4d 64 movl 0x64(%ebp), %ecx + // 15b: 0f b6 40 01 movzbl 0x1(%eax), %eax + // 15f: 8b 44 81 08 movl 0x8(%ecx,%eax,4), %eax + // 163: 8b 08 movl (%eax), %ecx + // 165: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 16b: 7f 03 jg 0x170 <__JIT_ENTRY+0x170> + // 16d: 41 incl %ecx + // 16e: 89 08 movl %ecx, (%eax) + // 170: a3 08 00 00 00 movl %eax, 0x8 + // 00000171: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 175: 8b 08 movl (%eax), %ecx + // 177: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 17d: 0f 8e 73 ff ff ff jle 0xf6 <__JIT_ENTRY+0xf6> + // 183: e9 76 ff ff ff jmp 0xfe <__JIT_ENTRY+0xfe> + // 188: 66 bf fc ff movw $0xfffc, %di # imm = 0xFFFC + // 18c: 66 83 fb 0b cmpw $0xb, %bx + // 190: 77 11 ja 0x1a3 <__JIT_ENTRY+0x1a3> + // 192: 43 incl %ebx + // 193: bf ff ff ff ff movl $0xffffffff, %edi # imm = 0xFFFFFFFF + // 198: 89 d9 movl %ebx, %ecx + // 19a: d3 e7 shll %cl, %edi + // 19c: f7 d7 notl %edi + // 19e: c1 e7 04 shll $0x4, %edi + // 1a1: 09 df orl %ebx, %edi + // 1a3: 66 89 3d 04 00 00 00 movw %di, 0x4 + // 000001a6: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1aa: 89 56 20 movl %edx, 0x20(%esi) + // 1ad: 31 c9 xorl %ecx, %ecx + // 1af: 85 c0 testl %eax, %eax + // 1b1: 89 e8 movl %ebp, %eax + // 1b3: 0f 45 c1 cmovnel %ecx, %eax + // 1b6: eb 98 jmp 0x150 <__JIT_ENTRY+0x150> + const unsigned char code_body[440] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, + 0x20, 0x8b, 0x54, 0x24, 0x1c, 0x8b, 0x74, 0x24, + 0x18, 0x8b, 0x2e, 0x8b, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0xa1, 0x08, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x0f, 0x84, 0xfa, 0x00, 0x00, 0x00, 0xf6, 0x40, + 0x12, 0x01, 0x0f, 0x85, 0xb2, 0x00, 0x00, 0x00, + 0x66, 0xc7, 0x05, 0x04, 0x00, 0x00, 0x00, 0xfc, + 0xff, 0x89, 0x56, 0x20, 0xc7, 0x05, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, + 0x81, 0xf9, 0x00, 0x00, 0x00, 0x40, 0x0f, 0x8d, + 0xc2, 0x00, 0x00, 0x00, 0x49, 0x89, 0x08, 0x75, + 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0xa1, 0x08, 0x00, 0x00, 0x00, 0x8b, + 0x56, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0xc7, 0x87, 0xa4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x75, 0x6d, 0x8d, + 0x04, 0x5d, 0x80, 0x00, 0x00, 0x00, 0x01, 0xe8, + 0x0f, 0xb7, 0x1d, 0x04, 0x00, 0x00, 0x00, 0x83, + 0xfb, 0x0f, 0x0f, 0x83, 0xab, 0x00, 0x00, 0x00, + 0x80, 0x38, 0xff, 0x0f, 0x84, 0xb7, 0x00, 0x00, + 0x00, 0x0f, 0xb6, 0x0d, 0x12, 0x00, 0x00, 0x00, + 0xc1, 0xe9, 0x02, 0x41, 0x89, 0x56, 0x20, 0x89, + 0xe2, 0x51, 0x52, 0x89, 0xc5, 0x50, 0x56, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x10, 0x8b, + 0x56, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x0f, 0x8e, 0xb7, 0x00, 0x00, + 0x00, 0x66, 0xc7, 0x05, 0x04, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0x8b, 0x04, 0x24, 0xe9, 0x8e, 0x00, + 0x00, 0x00, 0xc7, 0x87, 0xa4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x08, 0x41, 0x89, + 0x08, 0xa1, 0x08, 0x00, 0x00, 0x00, 0x8b, 0x40, + 0x54, 0x89, 0x7c, 0x24, 0x20, 0x89, 0x54, 0x24, + 0x1c, 0x89, 0x74, 0x24, 0x18, 0x83, 0xc4, 0x04, + 0x5e, 0x5f, 0x5b, 0x5d, 0xff, 0xe0, 0x8b, 0x56, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xc7, 0x87, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8d, 0x04, 0x5d, 0x80, 0x00, 0x00, + 0x00, 0x01, 0xe8, 0x0f, 0xb7, 0x1d, 0x04, 0x00, + 0x00, 0x00, 0x83, 0xfb, 0x0f, 0x0f, 0x82, 0x55, + 0xff, 0xff, 0xff, 0x83, 0xc3, 0xf0, 0x66, 0x89, + 0x1d, 0x04, 0x00, 0x00, 0x00, 0x89, 0x56, 0x20, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xc3, + 0x8b, 0x4d, 0x64, 0x0f, 0xb6, 0x40, 0x01, 0x8b, + 0x44, 0x81, 0x08, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x41, 0x89, 0x08, + 0xa3, 0x08, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x0f, 0x8e, 0x73, + 0xff, 0xff, 0xff, 0xe9, 0x76, 0xff, 0xff, 0xff, + 0x66, 0xbf, 0xfc, 0xff, 0x66, 0x83, 0xfb, 0x0b, + 0x77, 0x11, 0x43, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xd9, 0xd3, 0xe7, 0xf7, 0xd7, 0xc1, 0xe7, + 0x04, 0x09, 0xdf, 0x66, 0x89, 0x3d, 0x04, 0x00, + 0x00, 0x00, 0x89, 0x56, 0x20, 0x31, 0xc9, 0x85, + 0xc0, 0x89, 0xe8, 0x0f, 0x45, 0xc1, 0xeb, 0x98, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x1a, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_32(code + 0x33, (instruction->operand0 & UINT32_MAX) + 0x4); + patch_32(code + 0x3e, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x63, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_32(code + 0x77, (uintptr_t)executor); + patch_32(code + 0x8b, (instruction->operand0 & UINT32_MAX) + 0x4); + patch_32(code + 0xa4, (uintptr_t)executor + 0x12); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)&_PyOptimizer_Optimize + -0x4); + patch_32(code + 0xd4, (instruction->operand0 & UINT32_MAX) + 0x4); + patch_32(code + 0xe8, (uintptr_t)executor); + patch_32(code + 0xfa, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_32(code + 0x126, (uintptr_t)executor); + patch_32(code + 0x136, (instruction->operand0 & UINT32_MAX) + 0x4); + patch_32(code + 0x149, (instruction->operand0 & UINT32_MAX) + 0x4); + patch_32(code + 0x171, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_32(code + 0x1a6, (instruction->operand0 & UINT32_MAX) + 0x4); +} + +void +emit__EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 44 24 1c movl 0x1c(%esp), %eax + // 10: 8b 74 24 18 movl 0x18(%esp), %esi + // 14: b9 00 00 00 00 movl $0x0, %ecx + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 d1 movzwl %cx, %edx + // 1c: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 21: 29 d1 subl %edx, %ecx + // 23: f7 d2 notl %edx + // 25: 8b 1c 88 movl (%eax,%ecx,4), %ebx + // 28: 8b 6b 0c movl 0xc(%ebx), %ebp + // 2b: 8b 7d 00 movl (%ebp), %edi + // 2e: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 34: 7f 04 jg 0x3a <__JIT_ENTRY+0x3a> + // 36: 47 incl %edi + // 37: 89 7d 00 movl %edi, (%ebp) + // 3a: 89 2c 90 movl %ebp, (%eax,%edx,4) + // 3d: 8b 14 88 movl (%eax,%ecx,4), %edx + // 40: 8b 5b 08 movl 0x8(%ebx), %ebx + // 43: 8b 3b movl (%ebx), %edi + // 45: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 4b: 7f 03 jg 0x50 <__JIT_ENTRY+0x50> + // 4d: 47 incl %edi + // 4e: 89 3b movl %edi, (%ebx) + // 50: 89 1c 88 movl %ebx, (%eax,%ecx,4) + // 53: 89 46 20 movl %eax, 0x20(%esi) + // 56: 8b 02 movl (%edx), %eax + // 58: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 5d: 7f 0e jg 0x6d <__JIT_ENTRY+0x6d> + // 5f: 48 decl %eax + // 60: 89 02 movl %eax, (%edx) + // 62: 75 09 jne 0x6d <__JIT_ENTRY+0x6d> + // 64: 52 pushl %edx + // 65: e8 00 00 00 00 calll 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6a: 83 c4 04 addl $0x4, %esp + // 6d: 8b 46 20 movl 0x20(%esi), %eax + // 70: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 77: 8b 0c 24 movl (%esp), %ecx + // 7a: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 7e: 89 44 24 1c movl %eax, 0x1c(%esp) + // 82: 89 74 24 18 movl %esi, 0x18(%esp) + // 86: 83 c4 04 addl $0x4, %esp + // 89: 5e popl %esi + // 8a: 5f popl %edi + // 8b: 5b popl %ebx + // 8c: 5d popl %ebp + // 8d: e9 00 00 00 00 jmp 0x92 <__JIT_ENTRY+0x92> + // 0000008e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[141] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x44, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x18, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xd1, 0xb9, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xd1, 0xf7, 0xd2, 0x8b, 0x1c, 0x88, + 0x8b, 0x6b, 0x0c, 0x8b, 0x7d, 0x00, 0x81, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x04, 0x47, 0x89, + 0x7d, 0x00, 0x89, 0x2c, 0x90, 0x8b, 0x14, 0x88, + 0x8b, 0x5b, 0x08, 0x8b, 0x3b, 0x81, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3b, + 0x89, 0x1c, 0x88, 0x89, 0x46, 0x20, 0x8b, 0x02, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, + 0x89, 0x02, 0x75, 0x09, 0x52, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0c, 0x24, 0x89, 0x4c, 0x24, 0x20, 0x89, 0x44, + 0x24, 0x1c, 0x89, 0x74, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_x86_64_32rx(code + 0x66, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD_KW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // 10: 8b 74 24 18 movl 0x18(%esp), %esi + // 14: b8 00 00 00 00 movl $0x0, %eax + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 c0 movzwl %ax, %eax + // 1c: bb fe ff ff ff movl $0xfffffffe, %ebx # imm = 0xFFFFFFFE + // 21: 29 c3 subl %eax, %ebx + // 23: ba fd ff ff ff movl $0xfffffffd, %edx # imm = 0xFFFFFFFD + // 28: 29 c2 subl %eax, %edx + // 2a: 8b 04 91 movl (%ecx,%edx,4), %eax + // 2d: 8b 68 0c movl 0xc(%eax), %ebp + // 30: 8b 7d 00 movl (%ebp), %edi + // 33: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 39: 7f 04 jg 0x3f <__JIT_ENTRY+0x3f> + // 3b: 47 incl %edi + // 3c: 89 7d 00 movl %edi, (%ebp) + // 3f: 89 2c 99 movl %ebp, (%ecx,%ebx,4) + // 42: 8b 58 08 movl 0x8(%eax), %ebx + // 45: 8b 3b movl (%ebx), %edi + // 47: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 4d: 7f 03 jg 0x52 <__JIT_ENTRY+0x52> + // 4f: 47 incl %edi + // 50: 89 3b movl %edi, (%ebx) + // 52: 89 1c 91 movl %ebx, (%ecx,%edx,4) + // 55: 89 4e 20 movl %ecx, 0x20(%esi) + // 58: 8b 08 movl (%eax), %ecx + // 5a: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 60: 7f 0e jg 0x70 <__JIT_ENTRY+0x70> + // 62: 49 decl %ecx + // 63: 89 08 movl %ecx, (%eax) + // 65: 75 09 jne 0x70 <__JIT_ENTRY+0x70> + // 67: 50 pushl %eax + // 68: e8 00 00 00 00 calll 0x6d <__JIT_ENTRY+0x6d> + // 00000069: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6d: 83 c4 04 addl $0x4, %esp + // 70: 8b 46 20 movl 0x20(%esi), %eax + // 73: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 7a: 8b 0c 24 movl (%esp), %ecx + // 7d: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 81: 89 44 24 1c movl %eax, 0x1c(%esp) + // 85: 89 74 24 18 movl %esi, 0x18(%esp) + // 89: 83 c4 04 addl $0x4, %esp + // 8c: 5e popl %esi + // 8d: 5f popl %edi + // 8e: 5b popl %ebx + // 8f: 5d popl %ebp + // 90: e9 00 00 00 00 jmp 0x95 <__JIT_ENTRY+0x95> + // 00000091: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[144] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x4c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x18, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xc0, 0xbb, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xc3, 0xba, 0xfd, 0xff, 0xff, 0xff, + 0x29, 0xc2, 0x8b, 0x04, 0x91, 0x8b, 0x68, 0x0c, + 0x8b, 0x7d, 0x00, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x04, 0x47, 0x89, 0x7d, 0x00, 0x89, + 0x2c, 0x99, 0x8b, 0x58, 0x08, 0x8b, 0x3b, 0x81, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x47, + 0x89, 0x3b, 0x89, 0x1c, 0x91, 0x89, 0x4e, 0x20, + 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0c, 0x24, 0x89, 0x4c, 0x24, + 0x20, 0x89, 0x44, 0x24, 0x1c, 0x89, 0x74, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_x86_64_32rx(code + 0x69, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__FATAL_ERROR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FATAL_ERROR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 68 00 00 00 00 pushl $0x0 + // 00000001: IMAGE_REL_I386_DIR32 ??_C@_0BK@GCJGAMOK@Fatal?5error?5uop?5executed?4?$AA@ + // 5: 68 00 00 00 00 pushl $0x0 + // 00000006: IMAGE_REL_I386_DIR32 ??_C@_0L@HIBONIGH@_JIT_ENTRY?$AA@ + // a: e8 00 00 00 00 calll 0xf <__JIT_ENTRY+0xf> + // 0000000b: IMAGE_REL_I386_REL32 __Py_FatalErrorFunc + const unsigned char code_body[15] = { + 0x68, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, + 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'Fatal error uop executed.\x00_JIT_ENTRY\x00' + // 25: 00 00 00 + const unsigned char data_body[40] = { + 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x75, 0x6f, 0x70, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x2e, 0x00, 0x5f, 0x4a, 0x49, 0x54, 0x5f, 0x45, + 0x4e, 0x54, 0x52, 0x59, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1, (uintptr_t)data); + patch_32(code + 0x6, (uintptr_t)data + 0x1a); + patch_x86_64_32rx(code + 0xb, (uintptr_t)&_Py_FatalErrorFunc + -0x4); +} + +void +emit__FORMAT_SIMPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_SIMPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 4c 24 14 movl 0x14(%esp), %ecx + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 59 fc movl -0x4(%ecx), %ebx + // 12: 81 7b 04 00 00 00 00 cmpl $0x0, 0x4(%ebx) + // 00000015: IMAGE_REL_I386_DIR32 _PyUnicode_Type + // 19: 74 33 je 0x4e <__JIT_ENTRY+0x4e> + // 1b: 89 4e 20 movl %ecx, 0x20(%esi) + // 1e: 6a 00 pushl $0x0 + // 20: 53 pushl %ebx + // 21: e8 00 00 00 00 calll 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 _PyObject_Format + // 26: 83 c4 08 addl $0x8, %esp + // 29: 83 46 20 fc addl $-0x4, 0x20(%esi) + // 2d: 8b 0b movl (%ebx), %ecx + // 2f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 35: 7f 05 jg 0x3c <__JIT_ENTRY+0x3c> + // 37: 49 decl %ecx + // 38: 89 0b movl %ecx, (%ebx) + // 3a: 74 2e je 0x6a <__JIT_ENTRY+0x6a> + // 3c: 8b 4e 20 movl 0x20(%esi), %ecx + // 3f: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 46: 85 c0 testl %eax, %eax + // 48: 74 3b je 0x85 <__JIT_ENTRY+0x85> + // 4a: 89 c3 movl %eax, %ebx + // 4c: eb 03 jmp 0x51 <__JIT_ENTRY+0x51> + // 4e: 83 c1 fc addl $-0x4, %ecx + // 51: 89 19 movl %ebx, (%ecx) + // 53: 83 c1 04 addl $0x4, %ecx + // 56: 89 7c 24 18 movl %edi, 0x18(%esp) + // 5a: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 5e: 89 74 24 10 movl %esi, 0x10(%esp) + // 62: 5e popl %esi + // 63: 5f popl %edi + // 64: 5b popl %ebx + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 6a: 53 pushl %ebx + // 6b: 89 c3 movl %eax, %ebx + // 6d: e8 00 00 00 00 calll 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 72: 89 d8 movl %ebx, %eax + // 74: 83 c4 04 addl $0x4, %esp + // 77: 8b 4e 20 movl 0x20(%esi), %ecx + // 7a: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 81: 85 c0 testl %eax, %eax + // 83: 75 c5 jne 0x4a <__JIT_ENTRY+0x4a> + // 85: 89 7c 24 18 movl %edi, 0x18(%esp) + // 89: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 8d: 89 74 24 10 movl %esi, 0x10(%esp) + // 91: 5e popl %esi + // 92: 5f popl %edi + // 93: 5b popl %ebx + // 94: e9 00 00 00 00 jmp 0x99 <__JIT_ENTRY+0x99> + // 00000095: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[153] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x4c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x59, 0xfc, 0x81, 0x7b, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x33, 0x89, 0x4e, 0x20, 0x6a, 0x00, + 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x08, 0x83, 0x46, 0x20, 0xfc, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, + 0x89, 0x0b, 0x74, 0x2e, 0x8b, 0x4e, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x3b, 0x89, 0xc3, 0xeb, 0x03, 0x83, 0xc1, + 0xfc, 0x89, 0x19, 0x83, 0xc1, 0x04, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, + 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x75, 0xc5, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, + 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, (uintptr_t)&PyUnicode_Type); + patch_x86_64_32rx(code + 0x22, (uintptr_t)&PyObject_Format + -0x4); + patch_x86_64_32rx(code + 0x66, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x95, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__FORMAT_WITH_SPEC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_WITH_SPEC.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: 8b 70 f8 movl -0x8(%eax), %esi + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: 89 47 20 movl %eax, 0x20(%edi) + // 1d: 53 pushl %ebx + // 1e: 56 pushl %esi + // 1f: e8 00 00 00 00 calll 0x24 <__JIT_ENTRY+0x24> + // 00000020: IMAGE_REL_I386_REL32 _PyObject_Format + // 24: 83 c4 08 addl $0x8, %esp + // 27: 8b 6f 20 movl 0x20(%edi), %ebp + // 2a: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 31: 8b 0e movl (%esi), %ecx + // 33: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 39: 7f 05 jg 0x40 <__JIT_ENTRY+0x40> + // 3b: 49 decl %ecx + // 3c: 89 0e movl %ecx, (%esi) + // 3e: 74 1e je 0x5e <__JIT_ENTRY+0x5e> + // 40: 8b 0b movl (%ebx), %ecx + // 42: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 48: 7f 2b jg 0x75 <__JIT_ENTRY+0x75> + // 4a: 49 decl %ecx + // 4b: 89 0b movl %ecx, (%ebx) + // 4d: 75 26 jne 0x75 <__JIT_ENTRY+0x75> + // 4f: 53 pushl %ebx + // 50: 89 c6 movl %eax, %esi + // 52: e8 00 00 00 00 calll 0x57 <__JIT_ENTRY+0x57> + // 00000053: IMAGE_REL_I386_REL32 __Py_Dealloc + // 57: 89 f0 movl %esi, %eax + // 59: 83 c4 04 addl $0x4, %esp + // 5c: eb 17 jmp 0x75 <__JIT_ENTRY+0x75> + // 5e: 56 pushl %esi + // 5f: 89 c6 movl %eax, %esi + // 61: e8 00 00 00 00 calll 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __Py_Dealloc + // 66: 89 f0 movl %esi, %eax + // 68: 83 c4 04 addl $0x4, %esp + // 6b: 8b 0b movl (%ebx), %ecx + // 6d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 73: 7e d5 jle 0x4a <__JIT_ENTRY+0x4a> + // 75: 85 c0 testl %eax, %eax + // 77: 74 21 je 0x9a <__JIT_ENTRY+0x9a> + // 79: 89 45 f8 movl %eax, -0x8(%ebp) + // 7c: 83 c5 fc addl $-0x4, %ebp + // 7f: 8b 04 24 movl (%esp), %eax + // 82: 89 44 24 20 movl %eax, 0x20(%esp) + // 86: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 8a: 89 7c 24 18 movl %edi, 0x18(%esp) + // 8e: 83 c4 04 addl $0x4, %esp + // 91: 5e popl %esi + // 92: 5f popl %edi + // 93: 5b popl %ebx + // 94: 5d popl %ebp + // 95: e9 00 00 00 00 jmp 0x9a <__JIT_ENTRY+0x9a> + // 00000096: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 9a: 83 c5 f8 addl $-0x8, %ebp + // 9d: 8b 04 24 movl (%esp), %eax + // a0: 89 44 24 20 movl %eax, 0x20(%esp) + // a4: 89 7c 24 18 movl %edi, 0x18(%esp) + // a8: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // ac: 83 c4 04 addl $0x4, %esp + // af: 5e popl %esi + // b0: 5f popl %edi + // b1: 5b popl %ebx + // b2: 5d popl %ebp + // b3: e9 00 00 00 00 jmp 0xb8 <__JIT_ENTRY+0xb8> + // 000000b4: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[184] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x70, 0xf8, 0x8b, + 0x58, 0xfc, 0x89, 0x47, 0x20, 0x53, 0x56, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x8b, + 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, 0x74, 0x1e, + 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x2b, 0x49, 0x89, 0x0b, 0x75, 0x26, 0x53, + 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x83, 0xc4, 0x04, 0xeb, 0x17, 0x56, 0x89, + 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, + 0x83, 0xc4, 0x04, 0x8b, 0x0b, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7e, 0xd5, 0x85, 0xc0, 0x74, + 0x21, 0x89, 0x45, 0xf8, 0x83, 0xc5, 0xfc, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x6c, + 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc5, 0xf8, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x6c, 0x24, 0x1c, 0x83, 0xc4, 0x04, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x20, (uintptr_t)&PyObject_Format + -0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x96, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xb4, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__FOR_ITER_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_GEN_FRAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 54 24 1c movl 0x1c(%esp), %edx + // 8: 8b 4c 24 18 movl 0x18(%esp), %ecx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 71 fc movl -0x4(%ecx), %esi + // 13: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000016: IMAGE_REL_I386_DIR32 _PyGen_Type + // 1a: 75 06 jne 0x22 <__JIT_ENTRY+0x22> + // 1c: 80 7e 23 00 cmpb $0x0, 0x23(%esi) + // 20: 78 15 js 0x37 <__JIT_ENTRY+0x37> + // 22: 89 54 24 1c movl %edx, 0x1c(%esp) + // 26: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 2a: 89 44 24 14 movl %eax, 0x14(%esp) + // 2e: 5e popl %esi + // 2f: 5f popl %edi + // 30: 5b popl %ebx + // 31: 5d popl %ebp + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 37: 8d 7e 24 leal 0x24(%esi), %edi + // 3a: 8b 5e 44 movl 0x44(%esi), %ebx + // 3d: c7 03 00 00 00 00 movl $0x0, (%ebx) + // 0000003f: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 43: 83 46 44 04 addl $0x4, 0x44(%esi) + // 47: c6 46 23 00 movb $0x0, 0x23(%esi) + // 4b: 8b 5a 4c movl 0x4c(%edx), %ebx + // 4e: 8d 6e 14 leal 0x14(%esi), %ebp + // 51: 89 5e 18 movl %ebx, 0x18(%esi) + // 54: 89 6a 4c movl %ebp, 0x4c(%edx) + // 57: 89 46 28 movl %eax, 0x28(%esi) + // 5a: 8d 35 02 00 00 00 leal 0x2, %esi + // 0000005c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 60: 66 89 70 24 movw %si, 0x24(%eax) + // 64: 89 39 movl %edi, (%ecx) + // 66: 83 c1 04 addl $0x4, %ecx + // 69: 89 54 24 1c movl %edx, 0x1c(%esp) + // 6d: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 71: 89 44 24 14 movl %eax, 0x14(%esp) + // 75: 5e popl %esi + // 76: 5f popl %edi + // 77: 5b popl %ebx + // 78: 5d popl %ebp + // 79: e9 00 00 00 00 jmp 0x7e <__JIT_ENTRY+0x7e> + // 0000007a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[121] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x54, 0x24, 0x1c, + 0x8b, 0x4c, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x71, 0xfc, 0x81, 0x7e, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x06, 0x80, 0x7e, 0x23, 0x00, + 0x78, 0x15, 0x89, 0x54, 0x24, 0x1c, 0x89, 0x4c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8d, + 0x7e, 0x24, 0x8b, 0x5e, 0x44, 0xc7, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x83, 0x46, 0x44, 0x04, 0xc6, + 0x46, 0x23, 0x00, 0x8b, 0x5a, 0x4c, 0x8d, 0x6e, + 0x14, 0x89, 0x5e, 0x18, 0x89, 0x6a, 0x4c, 0x89, + 0x46, 0x28, 0x8d, 0x35, 0x02, 0x00, 0x00, 0x00, + 0x66, 0x89, 0x70, 0x24, 0x89, 0x39, 0x83, 0xc1, + 0x04, 0x89, 0x54, 0x24, 0x1c, 0x89, 0x4c, 0x24, + 0x18, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&PyGen_Type); + patch_x86_64_32rx(code + 0x33, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x3f, (uintptr_t)&_Py_NoneStruct); + patch_32(code + 0x5c, instruction->oparg + 0x2); +} + +void +emit__FOR_ITER_TIER_TWO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_TIER_TWO.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: 8b 48 fc movl -0x4(%eax), %ecx + // 11: 89 46 20 movl %eax, 0x20(%esi) + // 14: 8b 41 04 movl 0x4(%ecx), %eax + // 17: 51 pushl %ecx + // 18: ff 50 70 calll *0x70(%eax) + // 1b: 83 c4 04 addl $0x4, %esp + // 1e: 8b 4e 20 movl 0x20(%esi), %ecx + // 21: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 28: 85 c0 testl %eax, %eax + // 2a: 74 18 je 0x44 <__JIT_ENTRY+0x44> + // 2c: 89 01 movl %eax, (%ecx) + // 2e: 83 c1 04 addl $0x4, %ecx + // 31: 89 7c 24 14 movl %edi, 0x14(%esp) + // 35: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 39: 89 74 24 0c movl %esi, 0xc(%esp) + // 3d: 5e popl %esi + // 3e: 5f popl %edi + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 00000040: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 44: 8b 47 48 movl 0x48(%edi), %eax + // 47: 85 c0 testl %eax, %eax + // 49: 74 49 je 0x94 <__JIT_ENTRY+0x94> + // 4b: 83 78 04 00 cmpl $0x0, 0x4(%eax) + // 4f: 74 43 je 0x94 <__JIT_ENTRY+0x94> + // 51: 89 4e 20 movl %ecx, 0x20(%esi) + // 54: ff 35 00 00 00 00 pushl 0x0 + // 00000056: IMAGE_REL_I386_DIR32 _PyExc_StopIteration + // 5a: 57 pushl %edi + // 5b: e8 00 00 00 00 calll 0x60 <__JIT_ENTRY+0x60> + // 0000005c: IMAGE_REL_I386_REL32 __PyErr_ExceptionMatches + // 60: 83 c4 08 addl $0x8, %esp + // 63: 8b 4e 20 movl 0x20(%esi), %ecx + // 66: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 6d: 85 c0 testl %eax, %eax + // 6f: 74 36 je 0xa7 <__JIT_ENTRY+0xa7> + // 71: 89 4e 20 movl %ecx, 0x20(%esi) + // 74: ff 76 1c pushl 0x1c(%esi) + // 77: 56 pushl %esi + // 78: 57 pushl %edi + // 79: e8 00 00 00 00 calll 0x7e <__JIT_ENTRY+0x7e> + // 0000007a: IMAGE_REL_I386_REL32 __PyEval_MonitorRaise + // 7e: 83 c4 0c addl $0xc, %esp + // 81: 57 pushl %edi + // 82: e8 00 00 00 00 calll 0x87 <__JIT_ENTRY+0x87> + // 00000083: IMAGE_REL_I386_REL32 __PyErr_Clear + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 4e 20 movl 0x20(%esi), %ecx + // 8d: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 94: 89 7c 24 14 movl %edi, 0x14(%esp) + // 98: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 9c: 89 74 24 0c movl %esi, 0xc(%esp) + // a0: 5e popl %esi + // a1: 5f popl %edi + // a2: e9 00 00 00 00 jmp 0xa7 <__JIT_ENTRY+0xa7> + // 000000a3: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // a7: 89 7c 24 14 movl %edi, 0x14(%esp) + // ab: 89 4c 24 10 movl %ecx, 0x10(%esp) + // af: 89 74 24 0c movl %esi, 0xc(%esp) + // b3: 5e popl %esi + // b4: 5f popl %edi + // b5: e9 00 00 00 00 jmp 0xba <__JIT_ENTRY+0xba> + // 000000b6: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[186] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x48, + 0xfc, 0x89, 0x46, 0x20, 0x8b, 0x41, 0x04, 0x51, + 0xff, 0x50, 0x70, 0x83, 0xc4, 0x04, 0x8b, 0x4e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x18, 0x89, 0x01, 0x83, 0xc1, + 0x04, 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x47, 0x48, 0x85, + 0xc0, 0x74, 0x49, 0x83, 0x78, 0x04, 0x00, 0x74, + 0x43, 0x89, 0x4e, 0x20, 0xff, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x4e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x36, 0x89, 0x4e, 0x20, 0xff, 0x76, 0x1c, 0x56, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x0c, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, + 0x89, 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, + 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x40, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x56, (uintptr_t)&PyExc_StopIteration); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)&_PyErr_ExceptionMatches + -0x4); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)&_PyEval_MonitorRaise + -0x4); + patch_x86_64_32rx(code + 0x83, (uintptr_t)&_PyErr_Clear + -0x4); + patch_x86_64_32rx(code + 0xa3, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xb6, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_AITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AITER.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 44 24 18 movl 0x18(%esp), %eax + // c: 8b 7c 24 14 movl 0x14(%esp), %edi + // 10: 8b 68 fc movl -0x4(%eax), %ebp + // 13: 8b 4d 04 movl 0x4(%ebp), %ecx + // 16: 8b 51 28 movl 0x28(%ecx), %edx + // 19: 85 d2 testl %edx, %edx + // 1b: 74 5b je 0x78 <__JIT_ENTRY+0x78> + // 1d: 8b 52 04 movl 0x4(%edx), %edx + // 20: 85 d2 testl %edx, %edx + // 22: 74 54 je 0x78 <__JIT_ENTRY+0x78> + // 24: 89 47 20 movl %eax, 0x20(%edi) + // 27: 55 pushl %ebp + // 28: ff d2 calll *%edx + // 2a: 83 c4 04 addl $0x4, %esp + // 2d: 8b 77 20 movl 0x20(%edi), %esi + // 30: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 37: 8b 4d 00 movl (%ebp), %ecx + // 3a: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 40: 7f 0a jg 0x4c <__JIT_ENTRY+0x4c> + // 42: 49 decl %ecx + // 43: 89 4d 00 movl %ecx, (%ebp) + // 46: 0f 84 d4 00 00 00 je 0x120 <__JIT_ENTRY+0x120> + // 4c: 85 c0 testl %eax, %eax + // 4e: 74 65 je 0xb5 <__JIT_ENTRY+0xb5> + // 50: 8b 48 04 movl 0x4(%eax), %ecx + // 53: 8b 49 28 movl 0x28(%ecx), %ecx + // 56: 85 c9 testl %ecx, %ecx + // 58: 74 73 je 0xcd <__JIT_ENTRY+0xcd> + // 5a: 83 79 08 00 cmpl $0x0, 0x8(%ecx) + // 5e: 74 6d je 0xcd <__JIT_ENTRY+0xcd> + // 60: 89 46 fc movl %eax, -0x4(%esi) + // 63: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 67: 89 74 24 18 movl %esi, 0x18(%esp) + // 6b: 89 7c 24 14 movl %edi, 0x14(%esp) + // 6f: 5e popl %esi + // 70: 5f popl %edi + // 71: 5b popl %ebx + // 72: 5d popl %ebp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 00000074: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 78: 89 47 20 movl %eax, 0x20(%edi) + // 7b: ff 71 0c pushl 0xc(%ecx) + // 7e: 68 00 00 00 00 pushl $0x0 + // 0000007f: IMAGE_REL_I386_DIR32 ??_C@_0EB@HAIFCLCF@?8async?5for?8?5requires?5an?5object?5w@ + // 83: ff 35 00 00 00 00 pushl 0x0 + // 00000085: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // 89: 53 pushl %ebx + // 8a: e8 00 00 00 00 calll 0x8f <__JIT_ENTRY+0x8f> + // 0000008b: IMAGE_REL_I386_REL32 __PyErr_Format + // 8f: 83 c4 10 addl $0x10, %esp + // 92: 8b 77 20 movl 0x20(%edi), %esi + // 95: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 9c: 8b 45 00 movl (%ebp), %eax + // 9f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // a4: 7f 0f jg 0xb5 <__JIT_ENTRY+0xb5> + // a6: 48 decl %eax + // a7: 89 45 00 movl %eax, (%ebp) + // aa: 75 09 jne 0xb5 <__JIT_ENTRY+0xb5> + // ac: 55 pushl %ebp + // ad: e8 00 00 00 00 calll 0xb2 <__JIT_ENTRY+0xb2> + // 000000ae: IMAGE_REL_I386_REL32 __Py_Dealloc + // b2: 83 c4 04 addl $0x4, %esp + // b5: 83 c6 fc addl $-0x4, %esi + // b8: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // bc: 89 7c 24 14 movl %edi, 0x14(%esp) + // c0: 89 74 24 18 movl %esi, 0x18(%esp) + // c4: 5e popl %esi + // c5: 5f popl %edi + // c6: 5b popl %ebx + // c7: 5d popl %ebp + // c8: e9 00 00 00 00 jmp 0xcd <__JIT_ENTRY+0xcd> + // 000000c9: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // cd: 83 c6 fc addl $-0x4, %esi + // d0: 89 77 20 movl %esi, 0x20(%edi) + // d3: 8b 48 04 movl 0x4(%eax), %ecx + // d6: ff 71 0c pushl 0xc(%ecx) + // d9: 68 00 00 00 00 pushl $0x0 + // 000000da: IMAGE_REL_I386_DIR32 ??_C@_0FI@MHPMLJOA@?8async?5for?8?5received?5an?5object?5f@ + // de: ff 35 00 00 00 00 pushl 0x0 + // 000000e0: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // e4: 53 pushl %ebx + // e5: 89 c6 movl %eax, %esi + // e7: e8 00 00 00 00 calll 0xec <__JIT_ENTRY+0xec> + // 000000e8: IMAGE_REL_I386_REL32 __PyErr_Format + // ec: 83 c4 10 addl $0x10, %esp + // ef: 8b 06 movl (%esi), %eax + // f1: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // f6: 7f 10 jg 0x108 <__JIT_ENTRY+0x108> + // f8: 89 f1 movl %esi, %ecx + // fa: 48 decl %eax + // fb: 89 06 movl %eax, (%esi) + // fd: 75 09 jne 0x108 <__JIT_ENTRY+0x108> + // ff: 51 pushl %ecx + // 100: e8 00 00 00 00 calll 0x105 <__JIT_ENTRY+0x105> + // 00000101: IMAGE_REL_I386_REL32 __Py_Dealloc + // 105: 83 c4 04 addl $0x4, %esp + // 108: 8b 47 20 movl 0x20(%edi), %eax + // 10b: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 112: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 116: 89 44 24 18 movl %eax, 0x18(%esp) + // 11a: 89 7c 24 14 movl %edi, 0x14(%esp) + // 11e: eb a4 jmp 0xc4 <__JIT_ENTRY+0xc4> + // 120: 55 pushl %ebp + // 121: 89 c5 movl %eax, %ebp + // 123: e8 00 00 00 00 calll 0x128 <__JIT_ENTRY+0x128> + // 00000124: IMAGE_REL_I386_REL32 __Py_Dealloc + // 128: 89 e8 movl %ebp, %eax + // 12a: 83 c4 04 addl $0x4, %esp + // 12d: 85 c0 testl %eax, %eax + // 12f: 0f 85 1b ff ff ff jne 0x50 <__JIT_ENTRY+0x50> + // 135: e9 7b ff ff ff jmp 0xb5 <__JIT_ENTRY+0xb5> + const unsigned char code_body[314] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x44, 0x24, 0x18, 0x8b, 0x7c, 0x24, 0x14, + 0x8b, 0x68, 0xfc, 0x8b, 0x4d, 0x04, 0x8b, 0x51, + 0x28, 0x85, 0xd2, 0x74, 0x5b, 0x8b, 0x52, 0x04, + 0x85, 0xd2, 0x74, 0x54, 0x89, 0x47, 0x20, 0x55, + 0xff, 0xd2, 0x83, 0xc4, 0x04, 0x8b, 0x77, 0x20, + 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0a, 0x49, 0x89, 0x4d, 0x00, 0x0f, 0x84, + 0xd4, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x65, + 0x8b, 0x48, 0x04, 0x8b, 0x49, 0x28, 0x85, 0xc9, + 0x74, 0x73, 0x83, 0x79, 0x08, 0x00, 0x74, 0x6d, + 0x89, 0x46, 0xfc, 0x89, 0x5c, 0x24, 0x1c, 0x89, + 0x74, 0x24, 0x18, 0x89, 0x7c, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x47, 0x20, 0xff, 0x71, 0x0c, 0x68, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x10, 0x8b, 0x77, 0x20, 0xc7, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0f, 0x48, 0x89, + 0x45, 0x00, 0x75, 0x09, 0x55, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x83, 0xc6, 0xfc, + 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x18, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc6, 0xfc, + 0x89, 0x77, 0x20, 0x8b, 0x48, 0x04, 0xff, 0x71, + 0x0c, 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x89, 0xc6, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x10, 0x8b, + 0x06, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x10, + 0x89, 0xf1, 0x48, 0x89, 0x06, 0x75, 0x09, 0x51, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x47, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x44, + 0x24, 0x18, 0x89, 0x7c, 0x24, 0x14, 0xeb, 0xa4, + 0x55, 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xe8, 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x0f, + 0x85, 0x1b, 0xff, 0xff, 0xff, 0xe9, 0x7b, 0xff, + 0xff, 0xff, + }; + // 0: "'async for' requires an object with __aiter__ method, got %.100s\x00'async for' received an object from __aiter__ that does not implement __anext__: %.100s\x00" + // 99: 00 00 00 00 00 00 00 + const unsigned char data_body[160] = { + 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x5f, 0x5f, 0x61, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x5f, 0x5f, 0x61, + 0x69, 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, + 0x3a, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x74, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x7f, (uintptr_t)data); + patch_32(code + 0x85, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0xae, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc9, state->instruction_starts[instruction->error_target] + -0x4); + patch_32(code + 0xda, (uintptr_t)data + 0x41); + patch_32(code + 0xe0, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0xe8, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0x101, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x124, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__GET_ANEXT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ANEXT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: 8b 48 fc movl -0x4(%eax), %ecx + // 11: 89 46 20 movl %eax, 0x20(%esi) + // 14: 51 pushl %ecx + // 15: e8 00 00 00 00 calll 0x1a <__JIT_ENTRY+0x1a> + // 00000016: IMAGE_REL_I386_REL32 __PyEval_GetANext + // 1a: 83 c4 04 addl $0x4, %esp + // 1d: 8b 4e 20 movl 0x20(%esi), %ecx + // 20: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 27: 85 c0 testl %eax, %eax + // 29: 74 18 je 0x43 <__JIT_ENTRY+0x43> + // 2b: 89 01 movl %eax, (%ecx) + // 2d: 83 c1 04 addl $0x4, %ecx + // 30: 89 7c 24 14 movl %edi, 0x14(%esp) + // 34: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 38: 89 74 24 0c movl %esi, 0xc(%esp) + // 3c: 5e popl %esi + // 3d: 5f popl %edi + // 3e: e9 00 00 00 00 jmp 0x43 <__JIT_ENTRY+0x43> + // 0000003f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[86] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x48, + 0xfc, 0x89, 0x46, 0x20, 0x51, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x4e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x18, 0x89, 0x01, 0x83, 0xc1, 0x04, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)&_PyEval_GetANext + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x52, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_AWAITABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AWAITABLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c9 movzwl %cx, %ecx + // 18: 8b 68 fc movl -0x4(%eax), %ebp + // 1b: 89 46 20 movl %eax, 0x20(%esi) + // 1e: 51 pushl %ecx + // 1f: 55 pushl %ebp + // 20: e8 00 00 00 00 calll 0x25 <__JIT_ENTRY+0x25> + // 00000021: IMAGE_REL_I386_REL32 __PyEval_GetAwaitable + // 25: 83 c4 08 addl $0x8, %esp + // 28: 8b 5e 20 movl 0x20(%esi), %ebx + // 2b: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 32: 8b 4d 00 movl (%ebp), %ecx + // 35: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3b: 7f 06 jg 0x43 <__JIT_ENTRY+0x43> + // 3d: 49 decl %ecx + // 3e: 89 4d 00 movl %ecx, (%ebp) + // 41: 74 1c je 0x5f <__JIT_ENTRY+0x5f> + // 43: 85 c0 testl %eax, %eax + // 45: 74 29 je 0x70 <__JIT_ENTRY+0x70> + // 47: 89 43 fc movl %eax, -0x4(%ebx) + // 4a: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 4e: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 52: 89 74 24 14 movl %esi, 0x14(%esp) + // 56: 5e popl %esi + // 57: 5f popl %edi + // 58: 5b popl %ebx + // 59: 5d popl %ebp + // 5a: e9 00 00 00 00 jmp 0x5f <__JIT_ENTRY+0x5f> + // 0000005b: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5f: 55 pushl %ebp + // 60: 89 c5 movl %eax, %ebp + // 62: e8 00 00 00 00 calll 0x67 <__JIT_ENTRY+0x67> + // 00000063: IMAGE_REL_I386_REL32 __Py_Dealloc + // 67: 89 e8 movl %ebp, %eax + // 69: 83 c4 04 addl $0x4, %esp + // 6c: 85 c0 testl %eax, %eax + // 6e: 75 d7 jne 0x47 <__JIT_ENTRY+0x47> + // 70: 83 c3 fc addl $-0x4, %ebx + // 73: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 77: 89 74 24 14 movl %esi, 0x14(%esp) + // 7b: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 7f: 5e popl %esi + // 80: 5f popl %edi + // 81: 5b popl %ebx + // 82: 5d popl %ebp + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 00000084: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[136] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x8b, 0x68, 0xfc, 0x89, 0x46, 0x20, 0x51, 0x55, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x8b, 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, 0x4d, + 0x00, 0x74, 0x1c, 0x85, 0xc0, 0x74, 0x29, 0x89, + 0x43, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x5c, + 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, + 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xe8, 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x75, 0xd7, + 0x83, 0xc3, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x74, 0x24, 0x14, 0x89, 0x5c, 0x24, 0x18, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x21, (uintptr_t)&_PyEval_GetAwaitable + -0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x84, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ITER.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: 8b 68 fc movl -0x4(%eax), %ebp + // 13: 89 46 20 movl %eax, 0x20(%esi) + // 16: 55 pushl %ebp + // 17: e8 00 00 00 00 calll 0x1c <__JIT_ENTRY+0x1c> + // 00000018: IMAGE_REL_I386_REL32 _PyObject_GetIter + // 1c: 83 c4 04 addl $0x4, %esp + // 1f: 8b 5e 20 movl 0x20(%esi), %ebx + // 22: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 29: 8b 4d 00 movl (%ebp), %ecx + // 2c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 32: 7f 06 jg 0x3a <__JIT_ENTRY+0x3a> + // 34: 49 decl %ecx + // 35: 89 4d 00 movl %ecx, (%ebp) + // 38: 74 1c je 0x56 <__JIT_ENTRY+0x56> + // 3a: 85 c0 testl %eax, %eax + // 3c: 74 29 je 0x67 <__JIT_ENTRY+0x67> + // 3e: 89 43 fc movl %eax, -0x4(%ebx) + // 41: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 45: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 49: 89 74 24 14 movl %esi, 0x14(%esp) + // 4d: 5e popl %esi + // 4e: 5f popl %edi + // 4f: 5b popl %ebx + // 50: 5d popl %ebp + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 56: 55 pushl %ebp + // 57: 89 c5 movl %eax, %ebp + // 59: e8 00 00 00 00 calll 0x5e <__JIT_ENTRY+0x5e> + // 0000005a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5e: 89 e8 movl %ebp, %eax + // 60: 83 c4 04 addl $0x4, %esp + // 63: 85 c0 testl %eax, %eax + // 65: 75 d7 jne 0x3e <__JIT_ENTRY+0x3e> + // 67: 83 c3 fc addl $-0x4, %ebx + // 6a: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 6e: 89 74 24 14 movl %esi, 0x14(%esp) + // 72: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 76: 5e popl %esi + // 77: 5f popl %edi + // 78: 5b popl %ebx + // 79: 5d popl %ebp + // 7a: e9 00 00 00 00 jmp 0x7f <__JIT_ENTRY+0x7f> + // 0000007b: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[127] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0x8b, 0x68, 0xfc, 0x89, 0x46, 0x20, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, 0x4d, 0x00, + 0x74, 0x1c, 0x85, 0xc0, 0x74, 0x29, 0x89, 0x43, + 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x5c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x89, + 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xe8, + 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x75, 0xd7, 0x83, + 0xc3, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x74, + 0x24, 0x14, 0x89, 0x5c, 0x24, 0x18, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)&PyObject_GetIter + -0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x7b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_LEN.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 44 24 14 movl 0x14(%esp), %eax + // f: 8b 48 fc movl -0x4(%eax), %ecx + // 12: 89 46 20 movl %eax, 0x20(%esi) + // 15: 51 pushl %ecx + // 16: e8 00 00 00 00 calll 0x1b <__JIT_ENTRY+0x1b> + // 00000017: IMAGE_REL_I386_REL32 _PyObject_Size + // 1b: 83 c4 04 addl $0x4, %esp + // 1e: 8b 5e 20 movl 0x20(%esi), %ebx + // 21: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 28: 85 c0 testl %eax, %eax + // 2a: 78 26 js 0x52 <__JIT_ENTRY+0x52> + // 2c: 50 pushl %eax + // 2d: e8 00 00 00 00 calll 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 _PyLong_FromSsize_t + // 32: 83 c4 04 addl $0x4, %esp + // 35: 85 c0 testl %eax, %eax + // 37: 74 19 je 0x52 <__JIT_ENTRY+0x52> + // 39: 89 03 movl %eax, (%ebx) + // 3b: 83 c3 04 addl $0x4, %ebx + // 3e: 89 7c 24 18 movl %edi, 0x18(%esp) + // 42: 89 5c 24 14 movl %ebx, 0x14(%esp) + // 46: 89 74 24 10 movl %esi, 0x10(%esp) + // 4a: 5e popl %esi + // 4b: 5f popl %edi + // 4c: 5b popl %ebx + // 4d: e9 00 00 00 00 jmp 0x52 <__JIT_ENTRY+0x52> + // 0000004e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 52: 89 7c 24 18 movl %edi, 0x18(%esp) + // 56: 89 5c 24 14 movl %ebx, 0x14(%esp) + // 5a: 89 74 24 10 movl %esi, 0x10(%esp) + // 5e: 5e popl %esi + // 5f: 5f popl %edi + // 60: 5b popl %ebx + // 61: e9 00 00 00 00 jmp 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[102] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x44, 0x24, 0x14, 0x8b, + 0x48, 0xfc, 0x89, 0x46, 0x20, 0x51, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x5e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x26, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x74, + 0x19, 0x89, 0x03, 0x83, 0xc3, 0x04, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x5c, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x5c, + 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, + 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)&PyObject_Size + -0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)&PyLong_FromSsize_t + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x62, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_YIELD_FROM_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_YIELD_FROM_ITER.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 5c 24 18 movl 0x18(%esp), %ebx + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 6b fc movl -0x4(%ebx), %ebp + // 13: 8b 45 04 movl 0x4(%ebp), %eax + // 16: 3d 00 00 00 00 cmpl $0x0, %eax + // 00000017: IMAGE_REL_I386_DIR32 _PyCoro_Type + // 1b: 74 36 je 0x53 <__JIT_ENTRY+0x53> + // 1d: 3d 00 00 00 00 cmpl $0x0, %eax + // 0000001e: IMAGE_REL_I386_DIR32 _PyGen_Type + // 22: 74 3c je 0x60 <__JIT_ENTRY+0x60> + // 24: 89 5e 20 movl %ebx, 0x20(%esi) + // 27: 55 pushl %ebp + // 28: e8 00 00 00 00 calll 0x2d <__JIT_ENTRY+0x2d> + // 00000029: IMAGE_REL_I386_REL32 _PyObject_GetIter + // 2d: 83 c4 04 addl $0x4, %esp + // 30: 8b 5e 20 movl 0x20(%esi), %ebx + // 33: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3a: 85 c0 testl %eax, %eax + // 3c: 74 3a je 0x78 <__JIT_ENTRY+0x78> + // 3e: 8b 4d 00 movl (%ebp), %ecx + // 41: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 47: 7f 06 jg 0x4f <__JIT_ENTRY+0x4f> + // 49: 49 decl %ecx + // 4a: 89 4d 00 movl %ecx, (%ebp) + // 4d: 74 69 je 0xb8 <__JIT_ENTRY+0xb8> + // 4f: 89 c5 movl %eax, %ebp + // 51: eb 0d jmp 0x60 <__JIT_ENTRY+0x60> + // 53: 8b 06 movl (%esi), %eax + // 55: 0f b7 40 18 movzwl 0x18(%eax), %eax + // 59: a9 80 01 00 00 testl $0x180, %eax # imm = 0x180 + // 5e: 74 22 je 0x82 <__JIT_ENTRY+0x82> + // 60: 89 6b fc movl %ebp, -0x4(%ebx) + // 63: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 67: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 6b: 89 74 24 14 movl %esi, 0x14(%esp) + // 6f: 5e popl %esi + // 70: 5f popl %edi + // 71: 5b popl %ebx + // 72: 5d popl %ebp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 00000074: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 78: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 7c: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 80: eb 29 jmp 0xab <__JIT_ENTRY+0xab> + // 82: 89 5e 20 movl %ebx, 0x20(%esi) + // 85: 68 00 00 00 00 pushl $0x0 + // 00000086: IMAGE_REL_I386_DIR32 ??_C@_0EE@OKAKFBDN@cannot?5?8yield?5from?8?5a?5coroutine?5@ + // 8a: ff 35 00 00 00 00 pushl 0x0 + // 0000008c: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // 90: 57 pushl %edi + // 91: e8 00 00 00 00 calll 0x96 <__JIT_ENTRY+0x96> + // 00000092: IMAGE_REL_I386_REL32 __PyErr_SetString + // 96: 83 c4 0c addl $0xc, %esp + // 99: 8b 46 20 movl 0x20(%esi), %eax + // 9c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // a3: 89 7c 24 1c movl %edi, 0x1c(%esp) + // a7: 89 44 24 18 movl %eax, 0x18(%esp) + // ab: 89 74 24 14 movl %esi, 0x14(%esp) + // af: 5e popl %esi + // b0: 5f popl %edi + // b1: 5b popl %ebx + // b2: 5d popl %ebp + // b3: e9 00 00 00 00 jmp 0xb8 <__JIT_ENTRY+0xb8> + // 000000b4: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // b8: 55 pushl %ebp + // b9: 89 c5 movl %eax, %ebp + // bb: e8 00 00 00 00 calll 0xc0 <__JIT_ENTRY+0xc0> + // 000000bc: IMAGE_REL_I386_REL32 __Py_Dealloc + // c0: 83 c4 04 addl $0x4, %esp + // c3: eb 9b jmp 0x60 <__JIT_ENTRY+0x60> + const unsigned char code_body[197] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x5c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x6b, 0xfc, 0x8b, 0x45, 0x04, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x36, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x3c, 0x89, 0x5e, 0x20, 0x55, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x74, 0x3a, 0x8b, 0x4d, + 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x06, 0x49, 0x89, 0x4d, 0x00, 0x74, 0x69, 0x89, + 0xc5, 0xeb, 0x0d, 0x8b, 0x06, 0x0f, 0xb7, 0x40, + 0x18, 0xa9, 0x80, 0x01, 0x00, 0x00, 0x74, 0x22, + 0x89, 0x6b, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x5c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x5c, 0x24, 0x18, + 0xeb, 0x29, 0x89, 0x5e, 0x20, 0x68, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x0c, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x44, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0xeb, 0x9b, + }; + // 0: "cannot 'yield from' a coroutine object in a non-coroutine generator\x00" + // 44: 00 00 00 00 + const unsigned char data_body[72] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x27, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, (uintptr_t)&PyCoro_Type); + patch_32(code + 0x1e, (uintptr_t)&PyGen_Type); + patch_x86_64_32rx(code + 0x29, (uintptr_t)&PyObject_GetIter + -0x4); + patch_x86_64_32rx(code + 0x74, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x86, (uintptr_t)data); + patch_32(code + 0x8c, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0x92, (uintptr_t)&_PyErr_SetString + -0x4); + patch_x86_64_32rx(code + 0xb4, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xbc, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__GUARD_BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BINARY_OP_EXTEND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: 8b 48 f8 movl -0x8(%eax), %ecx + // 11: 8b 50 fc movl -0x4(%eax), %edx + // 14: 89 46 20 movl %eax, 0x20(%esi) + // 17: 52 pushl %edx + // 18: 51 pushl %ecx + // 19: ff 15 04 00 00 00 calll *0x4 + // 0000001b: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1f: 83 c4 08 addl $0x8, %esp + // 22: 8b 4e 20 movl 0x20(%esi), %ecx + // 25: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 2c: 85 c0 testl %eax, %eax + // 2e: 74 13 je 0x43 <__JIT_ENTRY+0x43> + // 30: 89 7c 24 14 movl %edi, 0x14(%esp) + // 34: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 38: 89 74 24 0c movl %esi, 0xc(%esp) + // 3c: 5e popl %esi + // 3d: 5f popl %edi + // 3e: e9 00 00 00 00 jmp 0x43 <__JIT_ENTRY+0x43> + // 0000003f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[86] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x48, + 0xf8, 0x8b, 0x50, 0xfc, 0x89, 0x46, 0x20, 0x52, + 0x51, 0xff, 0x15, 0x04, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x13, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1b, (instruction->operand0 & UINT32_MAX) + 0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x52, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BOTH_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 f8 movl -0x8(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyFloat_Type + // 17: 75 0c jne 0x25 <__JIT_ENTRY+0x25> + // 19: 8b 71 fc movl -0x4(%ecx), %esi + // 1c: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 0000001f: IMAGE_REL_I386_DIR32 _PyFloat_Type + // 23: 74 12 je 0x37 <__JIT_ENTRY+0x37> + // 25: 89 54 24 10 movl %edx, 0x10(%esp) + // 29: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2d: 89 44 24 08 movl %eax, 0x8(%esp) + // 31: 5e popl %esi + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 37: 89 54 24 10 movl %edx, 0x10(%esp) + // 3b: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 3f: 89 44 24 08 movl %eax, 0x8(%esp) + // 43: 5e popl %esi + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 00000045: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[68] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xf8, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x0c, 0x8b, 0x71, 0xfc, 0x81, 0x7e, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x12, 0x89, 0x54, 0x24, + 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, + 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, + 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyFloat_Type); + patch_32(code + 0x1f, (uintptr_t)&PyFloat_Type); + patch_x86_64_32rx(code + 0x33, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BOTH_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 f8 movl -0x8(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyLong_Type + // 17: 75 0c jne 0x25 <__JIT_ENTRY+0x25> + // 19: 8b 71 fc movl -0x4(%ecx), %esi + // 1c: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 0000001f: IMAGE_REL_I386_DIR32 _PyLong_Type + // 23: 74 12 je 0x37 <__JIT_ENTRY+0x37> + // 25: 89 54 24 10 movl %edx, 0x10(%esp) + // 29: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2d: 89 44 24 08 movl %eax, 0x8(%esp) + // 31: 5e popl %esi + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 37: 89 54 24 10 movl %edx, 0x10(%esp) + // 3b: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 3f: 89 44 24 08 movl %eax, 0x8(%esp) + // 43: 5e popl %esi + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 00000045: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[68] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xf8, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x0c, 0x8b, 0x71, 0xfc, 0x81, 0x7e, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x12, 0x89, 0x54, 0x24, + 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, + 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, + 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyLong_Type); + patch_32(code + 0x1f, (uintptr_t)&PyLong_Type); + patch_x86_64_32rx(code + 0x33, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BOTH_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_UNICODE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 f8 movl -0x8(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyUnicode_Type + // 17: 75 0c jne 0x25 <__JIT_ENTRY+0x25> + // 19: 8b 71 fc movl -0x4(%ecx), %esi + // 1c: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 0000001f: IMAGE_REL_I386_DIR32 _PyUnicode_Type + // 23: 74 12 je 0x37 <__JIT_ENTRY+0x37> + // 25: 89 54 24 10 movl %edx, 0x10(%esp) + // 29: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2d: 89 44 24 08 movl %eax, 0x8(%esp) + // 31: 5e popl %esi + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 37: 89 54 24 10 movl %edx, 0x10(%esp) + // 3b: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 3f: 89 44 24 08 movl %eax, 0x8(%esp) + // 43: 5e popl %esi + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 00000045: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[68] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xf8, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x0c, 0x8b, 0x71, 0xfc, 0x81, 0x7e, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x12, 0x89, 0x54, 0x24, + 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, + 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, + 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyUnicode_Type); + patch_32(code + 0x1f, (uintptr_t)&PyUnicode_Type); + patch_x86_64_32rx(code + 0x33, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BUILTINS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BUILTINS_VERSION_PUSH_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 10 movl 0x10(%eax), %esi + // 11: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000014: IMAGE_REL_I386_DIR32 _PyDict_Type + // 18: 75 28 jne 0x42 <__JIT_ENTRY+0x42> + // 1a: 8b 76 18 movl 0x18(%esi), %esi + // 1d: bf 00 00 00 00 movl $0x0, %edi + // 0000001e: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 22: 0f b7 ff movzwl %di, %edi + // 25: 39 7e 08 cmpl %edi, 0x8(%esi) + // 28: 75 18 jne 0x42 <__JIT_ENTRY+0x42> + // 2a: 89 31 movl %esi, (%ecx) + // 2c: 83 c1 04 addl $0x4, %ecx + // 2f: 89 54 24 14 movl %edx, 0x14(%esp) + // 33: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 37: 89 44 24 0c movl %eax, 0xc(%esp) + // 3b: 5e popl %esi + // 3c: 5f popl %edi + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 0000003e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 42: 89 54 24 14 movl %edx, 0x14(%esp) + // 46: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4a: 89 44 24 0c movl %eax, 0xc(%esp) + // 4e: 5e popl %esi + // 4f: 5f popl %edi + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[85] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x10, 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x28, 0x8b, 0x76, 0x18, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xb7, 0xff, 0x39, 0x7e, 0x08, + 0x75, 0x18, 0x89, 0x31, 0x83, 0xc1, 0x04, 0x89, + 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, (uintptr_t)&PyDict_Type); + patch_32(code + 0x1e, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x51, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_DORV_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_NO_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: 83 7e f4 00 cmpl $0x0, -0xc(%esi) + // 15: 74 13 je 0x2a <__JIT_ENTRY+0x2a> + // 17: 89 54 24 14 movl %edx, 0x14(%esp) + // 1b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 1f: 89 44 24 0c movl %eax, 0xc(%esp) + // 23: 5e popl %esi + // 24: 5f popl %edi + // 25: e9 00 00 00 00 jmp 0x2a <__JIT_ENTRY+0x2a> + // 00000026: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2a: 8b 7e 04 movl 0x4(%esi), %edi + // 2d: 8b 7f 10 movl 0x10(%edi), %edi + // 30: 80 7c 3e 03 00 cmpb $0x0, 0x3(%esi,%edi) + // 35: 74 e0 je 0x17 <__JIT_ENTRY+0x17> + // 37: 89 54 24 14 movl %edx, 0x14(%esp) + // 3b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3f: 89 44 24 0c movl %eax, 0xc(%esp) + // 43: 5e popl %esi + // 44: 5f popl %edi + // 45: e9 00 00 00 00 jmp 0x4a <__JIT_ENTRY+0x4a> + // 00000046: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[69] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0x83, 0x7e, 0xf4, 0x00, 0x74, 0x13, 0x89, + 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x7e, 0x04, 0x8b, 0x7f, 0x10, + 0x80, 0x7c, 0x3e, 0x03, 0x00, 0x74, 0xe0, 0x89, + 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: 8b 7e 04 movl 0x4(%esi), %edi + // 14: 8b 7f 10 movl 0x10(%edi), %edi + // 17: 80 7c 3e 03 00 cmpb $0x0, 0x3(%esi,%edi) + // 1c: 74 13 je 0x31 <__JIT_ENTRY+0x31> + // 1e: 89 54 24 14 movl %edx, 0x14(%esp) + // 22: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 26: 89 44 24 0c movl %eax, 0xc(%esp) + // 2a: 5e popl %esi + // 2b: 5f popl %edi + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 31: 89 54 24 14 movl %edx, 0x14(%esp) + // 35: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 39: 89 44 24 0c movl %eax, 0xc(%esp) + // 3d: 5e popl %esi + // 3e: 5f popl %edi + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 00000040: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[68] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0x8b, 0x7e, 0x04, 0x8b, 0x7f, 0x10, 0x80, + 0x7c, 0x3e, 0x03, 0x00, 0x74, 0x13, 0x89, 0x54, + 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x40, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_GLOBALS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 0c movl 0xc(%eax), %esi + // 11: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000014: IMAGE_REL_I386_DIR32 _PyDict_Type + // 18: 75 23 jne 0x3d <__JIT_ENTRY+0x3d> + // 1a: 8b 76 18 movl 0x18(%esi), %esi + // 1d: bf 00 00 00 00 movl $0x0, %edi + // 0000001e: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 22: 0f b7 ff movzwl %di, %edi + // 25: 39 7e 08 cmpl %edi, 0x8(%esi) + // 28: 75 13 jne 0x3d <__JIT_ENTRY+0x3d> + // 2a: 89 54 24 14 movl %edx, 0x14(%esp) + // 2e: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 32: 89 44 24 0c movl %eax, 0xc(%esp) + // 36: 5e popl %esi + // 37: 5f popl %edi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 3d: 89 54 24 14 movl %edx, 0x14(%esp) + // 41: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 45: 89 44 24 0c movl %eax, 0xc(%esp) + // 49: 5e popl %esi + // 4a: 5f popl %edi + // 4b: e9 00 00 00 00 jmp 0x50 <__JIT_ENTRY+0x50> + // 0000004c: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[80] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x0c, 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x23, 0x8b, 0x76, 0x18, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xb7, 0xff, 0x39, 0x7e, 0x08, + 0x75, 0x13, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, + 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, (uintptr_t)&PyDict_Type); + patch_32(code + 0x1e, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x39, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4c, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_GLOBALS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION_PUSH_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 0c movl 0xc(%eax), %esi + // 11: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000014: IMAGE_REL_I386_DIR32 _PyDict_Type + // 18: 75 28 jne 0x42 <__JIT_ENTRY+0x42> + // 1a: 8b 76 18 movl 0x18(%esi), %esi + // 1d: bf 00 00 00 00 movl $0x0, %edi + // 0000001e: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 22: 0f b7 ff movzwl %di, %edi + // 25: 39 7e 08 cmpl %edi, 0x8(%esi) + // 28: 75 18 jne 0x42 <__JIT_ENTRY+0x42> + // 2a: 89 31 movl %esi, (%ecx) + // 2c: 83 c1 04 addl $0x4, %ecx + // 2f: 89 54 24 14 movl %edx, 0x14(%esp) + // 33: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 37: 89 44 24 0c movl %eax, 0xc(%esp) + // 3b: 5e popl %esi + // 3c: 5f popl %edi + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 0000003e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 42: 89 54 24 14 movl %edx, 0x14(%esp) + // 46: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 4a: 89 44 24 0c movl %eax, 0xc(%esp) + // 4e: 5e popl %esi + // 4f: 5f popl %edi + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[85] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x0c, 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x28, 0x8b, 0x76, 0x18, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xb7, 0xff, 0x39, 0x7e, 0x08, + 0x75, 0x18, 0x89, 0x31, 0x83, 0xc1, 0x04, 0x89, + 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, (uintptr_t)&PyDict_Type); + patch_32(code + 0x1e, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x51, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_FALSE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_FALSE_POP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 4c 24 10 movl 0x10(%esp), %ecx + // 5: 8b 44 24 08 movl 0x8(%esp), %eax + // 9: 8b 74 24 0c movl 0xc(%esp), %esi + // d: 8d 56 fc leal -0x4(%esi), %edx + // 10: 81 7e fc 00 00 00 00 cmpl $0x0, -0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 1d: 89 54 24 0c movl %edx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2f: 89 54 24 0c movl %edx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x44, 0x24, + 0x08, 0x8b, 0x74, 0x24, 0x0c, 0x8d, 0x56, 0xfc, + 0x81, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x54, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&_Py_FalseStruct); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NONE_POP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 41 fc movl -0x4(%ecx), %eax + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 3d 00 00 00 00 cmpl $0x0, %eax + // 00000015: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 19: 74 38 je 0x53 <__JIT_ENTRY+0x53> + // 1b: 89 4e 20 movl %ecx, 0x20(%esi) + // 1e: 8b 08 movl (%eax), %ecx + // 20: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 26: 7f 0e jg 0x36 <__JIT_ENTRY+0x36> + // 28: 49 decl %ecx + // 29: 89 08 movl %ecx, (%eax) + // 2b: 75 09 jne 0x36 <__JIT_ENTRY+0x36> + // 2d: 50 pushl %eax + // 2e: e8 00 00 00 00 calll 0x33 <__JIT_ENTRY+0x33> + // 0000002f: IMAGE_REL_I386_REL32 __Py_Dealloc + // 33: 83 c4 04 addl $0x4, %esp + // 36: 8b 46 20 movl 0x20(%esi), %eax + // 39: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 40: 89 7c 24 14 movl %edi, 0x14(%esp) + // 44: 89 44 24 10 movl %eax, 0x10(%esp) + // 48: 89 74 24 0c movl %esi, 0xc(%esp) + // 4c: 5e popl %esi + // 4d: 5f popl %edi + // 4e: e9 00 00 00 00 jmp 0x53 <__JIT_ENTRY+0x53> + // 0000004f: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 53: 89 7c 24 14 movl %edi, 0x14(%esp) + // 57: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 5b: 89 74 24 0c movl %esi, 0xc(%esp) + // 5f: 5e popl %esi + // 60: 5f popl %edi + // 61: e9 00 00 00 00 jmp 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[97] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x41, + 0xfc, 0x83, 0xc1, 0xfc, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x38, 0x89, 0x4e, 0x20, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x4f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_NOT_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NOT_NONE_POP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 44 24 14 movl 0x14(%esp), %eax + // f: 8b 58 fc movl -0x4(%eax), %ebx + // 12: 83 c0 fc addl $-0x4, %eax + // 15: 89 46 20 movl %eax, 0x20(%esi) + // 18: 8b 03 movl (%ebx), %eax + // 1a: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 1f: 7f 05 jg 0x26 <__JIT_ENTRY+0x26> + // 21: 48 decl %eax + // 22: 89 03 movl %eax, (%ebx) + // 24: 74 26 je 0x4c <__JIT_ENTRY+0x4c> + // 26: 8b 46 20 movl 0x20(%esi), %eax + // 29: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 30: 81 fb 00 00 00 00 cmpl $0x0, %ebx + // 00000032: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 36: 74 2f je 0x67 <__JIT_ENTRY+0x67> + // 38: 89 7c 24 18 movl %edi, 0x18(%esp) + // 3c: 89 44 24 14 movl %eax, 0x14(%esp) + // 40: 89 74 24 10 movl %esi, 0x10(%esp) + // 44: 5e popl %esi + // 45: 5f popl %edi + // 46: 5b popl %ebx + // 47: e9 00 00 00 00 jmp 0x4c <__JIT_ENTRY+0x4c> + // 00000048: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 4c: 53 pushl %ebx + // 4d: e8 00 00 00 00 calll 0x52 <__JIT_ENTRY+0x52> + // 0000004e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 52: 83 c4 04 addl $0x4, %esp + // 55: 8b 46 20 movl 0x20(%esi), %eax + // 58: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 5f: 81 fb 00 00 00 00 cmpl $0x0, %ebx + // 00000061: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 65: 75 d1 jne 0x38 <__JIT_ENTRY+0x38> + // 67: 89 7c 24 18 movl %edi, 0x18(%esp) + // 6b: 89 44 24 14 movl %eax, 0x14(%esp) + // 6f: 89 74 24 10 movl %esi, 0x10(%esp) + // 73: 5e popl %esi + // 74: 5f popl %edi + // 75: 5b popl %ebx + // 76: e9 00 00 00 00 jmp 0x7b <__JIT_ENTRY+0x7b> + // 00000077: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[123] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x44, 0x24, 0x14, 0x8b, + 0x58, 0xfc, 0x83, 0xc0, 0xfc, 0x89, 0x46, 0x20, + 0x8b, 0x03, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x05, 0x48, 0x89, 0x03, 0x74, 0x26, 0x8b, 0x46, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x81, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x74, 0x2f, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xfb, 0x00, 0x00, 0x00, 0x00, 0x75, 0xd1, 0x89, + 0x7c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, + 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x32, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x48, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x61, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x77, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_TRUE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_TRUE_POP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 4c 24 10 movl 0x10(%esp), %ecx + // 5: 8b 44 24 08 movl 0x8(%esp), %eax + // 9: 8b 74 24 0c movl 0xc(%esp), %esi + // d: 8d 56 fc leal -0x4(%esi), %edx + // 10: 81 7e fc 00 00 00 00 cmpl $0x0, -0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 1d: 89 54 24 0c movl %edx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2f: 89 54 24 0c movl %edx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x44, 0x24, + 0x08, 0x8b, 0x74, 0x24, 0x0c, 0x8d, 0x56, 0xfc, + 0x81, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x54, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_KEYS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_KEYS_VERSION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 8b 76 04 movl 0x4(%esi), %esi + // 13: 8b b6 b8 01 00 00 movl 0x1b8(%esi), %esi + // 19: 81 7e 08 00 00 00 00 cmpl $0x0, 0x8(%esi) + // 0000001c: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 20: 75 12 jne 0x34 <__JIT_ENTRY+0x34> + // 22: 89 54 24 10 movl %edx, 0x10(%esp) + // 26: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2a: 89 44 24 08 movl %eax, 0x8(%esp) + // 2e: 5e popl %esi + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 00000030: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 34: 89 54 24 10 movl %edx, 0x10(%esp) + // 38: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 3c: 89 44 24 08 movl %eax, 0x8(%esp) + // 40: 5e popl %esi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[70] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x8b, 0x76, 0x04, 0x8b, 0xb6, 0xb8, 0x01, 0x00, + 0x00, 0x81, 0x7e, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, + 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, + 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, + 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1c, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x30, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x42, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 f8 movl -0x8(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyFloat_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xf8, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyFloat_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 f8 movl -0x8(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyLong_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xf8, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyLong_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_LIST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 54 24 18 movl 0x18(%esp), %edx + // 7: 8b 4c 24 14 movl 0x14(%esp), %ecx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: 8b 71 fc movl -0x4(%ecx), %esi + // 12: 8b 7e 0c movl 0xc(%esi), %edi + // 15: 85 ff testl %edi, %edi + // 17: 74 23 je 0x3c <__JIT_ENTRY+0x3c> + // 19: 8b 5e 08 movl 0x8(%esi), %ebx + // 1c: 3b 5f 08 cmpl 0x8(%edi), %ebx + // 1f: 73 14 jae 0x35 <__JIT_ENTRY+0x35> + // 21: 89 54 24 18 movl %edx, 0x18(%esp) + // 25: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 29: 89 44 24 10 movl %eax, 0x10(%esp) + // 2d: 5e popl %esi + // 2e: 5f popl %edi + // 2f: 5b popl %ebx + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 00000031: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 35: c7 46 08 ff ff ff ff movl $0xffffffff, 0x8(%esi) # imm = 0xFFFFFFFF + // 3c: 89 54 24 18 movl %edx, 0x18(%esp) + // 40: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 44: 89 44 24 10 movl %eax, 0x10(%esp) + // 48: 5e popl %esi + // 49: 5f popl %edi + // 4a: 5b popl %ebx + // 4b: e9 00 00 00 00 jmp 0x50 <__JIT_ENTRY+0x50> + // 0000004c: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[80] = { + 0x53, 0x57, 0x56, 0x8b, 0x54, 0x24, 0x18, 0x8b, + 0x4c, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0x8b, + 0x71, 0xfc, 0x8b, 0x7e, 0x0c, 0x85, 0xff, 0x74, + 0x23, 0x8b, 0x5e, 0x08, 0x3b, 0x5f, 0x08, 0x73, + 0x14, 0x89, 0x54, 0x24, 0x18, 0x89, 0x4c, 0x24, + 0x14, 0x89, 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x46, 0x08, + 0xff, 0xff, 0xff, 0xff, 0x89, 0x54, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x31, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4c, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_RANGE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 83 7e 10 00 cmpl $0x0, 0x10(%esi) + // 14: 7e 12 jle 0x28 <__JIT_ENTRY+0x28> + // 16: 89 54 24 10 movl %edx, 0x10(%esp) + // 1a: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 1e: 89 44 24 08 movl %eax, 0x8(%esp) + // 22: 5e popl %esi + // 23: e9 00 00 00 00 jmp 0x28 <__JIT_ENTRY+0x28> + // 00000024: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 28: 89 54 24 10 movl %edx, 0x10(%esp) + // 2c: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 30: 89 44 24 08 movl %eax, 0x8(%esp) + // 34: 5e popl %esi + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 00000036: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[58] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x83, 0x7e, 0x10, 0x00, 0x7e, 0x12, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, + 0x24, 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, + 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x24, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x36, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 71 fc movl -0x4(%ecx), %esi + // 11: 8b 7e 0c movl 0xc(%esi), %edi + // 14: 85 ff testl %edi, %edi + // 16: 74 1b je 0x33 <__JIT_ENTRY+0x33> + // 18: 8b 76 08 movl 0x8(%esi), %esi + // 1b: 3b 77 08 cmpl 0x8(%edi), %esi + // 1e: 7d 13 jge 0x33 <__JIT_ENTRY+0x33> + // 20: 89 54 24 14 movl %edx, 0x14(%esp) + // 24: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 28: 89 44 24 0c movl %eax, 0xc(%esp) + // 2c: 5e popl %esi + // 2d: 5f popl %edi + // 2e: e9 00 00 00 00 jmp 0x33 <__JIT_ENTRY+0x33> + // 0000002f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 33: 89 54 24 14 movl %edx, 0x14(%esp) + // 37: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3b: 89 44 24 0c movl %eax, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[70] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x71, + 0xfc, 0x8b, 0x7e, 0x0c, 0x85, 0xff, 0x74, 0x1b, + 0x8b, 0x76, 0x08, 0x3b, 0x77, 0x08, 0x7d, 0x13, + 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x42, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_FLOAT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyFloat_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyFloat_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyLong_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyLong_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TYPE_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 8b 76 04 movl 0x4(%esi), %esi + // 13: 81 be c0 00 00 00 00 00 00 00 cmpl $0x0, 0xc0(%esi) + // 00000019: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1d: 75 12 jne 0x31 <__JIT_ENTRY+0x31> + // 1f: 89 54 24 10 movl %edx, 0x10(%esp) + // 23: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 27: 89 44 24 08 movl %eax, 0x8(%esp) + // 2b: 5e popl %esi + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 31: 89 54 24 10 movl %edx, 0x10(%esp) + // 35: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 39: 89 44 24 08 movl %eax, 0x8(%esp) + // 3d: 5e popl %esi + // 3e: e9 00 00 00 00 jmp 0x43 <__JIT_ENTRY+0x43> + // 0000003f: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[67] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x8b, 0x76, 0x04, 0x81, 0xbe, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x12, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, + 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TYPE_VERSION_AND_LOCK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION_AND_LOCK.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 8b 76 04 movl 0x4(%esi), %esi + // 13: 81 be c0 00 00 00 00 00 00 00 cmpl $0x0, 0xc0(%esi) + // 00000019: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1d: 75 12 jne 0x31 <__JIT_ENTRY+0x31> + // 1f: 89 54 24 10 movl %edx, 0x10(%esp) + // 23: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 27: 89 44 24 08 movl %eax, 0x8(%esp) + // 2b: 5e popl %esi + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 31: 89 54 24 10 movl %edx, 0x10(%esp) + // 35: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 39: 89 44 24 08 movl %eax, 0x8(%esp) + // 3d: 5e popl %esi + // 3e: e9 00 00 00 00 jmp 0x43 <__JIT_ENTRY+0x43> + // 0000003f: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[67] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x8b, 0x76, 0x04, 0x81, 0xbe, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x12, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, + 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__IMPORT_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_FROM.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 44 24 14 movl 0x14(%esp), %eax + // f: b9 00 00 00 00 movl $0x0, %ecx + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 c9 movzwl %cx, %ecx + // 17: 8b 50 fc movl -0x4(%eax), %edx + // 1a: 8b 1e movl (%esi), %ebx + // 1c: 8b 5b 10 movl 0x10(%ebx), %ebx + // 1f: 8b 4c 8b 0c movl 0xc(%ebx,%ecx,4), %ecx + // 23: 89 46 20 movl %eax, 0x20(%esi) + // 26: 51 pushl %ecx + // 27: 52 pushl %edx + // 28: 57 pushl %edi + // 29: e8 00 00 00 00 calll 0x2e <__JIT_ENTRY+0x2e> + // 0000002a: IMAGE_REL_I386_REL32 __PyEval_ImportFrom + // 2e: 83 c4 0c addl $0xc, %esp + // 31: 8b 4e 20 movl 0x20(%esi), %ecx + // 34: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3b: 85 c0 testl %eax, %eax + // 3d: 74 19 je 0x58 <__JIT_ENTRY+0x58> + // 3f: 89 01 movl %eax, (%ecx) + // 41: 83 c1 04 addl $0x4, %ecx + // 44: 89 7c 24 18 movl %edi, 0x18(%esp) + // 48: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 4c: 89 74 24 10 movl %esi, 0x10(%esp) + // 50: 5e popl %esi + // 51: 5f popl %edi + // 52: 5b popl %ebx + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 58: 89 7c 24 18 movl %edi, 0x18(%esp) + // 5c: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 60: 89 74 24 10 movl %esi, 0x10(%esp) + // 64: 5e popl %esi + // 65: 5f popl %edi + // 66: 5b popl %ebx + // 67: e9 00 00 00 00 jmp 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[108] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x44, 0x24, 0x14, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, + 0x50, 0xfc, 0x8b, 0x1e, 0x8b, 0x5b, 0x10, 0x8b, + 0x4c, 0x8b, 0x0c, 0x89, 0x46, 0x20, 0x51, 0x52, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x0c, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x19, 0x89, + 0x01, 0x83, 0xc1, 0x04, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x4c, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)&_PyEval_ImportFrom + -0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x68, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__IMPORT_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_NAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 6c 24 20 movl 0x20(%esp), %ebp + // 9: 8b 7c 24 18 movl 0x18(%esp), %edi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: b9 00 00 00 00 movl $0x0, %ecx + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 16: 0f b7 c9 movzwl %cx, %ecx + // 19: 8b 70 f8 movl -0x8(%eax), %esi + // 1c: 8b 58 fc movl -0x4(%eax), %ebx + // 1f: 8b 17 movl (%edi), %edx + // 21: 8b 52 10 movl 0x10(%edx), %edx + // 24: 8b 4c 8a 0c movl 0xc(%edx,%ecx,4), %ecx + // 28: 89 47 20 movl %eax, 0x20(%edi) + // 2b: 56 pushl %esi + // 2c: 53 pushl %ebx + // 2d: 51 pushl %ecx + // 2e: 57 pushl %edi + // 2f: 89 6c 24 10 movl %ebp, 0x10(%esp) + // 33: 55 pushl %ebp + // 34: e8 00 00 00 00 calll 0x39 <__JIT_ENTRY+0x39> + // 00000035: IMAGE_REL_I386_REL32 __PyEval_ImportName + // 39: 83 c4 14 addl $0x14, %esp + // 3c: 8b 6f 20 movl 0x20(%edi), %ebp + // 3f: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 46: 8b 0e movl (%esi), %ecx + // 48: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4e: 7f 05 jg 0x55 <__JIT_ENTRY+0x55> + // 50: 49 decl %ecx + // 51: 89 0e movl %ecx, (%esi) + // 53: 74 1e je 0x73 <__JIT_ENTRY+0x73> + // 55: 8b 0b movl (%ebx), %ecx + // 57: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 5d: 7f 2b jg 0x8a <__JIT_ENTRY+0x8a> + // 5f: 49 decl %ecx + // 60: 89 0b movl %ecx, (%ebx) + // 62: 75 26 jne 0x8a <__JIT_ENTRY+0x8a> + // 64: 53 pushl %ebx + // 65: 89 c6 movl %eax, %esi + // 67: e8 00 00 00 00 calll 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6c: 89 f0 movl %esi, %eax + // 6e: 83 c4 04 addl $0x4, %esp + // 71: eb 17 jmp 0x8a <__JIT_ENTRY+0x8a> + // 73: 56 pushl %esi + // 74: 89 c6 movl %eax, %esi + // 76: e8 00 00 00 00 calll 0x7b <__JIT_ENTRY+0x7b> + // 00000077: IMAGE_REL_I386_REL32 __Py_Dealloc + // 7b: 89 f0 movl %esi, %eax + // 7d: 83 c4 04 addl $0x4, %esp + // 80: 8b 0b movl (%ebx), %ecx + // 82: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 88: 7e d5 jle 0x5f <__JIT_ENTRY+0x5f> + // 8a: 85 c0 testl %eax, %eax + // 8c: 74 21 je 0xaf <__JIT_ENTRY+0xaf> + // 8e: 89 45 f8 movl %eax, -0x8(%ebp) + // 91: 83 c5 fc addl $-0x4, %ebp + // 94: 8b 04 24 movl (%esp), %eax + // 97: 89 44 24 20 movl %eax, 0x20(%esp) + // 9b: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // 9f: 89 7c 24 18 movl %edi, 0x18(%esp) + // a3: 83 c4 04 addl $0x4, %esp + // a6: 5e popl %esi + // a7: 5f popl %edi + // a8: 5b popl %ebx + // a9: 5d popl %ebp + // aa: e9 00 00 00 00 jmp 0xaf <__JIT_ENTRY+0xaf> + // 000000ab: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // af: 83 c5 f8 addl $-0x8, %ebp + // b2: 8b 04 24 movl (%esp), %eax + // b5: 89 44 24 20 movl %eax, 0x20(%esp) + // b9: 89 7c 24 18 movl %edi, 0x18(%esp) + // bd: 89 6c 24 1c movl %ebp, 0x1c(%esp) + // c1: 83 c4 04 addl $0x4, %esp + // c4: 5e popl %esi + // c5: 5f popl %edi + // c6: 5b popl %ebx + // c7: 5d popl %ebp + // c8: e9 00 00 00 00 jmp 0xcd <__JIT_ENTRY+0xcd> + // 000000c9: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[205] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x6c, 0x24, + 0x20, 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc9, 0x8b, 0x70, 0xf8, 0x8b, 0x58, 0xfc, 0x8b, + 0x17, 0x8b, 0x52, 0x10, 0x8b, 0x4c, 0x8a, 0x0c, + 0x89, 0x47, 0x20, 0x56, 0x53, 0x51, 0x57, 0x89, + 0x6c, 0x24, 0x10, 0x55, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x14, 0x8b, 0x6f, 0x20, 0xc7, + 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, + 0x49, 0x89, 0x0e, 0x74, 0x1e, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x2b, 0x49, + 0x89, 0x0b, 0x75, 0x26, 0x53, 0x89, 0xc6, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, + 0x04, 0xeb, 0x17, 0x56, 0x89, 0xc6, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, + 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7e, 0xd5, 0x85, 0xc0, 0x74, 0x21, 0x89, 0x45, + 0xf8, 0x83, 0xc5, 0xfc, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x20, 0x89, 0x6c, 0x24, 0x1c, 0x89, + 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc5, 0xf8, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x6c, 0x24, + 0x1c, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, instruction->oparg); + patch_x86_64_32rx(code + 0x35, (uintptr_t)&_PyEval_ImportName + -0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x77, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xab, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc9, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_BOUND_METHOD_EXACT_ARGS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 44 24 1c movl 0x1c(%esp), %eax + // 10: 8b 74 24 18 movl 0x18(%esp), %esi + // 14: b9 00 00 00 00 movl $0x0, %ecx + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 d1 movzwl %cx, %edx + // 1c: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 21: 29 d1 subl %edx, %ecx + // 23: f7 d2 notl %edx + // 25: 8b 1c 88 movl (%eax,%ecx,4), %ebx + // 28: 8b 6b 0c movl 0xc(%ebx), %ebp + // 2b: 8b 7d 00 movl (%ebp), %edi + // 2e: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 34: 7f 04 jg 0x3a <__JIT_ENTRY+0x3a> + // 36: 47 incl %edi + // 37: 89 7d 00 movl %edi, (%ebp) + // 3a: 89 2c 90 movl %ebp, (%eax,%edx,4) + // 3d: 8b 14 88 movl (%eax,%ecx,4), %edx + // 40: 8b 5b 08 movl 0x8(%ebx), %ebx + // 43: 8b 3b movl (%ebx), %edi + // 45: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 4b: 7f 03 jg 0x50 <__JIT_ENTRY+0x50> + // 4d: 47 incl %edi + // 4e: 89 3b movl %edi, (%ebx) + // 50: 89 1c 88 movl %ebx, (%eax,%ecx,4) + // 53: 89 46 20 movl %eax, 0x20(%esi) + // 56: 8b 02 movl (%edx), %eax + // 58: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 5d: 7f 0e jg 0x6d <__JIT_ENTRY+0x6d> + // 5f: 48 decl %eax + // 60: 89 02 movl %eax, (%edx) + // 62: 75 09 jne 0x6d <__JIT_ENTRY+0x6d> + // 64: 52 pushl %edx + // 65: e8 00 00 00 00 calll 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6a: 83 c4 04 addl $0x4, %esp + // 6d: 8b 46 20 movl 0x20(%esi), %eax + // 70: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 77: 8b 0c 24 movl (%esp), %ecx + // 7a: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 7e: 89 44 24 1c movl %eax, 0x1c(%esp) + // 82: 89 74 24 18 movl %esi, 0x18(%esp) + // 86: 83 c4 04 addl $0x4, %esp + // 89: 5e popl %esi + // 8a: 5f popl %edi + // 8b: 5b popl %ebx + // 8c: 5d popl %ebp + // 8d: e9 00 00 00 00 jmp 0x92 <__JIT_ENTRY+0x92> + // 0000008e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[141] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x44, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x18, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xd1, 0xb9, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xd1, 0xf7, 0xd2, 0x8b, 0x1c, 0x88, + 0x8b, 0x6b, 0x0c, 0x8b, 0x7d, 0x00, 0x81, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x04, 0x47, 0x89, + 0x7d, 0x00, 0x89, 0x2c, 0x90, 0x8b, 0x14, 0x88, + 0x8b, 0x5b, 0x08, 0x8b, 0x3b, 0x81, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3b, + 0x89, 0x1c, 0x88, 0x89, 0x46, 0x20, 0x8b, 0x02, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, + 0x89, 0x02, 0x75, 0x09, 0x52, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0c, 0x24, 0x89, 0x4c, 0x24, 0x20, 0x89, 0x44, + 0x24, 0x1c, 0x89, 0x74, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_x86_64_32rx(code + 0x66, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 24 subl $0x24, %esp + // 7: 8b 74 24 40 movl 0x40(%esp), %esi + // b: 8b 5c 24 3c movl 0x3c(%esp), %ebx + // f: b8 00 00 00 00 movl $0x0, %eax + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 c0 movzwl %ax, %eax + // 17: 89 04 24 movl %eax, (%esp) + // 1a: 89 c7 movl %eax, %edi + // 1c: f7 d7 notl %edi + // 1e: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 23: 29 c1 subl %eax, %ecx + // 25: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 29: 8b 04 8b movl (%ebx,%ecx,4), %eax + // 2c: 8b 48 18 movl 0x18(%eax), %ecx + // 2f: 8b ae 94 00 00 00 movl 0x94(%esi), %ebp + // 35: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 39: 8b 51 34 movl 0x34(%ecx), %edx + // 3c: 8d 54 95 00 leal (%ebp,%edx,4), %edx + // 40: 89 54 24 10 movl %edx, 0x10(%esp) + // 44: 89 c5 movl %eax, %ebp + // 46: 8b 54 24 38 movl 0x38(%esp), %edx + // 4a: 89 5c 24 04 movl %ebx, 0x4(%esp) + // 4e: 89 7c 24 0c movl %edi, 0xc(%esp) + // 52: 8b 3c bb movl (%ebx,%edi,4), %edi + // 55: 89 74 24 20 movl %esi, 0x20(%esp) + // 59: 8b 44 24 10 movl 0x10(%esp), %eax + // 5d: 89 86 94 00 00 00 movl %eax, 0x94(%esi) + // 63: 31 db xorl %ebx, %ebx + // 65: 89 7c 24 14 movl %edi, 0x14(%esp) + // 69: 85 ff testl %edi, %edi + // 6b: 8b 7c 24 18 movl 0x18(%esp), %edi + // 6f: 0f 95 c3 setne %bl + // 72: 89 54 24 10 movl %edx, 0x10(%esp) + // 76: 89 57 04 movl %edx, 0x4(%edi) + // 79: 89 6f 08 movl %ebp, 0x8(%edi) + // 7c: 89 5c 24 08 movl %ebx, 0x8(%esp) + // 80: 8b 04 24 movl (%esp), %eax + // 83: 8d 14 03 leal (%ebx,%eax), %edx + // 86: 8b 19 movl (%ecx), %ebx + // 88: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 8e: 7f 03 jg 0x93 <__JIT_ENTRY+0x93> + // 90: 43 incl %ebx + // 91: 89 19 movl %ebx, (%ecx) + // 93: 8b 44 24 0c movl 0xc(%esp), %eax + // 97: 8b 74 24 04 movl 0x4(%esp), %esi + // 9b: 8d 1c 86 leal (%esi,%eax,4), %ebx + // 9e: 89 0f movl %ecx, (%edi) + // a0: 8b 45 0c movl 0xc(%ebp), %eax + // a3: 89 47 10 movl %eax, 0x10(%edi) + // a6: 8b 45 08 movl 0x8(%ebp), %eax + // a9: 89 47 0c movl %eax, 0xc(%edi) + // ac: c7 47 14 00 00 00 00 movl $0x0, 0x14(%edi) + // b3: 8d 47 28 leal 0x28(%edi), %eax + // b6: 8b 71 30 movl 0x30(%ecx), %esi + // b9: 8d 74 b7 28 leal 0x28(%edi,%esi,4), %esi + // bd: 89 77 20 movl %esi, 0x20(%edi) + // c0: c7 47 18 00 00 00 00 movl $0x0, 0x18(%edi) + // c7: 8d b1 80 00 00 00 leal 0x80(%ecx), %esi + // cd: 89 77 1c movl %esi, 0x1c(%edi) + // d0: c7 47 24 00 00 00 00 movl $0x0, 0x24(%edi) + // d7: 39 51 30 cmpl %edx, 0x30(%ecx) + // da: 7e 11 jle 0xed <__JIT_ENTRY+0xed> + // dc: 0f 1f 40 00 nopl (%eax) + // e0: c7 04 90 00 00 00 00 movl $0x0, (%eax,%edx,4) + // e7: 42 incl %edx + // e8: 3b 51 30 cmpl 0x30(%ecx), %edx + // eb: 7c f3 jl 0xe0 <__JIT_ENTRY+0xe0> + // ed: 89 5c 24 0c movl %ebx, 0xc(%esp) + // f1: 8b 0b movl (%ebx), %ecx + // f3: 89 08 movl %ecx, (%eax) + // f5: b9 00 00 00 00 movl $0x0, %ecx + // 000000f6: IMAGE_REL_I386_DIR32 __JIT_OPARG + // fa: 66 85 c9 testw %cx, %cx + // fd: 8b 2c 24 movl (%esp), %ebp + // 100: 8b 5c 24 04 movl 0x4(%esp), %ebx + // 104: 0f 84 db 00 00 00 je 0x1e5 <__JIT_ENTRY+0x1e5> + // 10a: 8d 14 ad 00 00 00 00 leal (,%ebp,4), %edx + // 111: 89 d9 movl %ebx, %ecx + // 113: 29 d1 subl %edx, %ecx + // 115: ba 00 00 00 00 movl $0x0, %edx + // 00000116: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 11a: 31 f6 xorl %esi, %esi + // 11c: 66 83 fa 13 cmpw $0x13, %dx + // 120: 76 53 jbe 0x175 <__JIT_ENTRY+0x175> + // 122: 31 d2 xorl %edx, %edx + // 124: 83 7c 24 14 00 cmpl $0x0, 0x14(%esp) + // 129: 0f 95 c2 setne %dl + // 12c: 8d 14 97 leal (%edi,%edx,4), %edx + // 12f: 8d 14 aa leal (%edx,%ebp,4), %edx + // 132: 29 da subl %ebx, %edx + // 134: 83 c2 28 addl $0x28, %edx + // 137: 83 fa 20 cmpl $0x20, %edx + // 13a: 72 39 jb 0x175 <__JIT_ENTRY+0x175> + // 13c: 89 ee movl %ebp, %esi + // 13e: 83 e6 f8 andl $-0x8, %esi + // 141: 8b 54 24 08 movl 0x8(%esp), %edx + // 145: 8d 14 97 leal (%edi,%edx,4), %edx + // 148: 83 c2 38 addl $0x38, %edx + // 14b: 8d 69 10 leal 0x10(%ecx), %ebp + // 14e: 31 db xorl %ebx, %ebx + // 150: 0f 10 44 9d f0 movups -0x10(%ebp,%ebx,4), %xmm0 + // 155: 0f 10 4c 9d 00 movups (%ebp,%ebx,4), %xmm1 + // 15a: 0f 11 44 9a f0 movups %xmm0, -0x10(%edx,%ebx,4) + // 15f: 0f 11 0c 9a movups %xmm1, (%edx,%ebx,4) + // 163: 83 c3 08 addl $0x8, %ebx + // 166: 39 de cmpl %ebx, %esi + // 168: 75 e6 jne 0x150 <__JIT_ENTRY+0x150> + // 16a: 8b 2c 24 movl (%esp), %ebp + // 16d: 39 ee cmpl %ebp, %esi + // 16f: 8b 5c 24 04 movl 0x4(%esp), %ebx + // 173: 74 70 je 0x1e5 <__JIT_ENTRY+0x1e5> + // 175: 89 f2 movl %esi, %edx + // 177: 83 e5 03 andl $0x3, %ebp + // 17a: 74 1e je 0x19a <__JIT_ENTRY+0x19a> + // 17c: 8b 54 24 08 movl 0x8(%esp), %edx + // 180: 8d 04 90 leal (%eax,%edx,4), %eax + // 183: 89 f2 movl %esi, %edx + // 185: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 190: 8b 1c 91 movl (%ecx,%edx,4), %ebx + // 193: 89 1c 90 movl %ebx, (%eax,%edx,4) + // 196: 42 incl %edx + // 197: 4d decl %ebp + // 198: 75 f6 jne 0x190 <__JIT_ENTRY+0x190> + // 19a: 8b 2c 24 movl (%esp), %ebp + // 19d: 29 ee subl %ebp, %esi + // 19f: 83 fe fc cmpl $-0x4, %esi + // 1a2: 8b 5c 24 04 movl 0x4(%esp), %ebx + // 1a6: 77 3d ja 0x1e5 <__JIT_ENTRY+0x1e5> + // 1a8: 83 c1 0c addl $0xc, %ecx + // 1ab: 8b 44 24 08 movl 0x8(%esp), %eax + // 1af: 8d 04 87 leal (%edi,%eax,4), %eax + // 1b2: 83 c0 34 addl $0x34, %eax + // 1b5: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // 1c0: 8b 74 91 f4 movl -0xc(%ecx,%edx,4), %esi + // 1c4: 89 74 90 f4 movl %esi, -0xc(%eax,%edx,4) + // 1c8: 8b 74 91 f8 movl -0x8(%ecx,%edx,4), %esi + // 1cc: 89 74 90 f8 movl %esi, -0x8(%eax,%edx,4) + // 1d0: 8b 74 91 fc movl -0x4(%ecx,%edx,4), %esi + // 1d4: 89 74 90 fc movl %esi, -0x4(%eax,%edx,4) + // 1d8: 8b 34 91 movl (%ecx,%edx,4), %esi + // 1db: 89 34 90 movl %esi, (%eax,%edx,4) + // 1de: 83 c2 04 addl $0x4, %edx + // 1e1: 39 d5 cmpl %edx, %ebp + // 1e3: 75 db jne 0x1c0 <__JIT_ENTRY+0x1c0> + // 1e5: 8b 44 24 1c movl 0x1c(%esp), %eax + // 1e9: 89 3c 83 movl %edi, (%ebx,%eax,4) + // 1ec: 8b 44 24 20 movl 0x20(%esp), %eax + // 1f0: 89 44 24 40 movl %eax, 0x40(%esp) + // 1f4: 8b 44 24 0c movl 0xc(%esp), %eax + // 1f8: 89 44 24 3c movl %eax, 0x3c(%esp) + // 1fc: 8b 44 24 10 movl 0x10(%esp), %eax + // 200: 89 44 24 38 movl %eax, 0x38(%esp) + // 204: 83 c4 24 addl $0x24, %esp + // 207: 5e popl %esi + // 208: 5f popl %edi + // 209: 5b popl %ebx + // 20a: 5d popl %ebp + // 20b: e9 00 00 00 00 jmp 0x210 <__JIT_ENTRY+0x210> + // 0000020c: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[523] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x24, 0x8b, + 0x74, 0x24, 0x40, 0x8b, 0x5c, 0x24, 0x3c, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc0, 0x89, + 0x04, 0x24, 0x89, 0xc7, 0xf7, 0xd7, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x89, 0x4c, 0x24, + 0x1c, 0x8b, 0x04, 0x8b, 0x8b, 0x48, 0x18, 0x8b, + 0xae, 0x94, 0x00, 0x00, 0x00, 0x89, 0x6c, 0x24, + 0x18, 0x8b, 0x51, 0x34, 0x8d, 0x54, 0x95, 0x00, + 0x89, 0x54, 0x24, 0x10, 0x89, 0xc5, 0x8b, 0x54, + 0x24, 0x38, 0x89, 0x5c, 0x24, 0x04, 0x89, 0x7c, + 0x24, 0x0c, 0x8b, 0x3c, 0xbb, 0x89, 0x74, 0x24, + 0x20, 0x8b, 0x44, 0x24, 0x10, 0x89, 0x86, 0x94, + 0x00, 0x00, 0x00, 0x31, 0xdb, 0x89, 0x7c, 0x24, + 0x14, 0x85, 0xff, 0x8b, 0x7c, 0x24, 0x18, 0x0f, + 0x95, 0xc3, 0x89, 0x54, 0x24, 0x10, 0x89, 0x57, + 0x04, 0x89, 0x6f, 0x08, 0x89, 0x5c, 0x24, 0x08, + 0x8b, 0x04, 0x24, 0x8d, 0x14, 0x03, 0x8b, 0x19, + 0x81, 0xfb, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x43, 0x89, 0x19, 0x8b, 0x44, 0x24, 0x0c, 0x8b, + 0x74, 0x24, 0x04, 0x8d, 0x1c, 0x86, 0x89, 0x0f, + 0x8b, 0x45, 0x0c, 0x89, 0x47, 0x10, 0x8b, 0x45, + 0x08, 0x89, 0x47, 0x0c, 0xc7, 0x47, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x8d, 0x47, 0x28, 0x8b, 0x71, + 0x30, 0x8d, 0x74, 0xb7, 0x28, 0x89, 0x77, 0x20, + 0xc7, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x8d, + 0xb1, 0x80, 0x00, 0x00, 0x00, 0x89, 0x77, 0x1c, + 0xc7, 0x47, 0x24, 0x00, 0x00, 0x00, 0x00, 0x39, + 0x51, 0x30, 0x7e, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0xc7, 0x04, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x3b, 0x51, 0x30, 0x7c, 0xf3, 0x89, 0x5c, 0x24, + 0x0c, 0x8b, 0x0b, 0x89, 0x08, 0xb9, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc9, 0x8b, 0x2c, 0x24, + 0x8b, 0x5c, 0x24, 0x04, 0x0f, 0x84, 0xdb, 0x00, + 0x00, 0x00, 0x8d, 0x14, 0xad, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xd9, 0x29, 0xd1, 0xba, 0x00, 0x00, + 0x00, 0x00, 0x31, 0xf6, 0x66, 0x83, 0xfa, 0x13, + 0x76, 0x53, 0x31, 0xd2, 0x83, 0x7c, 0x24, 0x14, + 0x00, 0x0f, 0x95, 0xc2, 0x8d, 0x14, 0x97, 0x8d, + 0x14, 0xaa, 0x29, 0xda, 0x83, 0xc2, 0x28, 0x83, + 0xfa, 0x20, 0x72, 0x39, 0x89, 0xee, 0x83, 0xe6, + 0xf8, 0x8b, 0x54, 0x24, 0x08, 0x8d, 0x14, 0x97, + 0x83, 0xc2, 0x38, 0x8d, 0x69, 0x10, 0x31, 0xdb, + 0x0f, 0x10, 0x44, 0x9d, 0xf0, 0x0f, 0x10, 0x4c, + 0x9d, 0x00, 0x0f, 0x11, 0x44, 0x9a, 0xf0, 0x0f, + 0x11, 0x0c, 0x9a, 0x83, 0xc3, 0x08, 0x39, 0xde, + 0x75, 0xe6, 0x8b, 0x2c, 0x24, 0x39, 0xee, 0x8b, + 0x5c, 0x24, 0x04, 0x74, 0x70, 0x89, 0xf2, 0x83, + 0xe5, 0x03, 0x74, 0x1e, 0x8b, 0x54, 0x24, 0x08, + 0x8d, 0x04, 0x90, 0x89, 0xf2, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x1c, 0x91, 0x89, 0x1c, 0x90, 0x42, 0x4d, + 0x75, 0xf6, 0x8b, 0x2c, 0x24, 0x29, 0xee, 0x83, + 0xfe, 0xfc, 0x8b, 0x5c, 0x24, 0x04, 0x77, 0x3d, + 0x83, 0xc1, 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8d, + 0x04, 0x87, 0x83, 0xc0, 0x34, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x74, 0x91, 0xf4, 0x89, 0x74, 0x90, 0xf4, + 0x8b, 0x74, 0x91, 0xf8, 0x89, 0x74, 0x90, 0xf8, + 0x8b, 0x74, 0x91, 0xfc, 0x89, 0x74, 0x90, 0xfc, + 0x8b, 0x34, 0x91, 0x89, 0x34, 0x90, 0x83, 0xc2, + 0x04, 0x39, 0xd5, 0x75, 0xdb, 0x8b, 0x44, 0x24, + 0x1c, 0x89, 0x3c, 0x83, 0x8b, 0x44, 0x24, 0x20, + 0x89, 0x44, 0x24, 0x40, 0x8b, 0x44, 0x24, 0x0c, + 0x89, 0x44, 0x24, 0x3c, 0x8b, 0x44, 0x24, 0x10, + 0x89, 0x44, 0x24, 0x38, 0x83, 0xc4, 0x24, 0x5e, + 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_32(code + 0xf6, instruction->oparg); + patch_32(code + 0x116, instruction->oparg); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_0.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 4c 24 28 movl 0x28(%esp), %ecx + // b: 8b 44 24 24 movl 0x24(%esp), %eax + // f: 31 d2 xorl %edx, %edx + // 11: 83 78 fc 00 cmpl $0x0, -0x4(%eax) + // 15: 89 04 24 movl %eax, (%esp) + // 18: 8b 68 f8 movl -0x8(%eax), %ebp + // 1b: 8b 5d 18 movl 0x18(%ebp), %ebx + // 1e: 8b b1 94 00 00 00 movl 0x94(%ecx), %esi + // 24: 8b 7b 34 movl 0x34(%ebx), %edi + // 27: 8d 3c be leal (%esi,%edi,4), %edi + // 2a: 8b 44 24 20 movl 0x20(%esp), %eax + // 2e: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 32: 89 b9 94 00 00 00 movl %edi, 0x94(%ecx) + // 38: 0f 95 c2 setne %dl + // 3b: 89 44 24 08 movl %eax, 0x8(%esp) + // 3f: 89 46 04 movl %eax, 0x4(%esi) + // 42: 89 6e 08 movl %ebp, 0x8(%esi) + // 45: 8b 3b movl (%ebx), %edi + // 47: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 4d: 7f 03 jg 0x52 <__JIT_ENTRY+0x52> + // 4f: 47 incl %edi + // 50: 89 3b movl %edi, (%ebx) + // 52: 8b 04 24 movl (%esp), %eax + // 55: 8d 48 fc leal -0x4(%eax), %ecx + // 58: 89 1e movl %ebx, (%esi) + // 5a: 8b 7d 0c movl 0xc(%ebp), %edi + // 5d: 89 7e 10 movl %edi, 0x10(%esi) + // 60: 8b 7d 08 movl 0x8(%ebp), %edi + // 63: 89 7e 0c movl %edi, 0xc(%esi) + // 66: c7 46 14 00 00 00 00 movl $0x0, 0x14(%esi) + // 6d: 8b 7b 30 movl 0x30(%ebx), %edi + // 70: 8d 7c be 28 leal 0x28(%esi,%edi,4), %edi + // 74: 89 7e 20 movl %edi, 0x20(%esi) + // 77: c7 46 18 00 00 00 00 movl $0x0, 0x18(%esi) + // 7e: 8d bb 80 00 00 00 leal 0x80(%ebx), %edi + // 84: 89 7e 1c movl %edi, 0x1c(%esi) + // 87: c7 46 24 00 00 00 00 movl $0x0, 0x24(%esi) + // 8e: 39 53 30 cmpl %edx, 0x30(%ebx) + // 91: 7e 1b jle 0xae <__JIT_ENTRY+0xae> + // 93: 8d 6e 28 leal 0x28(%esi), %ebp + // 96: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // a0: c7 44 95 00 00 00 00 00 movl $0x0, (%ebp,%edx,4) + // a8: 42 incl %edx + // a9: 3b 53 30 cmpl 0x30(%ebx), %edx + // ac: 7c f2 jl 0xa0 <__JIT_ENTRY+0xa0> + // ae: 8b 50 fc movl -0x4(%eax), %edx + // b1: 89 56 28 movl %edx, 0x28(%esi) + // b4: 89 70 f8 movl %esi, -0x8(%eax) + // b7: 8b 44 24 04 movl 0x4(%esp), %eax + // bb: 89 44 24 28 movl %eax, 0x28(%esp) + // bf: 89 4c 24 24 movl %ecx, 0x24(%esp) + // c3: 8b 44 24 08 movl 0x8(%esp), %eax + // c7: 89 44 24 20 movl %eax, 0x20(%esp) + // cb: 83 c4 0c addl $0xc, %esp + // ce: 5e popl %esi + // cf: 5f popl %edi + // d0: 5b popl %ebx + // d1: 5d popl %ebp + // d2: e9 00 00 00 00 jmp 0xd7 <__JIT_ENTRY+0xd7> + // 000000d3: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[210] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x4c, 0x24, 0x28, 0x8b, 0x44, 0x24, 0x24, 0x31, + 0xd2, 0x83, 0x78, 0xfc, 0x00, 0x89, 0x04, 0x24, + 0x8b, 0x68, 0xf8, 0x8b, 0x5d, 0x18, 0x8b, 0xb1, + 0x94, 0x00, 0x00, 0x00, 0x8b, 0x7b, 0x34, 0x8d, + 0x3c, 0xbe, 0x8b, 0x44, 0x24, 0x20, 0x89, 0x4c, + 0x24, 0x04, 0x89, 0xb9, 0x94, 0x00, 0x00, 0x00, + 0x0f, 0x95, 0xc2, 0x89, 0x44, 0x24, 0x08, 0x89, + 0x46, 0x04, 0x89, 0x6e, 0x08, 0x8b, 0x3b, 0x81, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x47, + 0x89, 0x3b, 0x8b, 0x04, 0x24, 0x8d, 0x48, 0xfc, + 0x89, 0x1e, 0x8b, 0x7d, 0x0c, 0x89, 0x7e, 0x10, + 0x8b, 0x7d, 0x08, 0x89, 0x7e, 0x0c, 0xc7, 0x46, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x7b, 0x30, + 0x8d, 0x7c, 0xbe, 0x28, 0x89, 0x7e, 0x20, 0xc7, + 0x46, 0x18, 0x00, 0x00, 0x00, 0x00, 0x8d, 0xbb, + 0x80, 0x00, 0x00, 0x00, 0x89, 0x7e, 0x1c, 0xc7, + 0x46, 0x24, 0x00, 0x00, 0x00, 0x00, 0x39, 0x53, + 0x30, 0x7e, 0x1b, 0x8d, 0x6e, 0x28, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc7, 0x44, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x3b, 0x53, 0x30, 0x7c, 0xf2, 0x8b, 0x50, + 0xfc, 0x89, 0x56, 0x28, 0x89, 0x70, 0xf8, 0x8b, + 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, 0x28, 0x89, + 0x4c, 0x24, 0x24, 0x8b, 0x44, 0x24, 0x08, 0x89, + 0x44, 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, + 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 6c 24 28 movl 0x28(%esp), %ebp + // b: 8b 4c 24 24 movl 0x24(%esp), %ecx + // f: 8b 44 24 20 movl 0x20(%esp), %eax + // 13: 89 04 24 movl %eax, (%esp) + // 16: 8b 41 f4 movl -0xc(%ecx), %eax + // 19: 8b 78 18 movl 0x18(%eax), %edi + // 1c: 8b b5 94 00 00 00 movl 0x94(%ebp), %esi + // 22: 8b 5f 34 movl 0x34(%edi), %ebx + // 25: 8d 1c 9e leal (%esi,%ebx,4), %ebx + // 28: 8b 51 f8 movl -0x8(%ecx), %edx + // 2b: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 2f: 89 9d 94 00 00 00 movl %ebx, 0x94(%ebp) + // 35: 89 54 24 04 movl %edx, 0x4(%esp) + // 39: 83 fa 01 cmpl $0x1, %edx + // 3c: bd 01 00 00 00 movl $0x1, %ebp + // 41: 83 dd ff sbbl $-0x1, %ebp + // 44: 8b 14 24 movl (%esp), %edx + // 47: 89 56 04 movl %edx, 0x4(%esi) + // 4a: 89 46 08 movl %eax, 0x8(%esi) + // 4d: 8b 1f movl (%edi), %ebx + // 4f: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 55: 7f 03 jg 0x5a <__JIT_ENTRY+0x5a> + // 57: 43 incl %ebx + // 58: 89 1f movl %ebx, (%edi) + // 5a: 8d 51 f8 leal -0x8(%ecx), %edx + // 5d: 89 3e movl %edi, (%esi) + // 5f: 8b 58 0c movl 0xc(%eax), %ebx + // 62: 89 5e 10 movl %ebx, 0x10(%esi) + // 65: 8b 40 08 movl 0x8(%eax), %eax + // 68: 89 46 0c movl %eax, 0xc(%esi) + // 6b: c7 46 14 00 00 00 00 movl $0x0, 0x14(%esi) + // 72: 8b 47 30 movl 0x30(%edi), %eax + // 75: 8d 44 86 28 leal 0x28(%esi,%eax,4), %eax + // 79: 89 46 20 movl %eax, 0x20(%esi) + // 7c: c7 46 18 00 00 00 00 movl $0x0, 0x18(%esi) + // 83: 8d 87 80 00 00 00 leal 0x80(%edi), %eax + // 89: 89 46 1c movl %eax, 0x1c(%esi) + // 8c: c7 46 24 00 00 00 00 movl $0x0, 0x24(%esi) + // 93: 39 6f 30 cmpl %ebp, 0x30(%edi) + // 96: 7e 15 jle 0xad <__JIT_ENTRY+0xad> + // 98: 8d 46 28 leal 0x28(%esi), %eax + // 9b: 0f 1f 44 00 00 nopl (%eax,%eax) + // a0: c7 04 a8 00 00 00 00 movl $0x0, (%eax,%ebp,4) + // a7: 45 incl %ebp + // a8: 3b 6f 30 cmpl 0x30(%edi), %ebp + // ab: 7c f3 jl 0xa0 <__JIT_ENTRY+0xa0> + // ad: 31 c0 xorl %eax, %eax + // af: 83 7c 24 04 00 cmpl $0x0, 0x4(%esp) + // b4: 0f 95 c0 setne %al + // b7: 8b 79 f8 movl -0x8(%ecx), %edi + // ba: 89 7e 28 movl %edi, 0x28(%esi) + // bd: 8b 79 fc movl -0x4(%ecx), %edi + // c0: 89 7c 86 28 movl %edi, 0x28(%esi,%eax,4) + // c4: 89 71 f4 movl %esi, -0xc(%ecx) + // c7: 8b 44 24 08 movl 0x8(%esp), %eax + // cb: 89 44 24 28 movl %eax, 0x28(%esp) + // cf: 89 54 24 24 movl %edx, 0x24(%esp) + // d3: 8b 04 24 movl (%esp), %eax + // d6: 89 44 24 20 movl %eax, 0x20(%esp) + // da: 83 c4 0c addl $0xc, %esp + // dd: 5e popl %esi + // de: 5f popl %edi + // df: 5b popl %ebx + // e0: 5d popl %ebp + // e1: e9 00 00 00 00 jmp 0xe6 <__JIT_ENTRY+0xe6> + // 000000e2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[225] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x6c, 0x24, 0x28, 0x8b, 0x4c, 0x24, 0x24, 0x8b, + 0x44, 0x24, 0x20, 0x89, 0x04, 0x24, 0x8b, 0x41, + 0xf4, 0x8b, 0x78, 0x18, 0x8b, 0xb5, 0x94, 0x00, + 0x00, 0x00, 0x8b, 0x5f, 0x34, 0x8d, 0x1c, 0x9e, + 0x8b, 0x51, 0xf8, 0x89, 0x6c, 0x24, 0x08, 0x89, + 0x9d, 0x94, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x04, 0x83, 0xfa, 0x01, 0xbd, 0x01, 0x00, 0x00, + 0x00, 0x83, 0xdd, 0xff, 0x8b, 0x14, 0x24, 0x89, + 0x56, 0x04, 0x89, 0x46, 0x08, 0x8b, 0x1f, 0x81, + 0xfb, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x43, + 0x89, 0x1f, 0x8d, 0x51, 0xf8, 0x89, 0x3e, 0x8b, + 0x58, 0x0c, 0x89, 0x5e, 0x10, 0x8b, 0x40, 0x08, + 0x89, 0x46, 0x0c, 0xc7, 0x46, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x47, 0x30, 0x8d, 0x44, 0x86, + 0x28, 0x89, 0x46, 0x20, 0xc7, 0x46, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x8d, 0x87, 0x80, 0x00, 0x00, + 0x00, 0x89, 0x46, 0x1c, 0xc7, 0x46, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x39, 0x6f, 0x30, 0x7e, 0x15, + 0x8d, 0x46, 0x28, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0xc7, 0x04, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x3b, 0x6f, 0x30, 0x7c, 0xf3, 0x31, 0xc0, 0x83, + 0x7c, 0x24, 0x04, 0x00, 0x0f, 0x95, 0xc0, 0x8b, + 0x79, 0xf8, 0x89, 0x7e, 0x28, 0x8b, 0x79, 0xfc, + 0x89, 0x7c, 0x86, 0x28, 0x89, 0x71, 0xf4, 0x8b, + 0x44, 0x24, 0x08, 0x89, 0x44, 0x24, 0x28, 0x89, + 0x54, 0x24, 0x24, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_2.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 6c 24 28 movl 0x28(%esp), %ebp + // b: 8b 5c 24 24 movl 0x24(%esp), %ebx + // f: 8b 44 24 20 movl 0x20(%esp), %eax + // 13: 89 04 24 movl %eax, (%esp) + // 16: 8b 43 f0 movl -0x10(%ebx), %eax + // 19: 8b 78 18 movl 0x18(%eax), %edi + // 1c: 8b b5 94 00 00 00 movl 0x94(%ebp), %esi + // 22: 8b 4f 34 movl 0x34(%edi), %ecx + // 25: 8d 0c 8e leal (%esi,%ecx,4), %ecx + // 28: 8b 53 f4 movl -0xc(%ebx), %edx + // 2b: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 2f: 89 8d 94 00 00 00 movl %ecx, 0x94(%ebp) + // 35: 89 54 24 04 movl %edx, 0x4(%esp) + // 39: 83 fa 01 cmpl $0x1, %edx + // 3c: bd 02 00 00 00 movl $0x2, %ebp + // 41: 83 dd ff sbbl $-0x1, %ebp + // 44: 8b 0c 24 movl (%esp), %ecx + // 47: 89 4e 04 movl %ecx, 0x4(%esi) + // 4a: 89 46 08 movl %eax, 0x8(%esi) + // 4d: 8b 0f movl (%edi), %ecx + // 4f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 55: 7f 03 jg 0x5a <__JIT_ENTRY+0x5a> + // 57: 41 incl %ecx + // 58: 89 0f movl %ecx, (%edi) + // 5a: 8d 53 f4 leal -0xc(%ebx), %edx + // 5d: 89 3e movl %edi, (%esi) + // 5f: 8b 48 0c movl 0xc(%eax), %ecx + // 62: 89 4e 10 movl %ecx, 0x10(%esi) + // 65: 8b 40 08 movl 0x8(%eax), %eax + // 68: 89 46 0c movl %eax, 0xc(%esi) + // 6b: c7 46 14 00 00 00 00 movl $0x0, 0x14(%esi) + // 72: 8b 47 30 movl 0x30(%edi), %eax + // 75: 8d 44 86 28 leal 0x28(%esi,%eax,4), %eax + // 79: 89 46 20 movl %eax, 0x20(%esi) + // 7c: c7 46 18 00 00 00 00 movl $0x0, 0x18(%esi) + // 83: 8d 87 80 00 00 00 leal 0x80(%edi), %eax + // 89: 89 46 1c movl %eax, 0x1c(%esi) + // 8c: c7 46 24 00 00 00 00 movl $0x0, 0x24(%esi) + // 93: 39 6f 30 cmpl %ebp, 0x30(%edi) + // 96: 7e 15 jle 0xad <__JIT_ENTRY+0xad> + // 98: 8d 46 28 leal 0x28(%esi), %eax + // 9b: 0f 1f 44 00 00 nopl (%eax,%eax) + // a0: c7 04 a8 00 00 00 00 movl $0x0, (%eax,%ebp,4) + // a7: 45 incl %ebp + // a8: 3b 6f 30 cmpl 0x30(%edi), %ebp + // ab: 7c f3 jl 0xa0 <__JIT_ENTRY+0xa0> + // ad: 31 c0 xorl %eax, %eax + // af: 83 7c 24 04 00 cmpl $0x0, 0x4(%esp) + // b4: 0f 95 c0 setne %al + // b7: 8b 4b f4 movl -0xc(%ebx), %ecx + // ba: 89 4e 28 movl %ecx, 0x28(%esi) + // bd: 8b 4b f8 movl -0x8(%ebx), %ecx + // c0: 89 4c 86 28 movl %ecx, 0x28(%esi,%eax,4) + // c4: 8b 4b fc movl -0x4(%ebx), %ecx + // c7: 89 4c 86 2c movl %ecx, 0x2c(%esi,%eax,4) + // cb: 89 73 f0 movl %esi, -0x10(%ebx) + // ce: 8b 44 24 08 movl 0x8(%esp), %eax + // d2: 89 44 24 28 movl %eax, 0x28(%esp) + // d6: 89 54 24 24 movl %edx, 0x24(%esp) + // da: 8b 04 24 movl (%esp), %eax + // dd: 89 44 24 20 movl %eax, 0x20(%esp) + // e1: 83 c4 0c addl $0xc, %esp + // e4: 5e popl %esi + // e5: 5f popl %edi + // e6: 5b popl %ebx + // e7: 5d popl %ebp + // e8: e9 00 00 00 00 jmp 0xed <__JIT_ENTRY+0xed> + // 000000e9: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[232] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x6c, 0x24, 0x28, 0x8b, 0x5c, 0x24, 0x24, 0x8b, + 0x44, 0x24, 0x20, 0x89, 0x04, 0x24, 0x8b, 0x43, + 0xf0, 0x8b, 0x78, 0x18, 0x8b, 0xb5, 0x94, 0x00, + 0x00, 0x00, 0x8b, 0x4f, 0x34, 0x8d, 0x0c, 0x8e, + 0x8b, 0x53, 0xf4, 0x89, 0x6c, 0x24, 0x08, 0x89, + 0x8d, 0x94, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x04, 0x83, 0xfa, 0x01, 0xbd, 0x02, 0x00, 0x00, + 0x00, 0x83, 0xdd, 0xff, 0x8b, 0x0c, 0x24, 0x89, + 0x4e, 0x04, 0x89, 0x46, 0x08, 0x8b, 0x0f, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x41, + 0x89, 0x0f, 0x8d, 0x53, 0xf4, 0x89, 0x3e, 0x8b, + 0x48, 0x0c, 0x89, 0x4e, 0x10, 0x8b, 0x40, 0x08, + 0x89, 0x46, 0x0c, 0xc7, 0x46, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x47, 0x30, 0x8d, 0x44, 0x86, + 0x28, 0x89, 0x46, 0x20, 0xc7, 0x46, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x8d, 0x87, 0x80, 0x00, 0x00, + 0x00, 0x89, 0x46, 0x1c, 0xc7, 0x46, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x39, 0x6f, 0x30, 0x7e, 0x15, + 0x8d, 0x46, 0x28, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0xc7, 0x04, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x3b, 0x6f, 0x30, 0x7c, 0xf3, 0x31, 0xc0, 0x83, + 0x7c, 0x24, 0x04, 0x00, 0x0f, 0x95, 0xc0, 0x8b, + 0x4b, 0xf4, 0x89, 0x4e, 0x28, 0x8b, 0x4b, 0xf8, + 0x89, 0x4c, 0x86, 0x28, 0x8b, 0x4b, 0xfc, 0x89, + 0x4c, 0x86, 0x2c, 0x89, 0x73, 0xf0, 0x8b, 0x44, + 0x24, 0x08, 0x89, 0x44, 0x24, 0x28, 0x89, 0x54, + 0x24, 0x24, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, + 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_3.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 6c 24 2c movl 0x2c(%esp), %ebp + // b: 8b 54 24 28 movl 0x28(%esp), %edx + // f: 8b 44 24 24 movl 0x24(%esp), %eax + // 13: 89 04 24 movl %eax, (%esp) + // 16: 8b 5a ec movl -0x14(%edx), %ebx + // 19: 8b 7b 18 movl 0x18(%ebx), %edi + // 1c: 8b b5 94 00 00 00 movl 0x94(%ebp), %esi + // 22: 8b 4f 34 movl 0x34(%edi), %ecx + // 25: 8d 0c 8e leal (%esi,%ecx,4), %ecx + // 28: 8b 42 f0 movl -0x10(%edx), %eax + // 2b: 89 6c 24 0c movl %ebp, 0xc(%esp) + // 2f: 89 8d 94 00 00 00 movl %ecx, 0x94(%ebp) + // 35: 89 44 24 08 movl %eax, 0x8(%esp) + // 39: 83 f8 01 cmpl $0x1, %eax + // 3c: bd 03 00 00 00 movl $0x3, %ebp + // 41: 83 dd ff sbbl $-0x1, %ebp + // 44: 8b 04 24 movl (%esp), %eax + // 47: 89 46 04 movl %eax, 0x4(%esi) + // 4a: 89 5e 08 movl %ebx, 0x8(%esi) + // 4d: 8b 0f movl (%edi), %ecx + // 4f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 55: 7f 03 jg 0x5a <__JIT_ENTRY+0x5a> + // 57: 41 incl %ecx + // 58: 89 0f movl %ecx, (%edi) + // 5a: 8d 42 f0 leal -0x10(%edx), %eax + // 5d: 89 44 24 04 movl %eax, 0x4(%esp) + // 61: 89 3e movl %edi, (%esi) + // 63: 8b 4b 0c movl 0xc(%ebx), %ecx + // 66: 89 4e 10 movl %ecx, 0x10(%esi) + // 69: 8b 43 08 movl 0x8(%ebx), %eax + // 6c: 89 46 0c movl %eax, 0xc(%esi) + // 6f: c7 46 14 00 00 00 00 movl $0x0, 0x14(%esi) + // 76: 8b 47 30 movl 0x30(%edi), %eax + // 79: 8d 44 86 28 leal 0x28(%esi,%eax,4), %eax + // 7d: 89 46 20 movl %eax, 0x20(%esi) + // 80: c7 46 18 00 00 00 00 movl $0x0, 0x18(%esi) + // 87: 8d 87 80 00 00 00 leal 0x80(%edi), %eax + // 8d: 89 46 1c movl %eax, 0x1c(%esi) + // 90: c7 46 24 00 00 00 00 movl $0x0, 0x24(%esi) + // 97: 39 6f 30 cmpl %ebp, 0x30(%edi) + // 9a: 7e 11 jle 0xad <__JIT_ENTRY+0xad> + // 9c: 8d 46 28 leal 0x28(%esi), %eax + // 9f: 90 nop + // a0: c7 04 a8 00 00 00 00 movl $0x0, (%eax,%ebp,4) + // a7: 45 incl %ebp + // a8: 3b 6f 30 cmpl 0x30(%edi), %ebp + // ab: 7c f3 jl 0xa0 <__JIT_ENTRY+0xa0> + // ad: 31 c0 xorl %eax, %eax + // af: 83 7c 24 08 00 cmpl $0x0, 0x8(%esp) + // b4: 0f 95 c0 setne %al + // b7: 8b 4a f0 movl -0x10(%edx), %ecx + // ba: 89 4e 28 movl %ecx, 0x28(%esi) + // bd: 8b 4a f4 movl -0xc(%edx), %ecx + // c0: 89 4c 86 28 movl %ecx, 0x28(%esi,%eax,4) + // c4: 8b 4a f8 movl -0x8(%edx), %ecx + // c7: 89 4c 86 2c movl %ecx, 0x2c(%esi,%eax,4) + // cb: 8b 4a fc movl -0x4(%edx), %ecx + // ce: 89 4c 86 30 movl %ecx, 0x30(%esi,%eax,4) + // d2: 89 72 ec movl %esi, -0x14(%edx) + // d5: 8b 44 24 0c movl 0xc(%esp), %eax + // d9: 89 44 24 2c movl %eax, 0x2c(%esp) + // dd: 8b 44 24 04 movl 0x4(%esp), %eax + // e1: 89 44 24 28 movl %eax, 0x28(%esp) + // e5: 8b 04 24 movl (%esp), %eax + // e8: 89 44 24 24 movl %eax, 0x24(%esp) + // ec: 83 c4 10 addl $0x10, %esp + // ef: 5e popl %esi + // f0: 5f popl %edi + // f1: 5b popl %ebx + // f2: 5d popl %ebp + // f3: e9 00 00 00 00 jmp 0xf8 <__JIT_ENTRY+0xf8> + // 000000f4: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[243] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x6c, 0x24, 0x2c, 0x8b, 0x54, 0x24, 0x28, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x5a, + 0xec, 0x8b, 0x7b, 0x18, 0x8b, 0xb5, 0x94, 0x00, + 0x00, 0x00, 0x8b, 0x4f, 0x34, 0x8d, 0x0c, 0x8e, + 0x8b, 0x42, 0xf0, 0x89, 0x6c, 0x24, 0x0c, 0x89, + 0x8d, 0x94, 0x00, 0x00, 0x00, 0x89, 0x44, 0x24, + 0x08, 0x83, 0xf8, 0x01, 0xbd, 0x03, 0x00, 0x00, + 0x00, 0x83, 0xdd, 0xff, 0x8b, 0x04, 0x24, 0x89, + 0x46, 0x04, 0x89, 0x5e, 0x08, 0x8b, 0x0f, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x41, + 0x89, 0x0f, 0x8d, 0x42, 0xf0, 0x89, 0x44, 0x24, + 0x04, 0x89, 0x3e, 0x8b, 0x4b, 0x0c, 0x89, 0x4e, + 0x10, 0x8b, 0x43, 0x08, 0x89, 0x46, 0x0c, 0xc7, + 0x46, 0x14, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x47, + 0x30, 0x8d, 0x44, 0x86, 0x28, 0x89, 0x46, 0x20, + 0xc7, 0x46, 0x18, 0x00, 0x00, 0x00, 0x00, 0x8d, + 0x87, 0x80, 0x00, 0x00, 0x00, 0x89, 0x46, 0x1c, + 0xc7, 0x46, 0x24, 0x00, 0x00, 0x00, 0x00, 0x39, + 0x6f, 0x30, 0x7e, 0x11, 0x8d, 0x46, 0x28, 0x90, + 0xc7, 0x04, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x3b, 0x6f, 0x30, 0x7c, 0xf3, 0x31, 0xc0, 0x83, + 0x7c, 0x24, 0x08, 0x00, 0x0f, 0x95, 0xc0, 0x8b, + 0x4a, 0xf0, 0x89, 0x4e, 0x28, 0x8b, 0x4a, 0xf4, + 0x89, 0x4c, 0x86, 0x28, 0x8b, 0x4a, 0xf8, 0x89, + 0x4c, 0x86, 0x2c, 0x8b, 0x4a, 0xfc, 0x89, 0x4c, + 0x86, 0x30, 0x89, 0x72, 0xec, 0x8b, 0x44, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x2c, 0x8b, 0x44, 0x24, + 0x04, 0x89, 0x44, 0x24, 0x28, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, + 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_4.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // b: 8b 54 24 28 movl 0x28(%esp), %edx + // f: 8b 44 24 24 movl 0x24(%esp), %eax + // 13: 89 04 24 movl %eax, (%esp) + // 16: 8b 6a e8 movl -0x18(%edx), %ebp + // 19: 8b 7d 18 movl 0x18(%ebp), %edi + // 1c: 8b b3 94 00 00 00 movl 0x94(%ebx), %esi + // 22: 8b 4f 34 movl 0x34(%edi), %ecx + // 25: 8d 0c 8e leal (%esi,%ecx,4), %ecx + // 28: 8b 42 ec movl -0x14(%edx), %eax + // 2b: 89 5c 24 0c movl %ebx, 0xc(%esp) + // 2f: 89 8b 94 00 00 00 movl %ecx, 0x94(%ebx) + // 35: 89 44 24 08 movl %eax, 0x8(%esp) + // 39: 83 f8 01 cmpl $0x1, %eax + // 3c: bb 04 00 00 00 movl $0x4, %ebx + // 41: 83 db ff sbbl $-0x1, %ebx + // 44: 8b 04 24 movl (%esp), %eax + // 47: 89 46 04 movl %eax, 0x4(%esi) + // 4a: 89 6e 08 movl %ebp, 0x8(%esi) + // 4d: 8b 0f movl (%edi), %ecx + // 4f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 55: 7f 03 jg 0x5a <__JIT_ENTRY+0x5a> + // 57: 41 incl %ecx + // 58: 89 0f movl %ecx, (%edi) + // 5a: 8d 42 ec leal -0x14(%edx), %eax + // 5d: 89 44 24 04 movl %eax, 0x4(%esp) + // 61: 89 3e movl %edi, (%esi) + // 63: 8b 4d 0c movl 0xc(%ebp), %ecx + // 66: 89 4e 10 movl %ecx, 0x10(%esi) + // 69: 8b 45 08 movl 0x8(%ebp), %eax + // 6c: 89 46 0c movl %eax, 0xc(%esi) + // 6f: c7 46 14 00 00 00 00 movl $0x0, 0x14(%esi) + // 76: 8b 47 30 movl 0x30(%edi), %eax + // 79: 8d 44 86 28 leal 0x28(%esi,%eax,4), %eax + // 7d: 89 46 20 movl %eax, 0x20(%esi) + // 80: c7 46 18 00 00 00 00 movl $0x0, 0x18(%esi) + // 87: 8d 87 80 00 00 00 leal 0x80(%edi), %eax + // 8d: 89 46 1c movl %eax, 0x1c(%esi) + // 90: c7 46 24 00 00 00 00 movl $0x0, 0x24(%esi) + // 97: 39 5f 30 cmpl %ebx, 0x30(%edi) + // 9a: 7e 11 jle 0xad <__JIT_ENTRY+0xad> + // 9c: 8d 46 28 leal 0x28(%esi), %eax + // 9f: 90 nop + // a0: c7 04 98 00 00 00 00 movl $0x0, (%eax,%ebx,4) + // a7: 43 incl %ebx + // a8: 3b 5f 30 cmpl 0x30(%edi), %ebx + // ab: 7c f3 jl 0xa0 <__JIT_ENTRY+0xa0> + // ad: 31 c0 xorl %eax, %eax + // af: 83 7c 24 08 00 cmpl $0x0, 0x8(%esp) + // b4: 0f 95 c0 setne %al + // b7: 8b 4a ec movl -0x14(%edx), %ecx + // ba: 89 4e 28 movl %ecx, 0x28(%esi) + // bd: 8b 4a f0 movl -0x10(%edx), %ecx + // c0: 89 4c 86 28 movl %ecx, 0x28(%esi,%eax,4) + // c4: 8b 4a f4 movl -0xc(%edx), %ecx + // c7: 89 4c 86 2c movl %ecx, 0x2c(%esi,%eax,4) + // cb: 8b 4a f8 movl -0x8(%edx), %ecx + // ce: 89 4c 86 30 movl %ecx, 0x30(%esi,%eax,4) + // d2: 8b 4a fc movl -0x4(%edx), %ecx + // d5: 89 4c 86 34 movl %ecx, 0x34(%esi,%eax,4) + // d9: 89 72 e8 movl %esi, -0x18(%edx) + // dc: 8b 44 24 0c movl 0xc(%esp), %eax + // e0: 89 44 24 2c movl %eax, 0x2c(%esp) + // e4: 8b 44 24 04 movl 0x4(%esp), %eax + // e8: 89 44 24 28 movl %eax, 0x28(%esp) + // ec: 8b 04 24 movl (%esp), %eax + // ef: 89 44 24 24 movl %eax, 0x24(%esp) + // f3: 83 c4 10 addl $0x10, %esp + // f6: 5e popl %esi + // f7: 5f popl %edi + // f8: 5b popl %ebx + // f9: 5d popl %ebp + // fa: e9 00 00 00 00 jmp 0xff <__JIT_ENTRY+0xff> + // 000000fb: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[250] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x5c, 0x24, 0x2c, 0x8b, 0x54, 0x24, 0x28, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x6a, + 0xe8, 0x8b, 0x7d, 0x18, 0x8b, 0xb3, 0x94, 0x00, + 0x00, 0x00, 0x8b, 0x4f, 0x34, 0x8d, 0x0c, 0x8e, + 0x8b, 0x42, 0xec, 0x89, 0x5c, 0x24, 0x0c, 0x89, + 0x8b, 0x94, 0x00, 0x00, 0x00, 0x89, 0x44, 0x24, + 0x08, 0x83, 0xf8, 0x01, 0xbb, 0x04, 0x00, 0x00, + 0x00, 0x83, 0xdb, 0xff, 0x8b, 0x04, 0x24, 0x89, + 0x46, 0x04, 0x89, 0x6e, 0x08, 0x8b, 0x0f, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x41, + 0x89, 0x0f, 0x8d, 0x42, 0xec, 0x89, 0x44, 0x24, + 0x04, 0x89, 0x3e, 0x8b, 0x4d, 0x0c, 0x89, 0x4e, + 0x10, 0x8b, 0x45, 0x08, 0x89, 0x46, 0x0c, 0xc7, + 0x46, 0x14, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x47, + 0x30, 0x8d, 0x44, 0x86, 0x28, 0x89, 0x46, 0x20, + 0xc7, 0x46, 0x18, 0x00, 0x00, 0x00, 0x00, 0x8d, + 0x87, 0x80, 0x00, 0x00, 0x00, 0x89, 0x46, 0x1c, + 0xc7, 0x46, 0x24, 0x00, 0x00, 0x00, 0x00, 0x39, + 0x5f, 0x30, 0x7e, 0x11, 0x8d, 0x46, 0x28, 0x90, + 0xc7, 0x04, 0x98, 0x00, 0x00, 0x00, 0x00, 0x43, + 0x3b, 0x5f, 0x30, 0x7c, 0xf3, 0x31, 0xc0, 0x83, + 0x7c, 0x24, 0x08, 0x00, 0x0f, 0x95, 0xc0, 0x8b, + 0x4a, 0xec, 0x89, 0x4e, 0x28, 0x8b, 0x4a, 0xf0, + 0x89, 0x4c, 0x86, 0x28, 0x8b, 0x4a, 0xf4, 0x89, + 0x4c, 0x86, 0x2c, 0x8b, 0x4a, 0xf8, 0x89, 0x4c, + 0x86, 0x30, 0x8b, 0x4a, 0xfc, 0x89, 0x4c, 0x86, + 0x34, 0x89, 0x72, 0xe8, 0x8b, 0x44, 0x24, 0x0c, + 0x89, 0x44, 0x24, 0x2c, 0x8b, 0x44, 0x24, 0x04, + 0x89, 0x44, 0x24, 0x28, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, + 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__IS_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_NONE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 7c 24 18 movl 0x18(%esp), %edi + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 47 fc movl -0x4(%edi), %eax + // 13: 3d 00 00 00 00 cmpl $0x0, %eax + // 00000014: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 18: 74 1f je 0x39 <__JIT_ENTRY+0x39> + // 1a: 8b 08 movl (%eax), %ecx + // 1c: bd 00 00 00 00 movl $0x0, %ebp + // 0000001d: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 21: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 27: 7f 15 jg 0x3e <__JIT_ENTRY+0x3e> + // 29: 49 decl %ecx + // 2a: 89 08 movl %ecx, (%eax) + // 2c: 75 10 jne 0x3e <__JIT_ENTRY+0x3e> + // 2e: 50 pushl %eax + // 2f: e8 00 00 00 00 calll 0x34 <__JIT_ENTRY+0x34> + // 00000030: IMAGE_REL_I386_REL32 __Py_Dealloc + // 34: 83 c4 04 addl $0x4, %esp + // 37: eb 05 jmp 0x3e <__JIT_ENTRY+0x3e> + // 39: bd 00 00 00 00 movl $0x0, %ebp + // 0000003a: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 3e: 89 6f fc movl %ebp, -0x4(%edi) + // 41: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 45: 89 7c 24 18 movl %edi, 0x18(%esp) + // 49: 89 74 24 14 movl %esi, 0x14(%esp) + // 4d: 5e popl %esi + // 4e: 5f popl %edi + // 4f: 5b popl %ebx + // 50: 5d popl %ebp + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x47, 0xfc, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x1f, 0x8b, 0x08, 0xbd, 0x00, 0x00, 0x00, + 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x15, 0x49, 0x89, 0x08, 0x75, 0x10, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0xeb, + 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x89, 0x6f, + 0xfc, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, (uintptr_t)&_Py_NoneStruct); + patch_32(code + 0x1d, (uintptr_t)&_Py_FalseStruct); + patch_x86_64_32rx(code + 0x30, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x3a, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__IS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_OP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 44 24 04 movl %eax, 0x4(%esp) + // f: 8b 5c 24 20 movl 0x20(%esp), %ebx + // 13: 8b 54 24 1c movl 0x1c(%esp), %edx + // 17: 8b 6b f8 movl -0x8(%ebx), %ebp + // 1a: 8b 73 fc movl -0x4(%ebx), %esi + // 1d: 8b 45 00 movl (%ebp), %eax + // 20: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 25: 7f 06 jg 0x2d <__JIT_ENTRY+0x2d> + // 27: 48 decl %eax + // 28: 89 45 00 movl %eax, (%ebp) + // 2b: 74 24 je 0x51 <__JIT_ENTRY+0x51> + // 2d: 8d 7b fc leal -0x4(%ebx), %edi + // 30: 8b 06 movl (%esi), %eax + // 32: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 37: 7f 31 jg 0x6a <__JIT_ENTRY+0x6a> + // 39: 48 decl %eax + // 3a: 89 06 movl %eax, (%esi) + // 3c: 75 2c jne 0x6a <__JIT_ENTRY+0x6a> + // 3e: 56 pushl %esi + // 3f: 89 54 24 04 movl %edx, 0x4(%esp) + // 43: e8 00 00 00 00 calll 0x48 <__JIT_ENTRY+0x48> + // 00000044: IMAGE_REL_I386_REL32 __Py_Dealloc + // 48: 8b 54 24 04 movl 0x4(%esp), %edx + // 4c: 83 c4 04 addl $0x4, %esp + // 4f: eb 19 jmp 0x6a <__JIT_ENTRY+0x6a> + // 51: 55 pushl %ebp + // 52: 89 d7 movl %edx, %edi + // 54: e8 00 00 00 00 calll 0x59 <__JIT_ENTRY+0x59> + // 00000055: IMAGE_REL_I386_REL32 __Py_Dealloc + // 59: 89 fa movl %edi, %edx + // 5b: 83 c4 04 addl $0x4, %esp + // 5e: 8d 7b fc leal -0x4(%ebx), %edi + // 61: 8b 06 movl (%esi), %eax + // 63: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 68: 7e cf jle 0x39 <__JIT_ENTRY+0x39> + // 6a: 31 c0 xorl %eax, %eax + // 6c: 39 f5 cmpl %esi, %ebp + // 6e: 0f 94 c0 sete %al + // 71: b9 00 00 00 00 movl $0x0, %ecx + // 00000072: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 76: 66 39 c8 cmpw %cx, %ax + // 79: b8 00 00 00 00 movl $0x0, %eax + // 0000007a: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 7e: b9 00 00 00 00 movl $0x0, %ecx + // 0000007f: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 83: 0f 44 c8 cmovel %eax, %ecx + // 86: 89 4b f8 movl %ecx, -0x8(%ebx) + // 89: 8b 44 24 04 movl 0x4(%esp), %eax + // 8d: 89 44 24 24 movl %eax, 0x24(%esp) + // 91: 89 7c 24 20 movl %edi, 0x20(%esp) + // 95: 89 54 24 1c movl %edx, 0x1c(%esp) + // 99: 83 c4 08 addl $0x8, %esp + // 9c: 5e popl %esi + // 9d: 5f popl %edi + // 9e: 5b popl %ebx + // 9f: 5d popl %ebp + // a0: e9 00 00 00 00 jmp 0xa5 <__JIT_ENTRY+0xa5> + // 000000a1: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[160] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x44, 0x24, 0x04, 0x8b, + 0x5c, 0x24, 0x20, 0x8b, 0x54, 0x24, 0x1c, 0x8b, + 0x6b, 0xf8, 0x8b, 0x73, 0xfc, 0x8b, 0x45, 0x00, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x48, + 0x89, 0x45, 0x00, 0x74, 0x24, 0x8d, 0x7b, 0xfc, + 0x8b, 0x06, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x31, 0x48, 0x89, 0x06, 0x75, 0x2c, 0x56, 0x89, + 0x54, 0x24, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0xeb, + 0x19, 0x55, 0x89, 0xd7, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xfa, 0x83, 0xc4, 0x04, 0x8d, 0x7b, + 0xfc, 0x8b, 0x06, 0x3d, 0xff, 0xff, 0xff, 0x3f, + 0x7e, 0xcf, 0x31, 0xc0, 0x39, 0xf5, 0x0f, 0x94, + 0xc0, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x66, 0x39, + 0xc8, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x44, 0xc8, 0x89, 0x4b, + 0xf8, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, + 0x24, 0x89, 0x7c, 0x24, 0x20, 0x89, 0x54, 0x24, + 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x44, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x72, instruction->oparg); + patch_32(code + 0x7a, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x7f, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__ITER_CHECK_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_LIST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyListIter_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyListIter_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__ITER_CHECK_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_RANGE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyRangeIter_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyRangeIter_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__ITER_CHECK_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyTupleIter_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyTupleIter_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__ITER_NEXT_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_LIST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // 8: 8b 54 24 18 movl 0x18(%esp), %edx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 72 fc movl -0x4(%edx), %esi + // 13: 8b 7e 08 movl 0x8(%esi), %edi + // 16: 8b 5e 0c movl 0xc(%esi), %ebx + // 19: 8b 5b 0c movl 0xc(%ebx), %ebx + // 1c: 8d 6f 01 leal 0x1(%edi), %ebp + // 1f: 89 6e 08 movl %ebp, 0x8(%esi) + // 22: 8b 34 bb movl (%ebx,%edi,4), %esi + // 25: 8b 3e movl (%esi), %edi + // 27: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 2d: 7f 03 jg 0x32 <__JIT_ENTRY+0x32> + // 2f: 47 incl %edi + // 30: 89 3e movl %edi, (%esi) + // 32: 89 32 movl %esi, (%edx) + // 34: 83 c2 04 addl $0x4, %edx + // 37: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 3b: 89 54 24 18 movl %edx, 0x18(%esp) + // 3f: 89 44 24 14 movl %eax, 0x14(%esp) + // 43: 5e popl %esi + // 44: 5f popl %edi + // 45: 5b popl %ebx + // 46: 5d popl %ebp + // 47: e9 00 00 00 00 jmp 0x4c <__JIT_ENTRY+0x4c> + // 00000048: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[71] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x1c, + 0x8b, 0x54, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x72, 0xfc, 0x8b, 0x7e, 0x08, 0x8b, 0x5e, + 0x0c, 0x8b, 0x5b, 0x0c, 0x8d, 0x6f, 0x01, 0x89, + 0x6e, 0x08, 0x8b, 0x34, 0xbb, 0x8b, 0x3e, 0x81, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x47, + 0x89, 0x3e, 0x89, 0x32, 0x83, 0xc2, 0x04, 0x89, + 0x4c, 0x24, 0x1c, 0x89, 0x54, 0x24, 0x18, 0x89, + 0x44, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__ITER_NEXT_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_RANGE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 5c 24 18 movl 0x18(%esp), %ebx + // 7: 8b 7c 24 14 movl 0x14(%esp), %edi + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 47 fc movl -0x4(%edi), %eax + // 12: 8b 48 08 movl 0x8(%eax), %ecx + // 15: 8b 50 0c movl 0xc(%eax), %edx + // 18: 01 ca addl %ecx, %edx + // 1a: 89 50 08 movl %edx, 0x8(%eax) + // 1d: ff 48 10 decl 0x10(%eax) + // 20: 51 pushl %ecx + // 21: e8 00 00 00 00 calll 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 _PyLong_FromLong + // 26: 83 c4 04 addl $0x4, %esp + // 29: 85 c0 testl %eax, %eax + // 2b: 74 19 je 0x46 <__JIT_ENTRY+0x46> + // 2d: 89 07 movl %eax, (%edi) + // 2f: 83 c7 04 addl $0x4, %edi + // 32: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 36: 89 7c 24 14 movl %edi, 0x14(%esp) + // 3a: 89 74 24 10 movl %esi, 0x10(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: 5b popl %ebx + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 46: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 4a: 89 7c 24 14 movl %edi, 0x14(%esp) + // 4e: 89 74 24 10 movl %esi, 0x10(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: 5b popl %ebx + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[90] = { + 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x18, 0x8b, + 0x7c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x47, 0xfc, 0x8b, 0x48, 0x08, 0x8b, 0x50, 0x0c, + 0x01, 0xca, 0x89, 0x50, 0x08, 0xff, 0x48, 0x10, + 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x85, 0xc0, 0x74, 0x19, 0x89, 0x07, 0x83, + 0xc7, 0x04, 0x89, 0x5c, 0x24, 0x18, 0x89, 0x7c, + 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, + 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x5c, + 0x24, 0x18, 0x89, 0x7c, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x22, (uintptr_t)&PyLong_FromLong + -0x4); + patch_x86_64_32rx(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x56, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__ITER_NEXT_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // 8: 8b 54 24 18 movl 0x18(%esp), %edx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 72 fc movl -0x4(%edx), %esi + // 13: 8b 7e 08 movl 0x8(%esi), %edi + // 16: 8b 5e 0c movl 0xc(%esi), %ebx + // 19: 8d 6f 01 leal 0x1(%edi), %ebp + // 1c: 89 6e 08 movl %ebp, 0x8(%esi) + // 1f: 8b 74 bb 0c movl 0xc(%ebx,%edi,4), %esi + // 23: 8b 3e movl (%esi), %edi + // 25: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 2b: 7f 03 jg 0x30 <__JIT_ENTRY+0x30> + // 2d: 47 incl %edi + // 2e: 89 3e movl %edi, (%esi) + // 30: 89 32 movl %esi, (%edx) + // 32: 83 c2 04 addl $0x4, %edx + // 35: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 39: 89 54 24 18 movl %edx, 0x18(%esp) + // 3d: 89 44 24 14 movl %eax, 0x14(%esp) + // 41: 5e popl %esi + // 42: 5f popl %edi + // 43: 5b popl %ebx + // 44: 5d popl %ebp + // 45: e9 00 00 00 00 jmp 0x4a <__JIT_ENTRY+0x4a> + // 00000046: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[69] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x1c, + 0x8b, 0x54, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x72, 0xfc, 0x8b, 0x7e, 0x08, 0x8b, 0x5e, + 0x0c, 0x8d, 0x6f, 0x01, 0x89, 0x6e, 0x08, 0x8b, + 0x74, 0xbb, 0x0c, 0x8b, 0x3e, 0x81, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, + 0x89, 0x32, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x1c, 0x89, 0x54, 0x24, 0x18, 0x89, 0x44, 0x24, + 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__JUMP_TO_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _JUMP_TO_TOP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 54 24 04 movl 0x4(%esp), %edx + // c: 89 54 24 04 movl %edx, 0x4(%esp) + // 10: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 14: 89 44 24 0c movl %eax, 0xc(%esp) + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 00000019: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[29] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x54, 0x24, 0x04, 0x89, 0x54, 0x24, 0x04, + 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, 0x0c, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_APPEND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 4c 24 18 movl 0x18(%esp), %ecx + // 10: ba 00 00 00 00 movl $0x0, %edx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: f7 d2 notl %edx + // 17: 8d 59 fc leal -0x4(%ecx), %ebx + // 1a: 8b 41 fc movl -0x4(%ecx), %eax + // 1d: c1 e2 02 shll $0x2, %edx + // 20: 81 ca 00 00 fc ff orl $0xfffc0000, %edx # imm = 0xFFFC0000 + // 26: 8b 0c 11 movl (%ecx,%edx), %ecx + // 29: 8b 51 08 movl 0x8(%ecx), %edx + // 2c: 39 51 10 cmpl %edx, 0x10(%ecx) + // 2f: 7e 0d jle 0x3e <__JIT_ENTRY+0x3e> + // 31: 8b 69 0c movl 0xc(%ecx), %ebp + // 34: 89 44 95 00 movl %eax, (%ebp,%edx,4) + // 38: 42 incl %edx + // 39: 89 51 08 movl %edx, 0x8(%ecx) + // 3c: eb 0e jmp 0x4c <__JIT_ENTRY+0x4c> + // 3e: 50 pushl %eax + // 3f: 51 pushl %ecx + // 40: e8 00 00 00 00 calll 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __PyList_AppendTakeRefListResize + // 45: 83 c4 08 addl $0x8, %esp + // 48: 85 c0 testl %eax, %eax + // 4a: 78 15 js 0x61 <__JIT_ENTRY+0x61> + // 4c: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 50: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 54: 89 74 24 14 movl %esi, 0x14(%esp) + // 58: 5e popl %esi + // 59: 5f popl %edi + // 5a: 5b popl %ebx + // 5b: 5d popl %ebp + // 5c: e9 00 00 00 00 jmp 0x61 <__JIT_ENTRY+0x61> + // 0000005d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 61: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 65: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 69: 89 74 24 14 movl %esi, 0x14(%esp) + // 6d: 5e popl %esi + // 6e: 5f popl %edi + // 6f: 5b popl %ebx + // 70: 5d popl %ebp + // 71: e9 00 00 00 00 jmp 0x76 <__JIT_ENTRY+0x76> + // 00000072: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[118] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x4c, 0x24, 0x18, + 0xba, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd2, 0x8d, + 0x59, 0xfc, 0x8b, 0x41, 0xfc, 0xc1, 0xe2, 0x02, + 0x81, 0xca, 0x00, 0x00, 0xfc, 0xff, 0x8b, 0x0c, + 0x11, 0x8b, 0x51, 0x08, 0x39, 0x51, 0x10, 0x7e, + 0x0d, 0x8b, 0x69, 0x0c, 0x89, 0x44, 0x95, 0x00, + 0x42, 0x89, 0x51, 0x08, 0xeb, 0x0e, 0x50, 0x51, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x85, 0xc0, 0x78, 0x15, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x5c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x5c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x41, (uintptr_t)&_PyList_AppendTakeRefListResize + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x72, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LIST_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_EXTEND.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: f7 d1 notl %ecx + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: c1 e1 02 shll $0x2, %ecx + // 1d: 81 c9 00 00 fc ff orl $0xfffc0000, %ecx # imm = 0xFFFC0000 + // 23: 8b 0c 08 movl (%eax,%ecx), %ecx + // 26: 89 46 20 movl %eax, 0x20(%esi) + // 29: 53 pushl %ebx + // 2a: 51 pushl %ecx + // 2b: e8 00 00 00 00 calll 0x30 <__JIT_ENTRY+0x30> + // 0000002c: IMAGE_REL_I386_REL32 __PyList_Extend + // 30: 83 c4 08 addl $0x8, %esp + // 33: 8b 6e 20 movl 0x20(%esi), %ebp + // 36: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3d: 85 c0 testl %eax, %eax + // 3f: 74 2f je 0x70 <__JIT_ENTRY+0x70> + // 41: 8b 03 movl (%ebx), %eax + // 43: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 48: 7f 0e jg 0x58 <__JIT_ENTRY+0x58> + // 4a: 48 decl %eax + // 4b: 89 03 movl %eax, (%ebx) + // 4d: 75 09 jne 0x58 <__JIT_ENTRY+0x58> + // 4f: 53 pushl %ebx + // 50: e8 00 00 00 00 calll 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __Py_Dealloc + // 55: 83 c4 04 addl $0x4, %esp + // 58: 83 c5 fc addl $-0x4, %ebp + // 5b: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 5f: 89 74 24 14 movl %esi, 0x14(%esp) + // 63: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 67: 5e popl %esi + // 68: 5f popl %edi + // 69: 5b popl %ebx + // 6a: 5d popl %ebp + // 6b: e9 00 00 00 00 jmp 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 70: 89 6e 20 movl %ebp, 0x20(%esi) + // 73: ff 35 00 00 00 00 pushl 0x0 + // 00000075: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // 79: 57 pushl %edi + // 7a: e8 00 00 00 00 calll 0x7f <__JIT_ENTRY+0x7f> + // 0000007b: IMAGE_REL_I386_REL32 __PyErr_ExceptionMatches + // 7f: 83 c4 08 addl $0x8, %esp + // 82: 8b 6e 20 movl 0x20(%esi), %ebp + // 85: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8c: 85 c0 testl %eax, %eax + // 8e: 74 46 je 0xd6 <__JIT_ENTRY+0xd6> + // 90: 8b 43 04 movl 0x4(%ebx), %eax + // 93: 83 78 6c 00 cmpl $0x0, 0x6c(%eax) + // 97: 75 3d jne 0xd6 <__JIT_ENTRY+0xd6> + // 99: 53 pushl %ebx + // 9a: e8 00 00 00 00 calll 0x9f <__JIT_ENTRY+0x9f> + // 0000009b: IMAGE_REL_I386_REL32 _PySequence_Check + // 9f: 83 c4 04 addl $0x4, %esp + // a2: 85 c0 testl %eax, %eax + // a4: 75 30 jne 0xd6 <__JIT_ENTRY+0xd6> + // a6: 89 6e 20 movl %ebp, 0x20(%esi) + // a9: 57 pushl %edi + // aa: e8 00 00 00 00 calll 0xaf <__JIT_ENTRY+0xaf> + // 000000ab: IMAGE_REL_I386_REL32 __PyErr_Clear + // af: 83 c4 04 addl $0x4, %esp + // b2: 8b 43 04 movl 0x4(%ebx), %eax + // b5: ff 70 0c pushl 0xc(%eax) + // b8: 68 00 00 00 00 pushl $0x0 + // 000000b9: IMAGE_REL_I386_DIR32 ??_C@_0CO@OBBMLOHJ@Value?5after?5?$CK?5must?5be?5an?5iterabl@ + // bd: ff 35 00 00 00 00 pushl 0x0 + // 000000bf: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // c3: 57 pushl %edi + // c4: e8 00 00 00 00 calll 0xc9 <__JIT_ENTRY+0xc9> + // 000000c5: IMAGE_REL_I386_REL32 __PyErr_Format + // c9: 83 c4 10 addl $0x10, %esp + // cc: 8b 6e 20 movl 0x20(%esi), %ebp + // cf: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // d6: 8b 03 movl (%ebx), %eax + // d8: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // dd: 7f 0e jg 0xed <__JIT_ENTRY+0xed> + // df: 48 decl %eax + // e0: 89 03 movl %eax, (%ebx) + // e2: 75 09 jne 0xed <__JIT_ENTRY+0xed> + // e4: 53 pushl %ebx + // e5: e8 00 00 00 00 calll 0xea <__JIT_ENTRY+0xea> + // 000000e6: IMAGE_REL_I386_REL32 __Py_Dealloc + // ea: 83 c4 04 addl $0x4, %esp + // ed: 83 c5 fc addl $-0x4, %ebp + // f0: 89 7c 24 1c movl %edi, 0x1c(%esp) + // f4: 89 74 24 14 movl %esi, 0x14(%esp) + // f8: 89 6c 24 18 movl %ebp, 0x18(%esp) + // fc: 5e popl %esi + // fd: 5f popl %edi + // fe: 5b popl %ebx + // ff: 5d popl %ebp + // 100: e9 00 00 00 00 jmp 0x105 <__JIT_ENTRY+0x105> + // 00000101: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[261] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd1, 0x8b, + 0x58, 0xfc, 0xc1, 0xe1, 0x02, 0x81, 0xc9, 0x00, + 0x00, 0xfc, 0xff, 0x8b, 0x0c, 0x08, 0x89, 0x46, + 0x20, 0x53, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x2f, 0x8b, 0x03, 0x3d, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0e, 0x48, 0x89, 0x03, 0x75, 0x09, 0x53, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x83, 0xc5, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x74, 0x24, 0x14, 0x89, 0x6c, 0x24, 0x18, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x6e, 0x20, 0xff, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x46, + 0x8b, 0x43, 0x04, 0x83, 0x78, 0x6c, 0x00, 0x75, + 0x3d, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x85, 0xc0, 0x75, 0x30, 0x89, 0x6e, + 0x20, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x43, 0x04, 0xff, 0x70, 0x0c, + 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x10, 0x8b, 0x6e, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, + 0x89, 0x03, 0x75, 0x09, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x83, 0xc5, 0xfc, + 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x74, 0x24, 0x14, + 0x89, 0x6c, 0x24, 0x18, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'Value after * must be an iterable, not %.200s\x00' + // 2e: 00 00 + const unsigned char data_body[48] = { + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, + 0x2e, 0x32, 0x30, 0x30, 0x73, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)&_PyList_Extend + -0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x75, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)&_PyErr_ExceptionMatches + -0x4); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)&PySequence_Check + -0x4); + patch_x86_64_32rx(code + 0xab, (uintptr_t)&_PyErr_Clear + -0x4); + patch_32(code + 0xb9, (uintptr_t)data); + patch_32(code + 0xbf, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0xe6, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x101, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 44 24 28 movl 0x28(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 5c 24 24 movl 0x24(%esp), %ebx + // 12: 8b 7c 24 20 movl 0x20(%esp), %edi + // 16: ba 00 00 00 00 movl $0x0, %edx + // 00000017: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1b: 8b 73 fc movl -0x4(%ebx), %esi + // 1e: 8b 07 movl (%edi), %eax + // 20: 8b 40 10 movl 0x10(%eax), %eax + // 23: b9 00 00 00 00 movl $0x0, %ecx + // 00000024: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 28: 81 e1 fe ff 00 00 andl $0xfffe, %ecx # imm = 0xFFFE + // 2e: 8b 44 48 0c movl 0xc(%eax,%ecx,2), %eax + // 32: 83 e2 01 andl $0x1, %edx + // 35: 89 54 24 08 movl %edx, 0x8(%esp) + // 39: 75 2f jne 0x6a <__JIT_ENTRY+0x6a> + // 3b: 89 5f 20 movl %ebx, 0x20(%edi) + // 3e: 50 pushl %eax + // 3f: 56 pushl %esi + // 40: e8 00 00 00 00 calll 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 _PyObject_GetAttr + // 45: 83 c4 08 addl $0x8, %esp + // 48: 8b 6f 20 movl 0x20(%edi), %ebp + // 4b: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 52: 8b 0e movl (%esi), %ecx + // 54: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 5a: 7f 05 jg 0x61 <__JIT_ENTRY+0x61> + // 5c: 49 decl %ecx + // 5d: 89 0e movl %ecx, (%esi) + // 5f: 74 5e je 0xbf <__JIT_ENTRY+0xbf> + // 61: 85 c0 testl %eax, %eax + // 63: 75 6b jne 0xd0 <__JIT_ENTRY+0xd0> + // 65: e9 91 00 00 00 jmp 0xfb <__JIT_ENTRY+0xfb> + // 6a: c7 44 24 04 00 00 00 00 movl $0x0, 0x4(%esp) + // 72: 89 5f 20 movl %ebx, 0x20(%edi) + // 75: 8d 4c 24 04 leal 0x4(%esp), %ecx + // 79: 51 pushl %ecx + // 7a: 50 pushl %eax + // 7b: 56 pushl %esi + // 7c: e8 00 00 00 00 calll 0x81 <__JIT_ENTRY+0x81> + // 0000007d: IMAGE_REL_I386_REL32 __PyObject_GetMethod + // 81: 83 c4 0c addl $0xc, %esp + // 84: 8b 6f 20 movl 0x20(%edi), %ebp + // 87: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 8e: 85 c0 testl %eax, %eax + // 90: 74 08 je 0x9a <__JIT_ENTRY+0x9a> + // 92: 8b 44 24 04 movl 0x4(%esp), %eax + // 96: 89 33 movl %esi, (%ebx) + // 98: eb 36 jmp 0xd0 <__JIT_ENTRY+0xd0> + // 9a: 8b 06 movl (%esi), %eax + // 9c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // a1: 7f 0e jg 0xb1 <__JIT_ENTRY+0xb1> + // a3: 48 decl %eax + // a4: 89 06 movl %eax, (%esi) + // a6: 75 09 jne 0xb1 <__JIT_ENTRY+0xb1> + // a8: 56 pushl %esi + // a9: e8 00 00 00 00 calll 0xae <__JIT_ENTRY+0xae> + // 000000aa: IMAGE_REL_I386_REL32 __Py_Dealloc + // ae: 83 c4 04 addl $0x4, %esp + // b1: 8b 44 24 04 movl 0x4(%esp), %eax + // b5: 31 f6 xorl %esi, %esi + // b7: 85 c0 testl %eax, %eax + // b9: 74 40 je 0xfb <__JIT_ENTRY+0xfb> + // bb: 89 33 movl %esi, (%ebx) + // bd: eb 11 jmp 0xd0 <__JIT_ENTRY+0xd0> + // bf: 56 pushl %esi + // c0: 89 c6 movl %eax, %esi + // c2: e8 00 00 00 00 calll 0xc7 <__JIT_ENTRY+0xc7> + // 000000c3: IMAGE_REL_I386_REL32 __Py_Dealloc + // c7: 89 f0 movl %esi, %eax + // c9: 83 c4 04 addl $0x4, %esp + // cc: 85 c0 testl %eax, %eax + // ce: 74 2b je 0xfb <__JIT_ENTRY+0xfb> + // d0: 89 45 fc movl %eax, -0x4(%ebp) + // d3: 8b 44 24 08 movl 0x8(%esp), %eax + // d7: 8d 04 85 00 00 00 00 leal (,%eax,4), %eax + // de: 01 e8 addl %ebp, %eax + // e0: 89 7c 24 20 movl %edi, 0x20(%esp) + // e4: 89 44 24 24 movl %eax, 0x24(%esp) + // e8: 8b 04 24 movl (%esp), %eax + // eb: 89 44 24 28 movl %eax, 0x28(%esp) + // ef: 83 c4 0c addl $0xc, %esp + // f2: 5e popl %esi + // f3: 5f popl %edi + // f4: 5b popl %ebx + // f5: 5d popl %ebp + // f6: e9 00 00 00 00 jmp 0xfb <__JIT_ENTRY+0xfb> + // 000000f7: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // fb: 83 c5 fc addl $-0x4, %ebp + // fe: 8b 04 24 movl (%esp), %eax + // 101: 89 44 24 28 movl %eax, 0x28(%esp) + // 105: 89 7c 24 20 movl %edi, 0x20(%esp) + // 109: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 10d: 83 c4 0c addl $0xc, %esp + // 110: 5e popl %esi + // 111: 5f popl %edi + // 112: 5b popl %ebx + // 113: 5d popl %ebp + // 114: e9 00 00 00 00 jmp 0x119 <__JIT_ENTRY+0x119> + // 00000115: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[281] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x44, 0x24, 0x28, 0x89, 0x04, 0x24, 0x8b, 0x5c, + 0x24, 0x24, 0x8b, 0x7c, 0x24, 0x20, 0xba, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x73, 0xfc, 0x8b, 0x07, + 0x8b, 0x40, 0x10, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x81, 0xe1, 0xfe, 0xff, 0x00, 0x00, 0x8b, 0x44, + 0x48, 0x0c, 0x83, 0xe2, 0x01, 0x89, 0x54, 0x24, + 0x08, 0x75, 0x2f, 0x89, 0x5f, 0x20, 0x50, 0x56, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, + 0x8b, 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, 0x74, + 0x5e, 0x85, 0xc0, 0x75, 0x6b, 0xe9, 0x91, 0x00, + 0x00, 0x00, 0xc7, 0x44, 0x24, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x5f, 0x20, 0x8d, 0x4c, 0x24, + 0x04, 0x51, 0x50, 0x56, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x6f, 0x20, 0xc7, + 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x08, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x33, + 0xeb, 0x36, 0x8b, 0x06, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x48, 0x89, 0x06, 0x75, 0x09, + 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x44, 0x24, 0x04, 0x31, 0xf6, 0x85, + 0xc0, 0x74, 0x40, 0x89, 0x33, 0xeb, 0x11, 0x56, + 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x74, 0x2b, + 0x89, 0x45, 0xfc, 0x8b, 0x44, 0x24, 0x08, 0x8d, + 0x04, 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe8, + 0x89, 0x7c, 0x24, 0x20, 0x89, 0x44, 0x24, 0x24, + 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x28, 0x83, + 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc5, 0xfc, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x28, 0x89, 0x7c, 0x24, + 0x20, 0x89, 0x6c, 0x24, 0x24, 0x83, 0xc4, 0x0c, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, instruction->oparg); + patch_32(code + 0x24, instruction->oparg); + patch_x86_64_32rx(code + 0x41, (uintptr_t)&PyObject_GetAttr + -0x4); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)&_PyObject_GetMethod + -0x4); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc3, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x115, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_CLASS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 5c 24 18 movl 0x18(%esp), %ebx + // 7: 8b 7c 24 14 movl 0x14(%esp), %edi + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 47 fc movl -0x4(%edi), %eax + // 12: 8b 0d 00 00 00 00 movl 0x0, %ecx + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 18: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1e: 7f 07 jg 0x27 <__JIT_ENTRY+0x27> + // 20: 41 incl %ecx + // 21: 89 0d 00 00 00 00 movl %ecx, 0x0 + // 00000023: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 27: 8b 08 movl (%eax), %ecx + // 29: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 2f: 7f 0e jg 0x3f <__JIT_ENTRY+0x3f> + // 31: 49 decl %ecx + // 32: 89 08 movl %ecx, (%eax) + // 34: 75 09 jne 0x3f <__JIT_ENTRY+0x3f> + // 36: 50 pushl %eax + // 37: e8 00 00 00 00 calll 0x3c <__JIT_ENTRY+0x3c> + // 00000038: IMAGE_REL_I386_REL32 __Py_Dealloc + // 3c: 83 c4 04 addl $0x4, %esp + // 3f: c7 47 fc 00 00 00 00 movl $0x0, -0x4(%edi) + // 00000042: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 46: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 4a: 89 7c 24 14 movl %edi, 0x14(%esp) + // 4e: 89 74 24 10 movl %esi, 0x10(%esp) + // 52: 5e popl %esi + // 53: 5f popl %edi + // 54: 5b popl %ebx + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[85] = { + 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x18, 0x8b, + 0x7c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x47, 0xfc, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x07, + 0x41, 0x89, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0xc7, + 0x47, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x89, 0x5c, + 0x24, 0x18, 0x89, 0x7c, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x23, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x38, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x42, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_INSTANCE_VALUE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 4c 24 14 movl 0x14(%esp), %ecx + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 41 fc movl -0x4(%ecx), %eax + // 12: ba 00 00 00 00 movl $0x0, %edx + // 00000013: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 17: 0f b7 d2 movzwl %dx, %edx + // 1a: 8b 14 10 movl (%eax,%edx), %edx + // 1d: 85 d2 testl %edx, %edx + // 1f: 74 49 je 0x6a <__JIT_ENTRY+0x6a> + // 21: 8b 1a movl (%edx), %ebx + // 23: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 29: 7f 03 jg 0x2e <__JIT_ENTRY+0x2e> + // 2b: 43 incl %ebx + // 2c: 89 1a movl %ebx, (%edx) + // 2e: 89 51 fc movl %edx, -0x4(%ecx) + // 31: 89 4e 20 movl %ecx, 0x20(%esi) + // 34: 8b 08 movl (%eax), %ecx + // 36: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3c: 7f 0e jg 0x4c <__JIT_ENTRY+0x4c> + // 3e: 49 decl %ecx + // 3f: 89 08 movl %ecx, (%eax) + // 41: 75 09 jne 0x4c <__JIT_ENTRY+0x4c> + // 43: 50 pushl %eax + // 44: e8 00 00 00 00 calll 0x49 <__JIT_ENTRY+0x49> + // 00000045: IMAGE_REL_I386_REL32 __Py_Dealloc + // 49: 83 c4 04 addl $0x4, %esp + // 4c: 8b 46 20 movl 0x20(%esi), %eax + // 4f: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 56: 89 7c 24 18 movl %edi, 0x18(%esp) + // 5a: 89 44 24 14 movl %eax, 0x14(%esp) + // 5e: 89 74 24 10 movl %esi, 0x10(%esp) + // 62: 5e popl %esi + // 63: 5f popl %edi + // 64: 5b popl %ebx + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 6a: 89 7c 24 18 movl %edi, 0x18(%esp) + // 6e: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 72: 89 74 24 10 movl %esi, 0x10(%esp) + // 76: 5e popl %esi + // 77: 5f popl %edi + // 78: 5b popl %ebx + // 79: e9 00 00 00 00 jmp 0x7e <__JIT_ENTRY+0x7e> + // 0000007a: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[126] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x4c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x41, 0xfc, 0xba, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xd2, 0x8b, 0x14, 0x10, 0x85, 0xd2, 0x74, + 0x49, 0x8b, 0x1a, 0x81, 0xfb, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x43, 0x89, 0x1a, 0x89, 0x51, + 0xfc, 0x89, 0x4e, 0x20, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, + 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x4c, + 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, + 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x45, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x66, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x7a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_LAZY_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 72 fc movl -0x4(%edx), %esi + // 11: 8b 3d 00 00 00 00 movl 0x0, %edi + // 00000013: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 17: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 1d: 7f 07 jg 0x26 <__JIT_ENTRY+0x26> + // 1f: 47 incl %edi + // 20: 89 3d 00 00 00 00 movl %edi, 0x0 + // 00000022: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 26: c7 42 fc 00 00 00 00 movl $0x0, -0x4(%edx) + // 00000029: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 2d: 89 32 movl %esi, (%edx) + // 2f: 83 c2 04 addl $0x4, %edx + // 32: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 36: 89 54 24 10 movl %edx, 0x10(%esp) + // 3a: 89 44 24 0c movl %eax, 0xc(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[64] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x72, + 0xfc, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x07, 0x47, + 0x89, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x42, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x89, 0x32, 0x83, + 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x22, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x29, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_ATTR_METHOD_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_NO_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 72 fc movl -0x4(%edx), %esi + // 11: 8b 3d 00 00 00 00 movl 0x0, %edi + // 00000013: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 17: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 1d: 7f 07 jg 0x26 <__JIT_ENTRY+0x26> + // 1f: 47 incl %edi + // 20: 89 3d 00 00 00 00 movl %edi, 0x0 + // 00000022: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 26: c7 42 fc 00 00 00 00 movl $0x0, -0x4(%edx) + // 00000029: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 2d: 89 32 movl %esi, (%edx) + // 2f: 83 c2 04 addl $0x4, %edx + // 32: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 36: 89 54 24 10 movl %edx, 0x10(%esp) + // 3a: 89 44 24 0c movl %eax, 0xc(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[64] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x72, + 0xfc, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x07, 0x47, + 0x89, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x42, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x89, 0x32, 0x83, + 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x22, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x29, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_ATTR_METHOD_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_WITH_VALUES.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 72 fc movl -0x4(%edx), %esi + // 11: 8b 3d 00 00 00 00 movl 0x0, %edi + // 00000013: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 17: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 1d: 7f 07 jg 0x26 <__JIT_ENTRY+0x26> + // 1f: 47 incl %edi + // 20: 89 3d 00 00 00 00 movl %edi, 0x0 + // 00000022: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 26: c7 42 fc 00 00 00 00 movl $0x0, -0x4(%edx) + // 00000029: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 2d: 89 32 movl %esi, (%edx) + // 2f: 83 c2 04 addl $0x4, %edx + // 32: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 36: 89 54 24 10 movl %edx, 0x10(%esp) + // 3a: 89 44 24 0c movl %eax, 0xc(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[64] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x72, + 0xfc, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x07, 0x47, + 0x89, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x42, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x89, 0x32, 0x83, + 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x22, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x29, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_ATTR_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 7c 24 18 movl 0x18(%esp), %edi + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 47 fc movl -0x4(%edi), %eax + // 13: 8b 48 08 movl 0x8(%eax), %ecx + // 16: 8b 51 18 movl 0x18(%ecx), %edx + // 19: 0f b6 4a 05 movzbl 0x5(%edx), %ecx + // 1d: bd 01 00 00 00 movl $0x1, %ebp + // 22: d3 e5 shll %cl, %ebp + // 24: 01 d5 addl %edx, %ebp + // 26: b9 00 00 00 00 movl $0x0, %ecx + // 00000027: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 2b: 0f b7 c9 movzwl %cx, %ecx + // 2e: 8b 6c cd 18 movl 0x18(%ebp,%ecx,8), %ebp + // 32: 85 ed testl %ebp, %ebp + // 34: 74 3f je 0x75 <__JIT_ENTRY+0x75> + // 36: 8b 4d 00 movl (%ebp), %ecx + // 39: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3f: 7f 04 jg 0x45 <__JIT_ENTRY+0x45> + // 41: 41 incl %ecx + // 42: 89 4d 00 movl %ecx, (%ebp) + // 45: 8b 08 movl (%eax), %ecx + // 47: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4d: 7f 0e jg 0x5d <__JIT_ENTRY+0x5d> + // 4f: 49 decl %ecx + // 50: 89 08 movl %ecx, (%eax) + // 52: 75 09 jne 0x5d <__JIT_ENTRY+0x5d> + // 54: 50 pushl %eax + // 55: e8 00 00 00 00 calll 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5a: 83 c4 04 addl $0x4, %esp + // 5d: 89 6f fc movl %ebp, -0x4(%edi) + // 60: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 64: 89 7c 24 18 movl %edi, 0x18(%esp) + // 68: 89 74 24 14 movl %esi, 0x14(%esp) + // 6c: 5e popl %esi + // 6d: 5f popl %edi + // 6e: 5b popl %ebx + // 6f: 5d popl %ebp + // 70: e9 00 00 00 00 jmp 0x75 <__JIT_ENTRY+0x75> + // 00000071: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 75: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 79: 89 7c 24 18 movl %edi, 0x18(%esp) + // 7d: 89 74 24 14 movl %esi, 0x14(%esp) + // 81: 5e popl %esi + // 82: 5f popl %edi + // 83: 5b popl %ebx + // 84: 5d popl %ebp + // 85: e9 00 00 00 00 jmp 0x8a <__JIT_ENTRY+0x8a> + // 00000086: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[138] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x47, 0xfc, 0x8b, 0x48, 0x08, 0x8b, 0x51, + 0x18, 0x0f, 0xb6, 0x4a, 0x05, 0xbd, 0x01, 0x00, + 0x00, 0x00, 0xd3, 0xe5, 0x01, 0xd5, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, 0x6c, + 0xcd, 0x18, 0x85, 0xed, 0x74, 0x3f, 0x8b, 0x4d, + 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x04, 0x41, 0x89, 0x4d, 0x00, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, + 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x89, 0x6f, 0xfc, + 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x5c, 0x24, + 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, + 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x27, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x56, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x71, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x86, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_ATTR_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE_FROM_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 54 24 18 movl 0x18(%esp), %edx + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8d 42 fc leal -0x4(%edx), %eax + // 13: 8b 5a fc movl -0x4(%edx), %ebx + // 16: 0f b6 4b 05 movzbl 0x5(%ebx), %ecx + // 1a: bd 01 00 00 00 movl $0x1, %ebp + // 1f: d3 e5 shll %cl, %ebp + // 21: 01 dd addl %ebx, %ebp + // 23: b9 00 00 00 00 movl $0x0, %ecx + // 00000024: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 28: 0f b7 c9 movzwl %cx, %ecx + // 2b: 8b 5c cd 18 movl 0x18(%ebp,%ecx,8), %ebx + // 2f: 85 db testl %ebx, %ebx + // 31: 74 4c je 0x7f <__JIT_ENTRY+0x7f> + // 33: 8b 4a f8 movl -0x8(%edx), %ecx + // 36: 8b 2b movl (%ebx), %ebp + // 38: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 3e: 7f 03 jg 0x43 <__JIT_ENTRY+0x43> + // 40: 45 incl %ebp + // 41: 89 2b movl %ebp, (%ebx) + // 43: 89 5a f8 movl %ebx, -0x8(%edx) + // 46: 89 46 20 movl %eax, 0x20(%esi) + // 49: 8b 01 movl (%ecx), %eax + // 4b: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 50: 7f 0e jg 0x60 <__JIT_ENTRY+0x60> + // 52: 48 decl %eax + // 53: 89 01 movl %eax, (%ecx) + // 55: 75 09 jne 0x60 <__JIT_ENTRY+0x60> + // 57: 51 pushl %ecx + // 58: e8 00 00 00 00 calll 0x5d <__JIT_ENTRY+0x5d> + // 00000059: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5d: 83 c4 04 addl $0x4, %esp + // 60: 8b 46 20 movl 0x20(%esi), %eax + // 63: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 6a: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 6e: 89 44 24 18 movl %eax, 0x18(%esp) + // 72: 89 74 24 14 movl %esi, 0x14(%esp) + // 76: 5e popl %esi + // 77: 5f popl %edi + // 78: 5b popl %ebx + // 79: 5d popl %ebp + // 7a: e9 00 00 00 00 jmp 0x7f <__JIT_ENTRY+0x7f> + // 0000007b: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 7f: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 83: 89 44 24 18 movl %eax, 0x18(%esp) + // 87: 89 74 24 14 movl %esi, 0x14(%esp) + // 8b: 5e popl %esi + // 8c: 5f popl %edi + // 8d: 5b popl %ebx + // 8e: 5d popl %ebp + // 8f: e9 00 00 00 00 jmp 0x94 <__JIT_ENTRY+0x94> + // 00000090: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[148] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x54, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8d, 0x42, 0xfc, 0x8b, 0x5a, 0xfc, 0x0f, 0xb6, + 0x4b, 0x05, 0xbd, 0x01, 0x00, 0x00, 0x00, 0xd3, + 0xe5, 0x01, 0xdd, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc9, 0x8b, 0x5c, 0xcd, 0x18, 0x85, + 0xdb, 0x74, 0x4c, 0x8b, 0x4a, 0xf8, 0x8b, 0x2b, + 0x81, 0xfd, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x45, 0x89, 0x2b, 0x89, 0x5a, 0xf8, 0x89, 0x46, + 0x20, 0x8b, 0x01, 0x3d, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0e, 0x48, 0x89, 0x01, 0x75, 0x09, 0x51, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x44, + 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x7c, 0x24, 0x1c, 0x89, 0x44, 0x24, 0x18, 0x89, + 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x24, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x59, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x90, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_NO_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 5c 24 18 movl 0x18(%esp), %ebx + // 7: 8b 7c 24 14 movl 0x14(%esp), %edi + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 47 fc movl -0x4(%edi), %eax + // 12: 8b 08 movl (%eax), %ecx + // 14: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1a: 7f 05 jg 0x21 <__JIT_ENTRY+0x21> + // 1c: 49 decl %ecx + // 1d: 89 08 movl %ecx, (%eax) + // 1f: 74 2d je 0x4e <__JIT_ENTRY+0x4e> + // 21: a1 00 00 00 00 movl 0x0, %eax + // 00000022: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 26: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 2b: 7f 06 jg 0x33 <__JIT_ENTRY+0x33> + // 2d: 40 incl %eax + // 2e: a3 00 00 00 00 movl %eax, 0x0 + // 0000002f: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 33: c7 47 fc 00 00 00 00 movl $0x0, -0x4(%edi) + // 00000036: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 3a: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 3e: 89 7c 24 14 movl %edi, 0x14(%esp) + // 42: 89 74 24 10 movl %esi, 0x10(%esp) + // 46: 5e popl %esi + // 47: 5f popl %edi + // 48: 5b popl %ebx + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 0000004a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 4e: 50 pushl %eax + // 4f: e8 00 00 00 00 calll 0x54 <__JIT_ENTRY+0x54> + // 00000050: IMAGE_REL_I386_REL32 __Py_Dealloc + // 54: 83 c4 04 addl $0x4, %esp + // 57: a1 00 00 00 00 movl 0x0, %eax + // 00000058: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 5c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 61: 7e ca jle 0x2d <__JIT_ENTRY+0x2d> + // 63: eb ce jmp 0x33 <__JIT_ENTRY+0x33> + const unsigned char code_body[101] = { + 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x18, 0x8b, + 0x7c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x47, 0xfc, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x08, 0x74, + 0x2d, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x40, 0xa3, 0x00, + 0x00, 0x00, 0x00, 0xc7, 0x47, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x5c, 0x24, 0x18, 0x89, 0x7c, + 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, + 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0xca, 0xeb, 0xce, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x22, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x2f, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x36, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x58, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 5c 24 18 movl 0x18(%esp), %ebx + // 7: 8b 7c 24 14 movl 0x14(%esp), %edi + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 47 fc movl -0x4(%edi), %eax + // 12: 8b 08 movl (%eax), %ecx + // 14: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1a: 7f 05 jg 0x21 <__JIT_ENTRY+0x21> + // 1c: 49 decl %ecx + // 1d: 89 08 movl %ecx, (%eax) + // 1f: 74 2d je 0x4e <__JIT_ENTRY+0x4e> + // 21: a1 00 00 00 00 movl 0x0, %eax + // 00000022: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 26: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 2b: 7f 06 jg 0x33 <__JIT_ENTRY+0x33> + // 2d: 40 incl %eax + // 2e: a3 00 00 00 00 movl %eax, 0x0 + // 0000002f: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 33: c7 47 fc 00 00 00 00 movl $0x0, -0x4(%edi) + // 00000036: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 3a: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 3e: 89 7c 24 14 movl %edi, 0x14(%esp) + // 42: 89 74 24 10 movl %esi, 0x10(%esp) + // 46: 5e popl %esi + // 47: 5f popl %edi + // 48: 5b popl %ebx + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 0000004a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 4e: 50 pushl %eax + // 4f: e8 00 00 00 00 calll 0x54 <__JIT_ENTRY+0x54> + // 00000050: IMAGE_REL_I386_REL32 __Py_Dealloc + // 54: 83 c4 04 addl $0x4, %esp + // 57: a1 00 00 00 00 movl 0x0, %eax + // 00000058: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 5c: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 61: 7e ca jle 0x2d <__JIT_ENTRY+0x2d> + // 63: eb ce jmp 0x33 <__JIT_ENTRY+0x33> + const unsigned char code_body[101] = { + 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x18, 0x8b, + 0x7c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x47, 0xfc, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x08, 0x74, + 0x2d, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x40, 0xa3, 0x00, + 0x00, 0x00, 0x00, 0xc7, 0x47, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x5c, 0x24, 0x18, 0x89, 0x7c, + 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, + 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0xa1, + 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0xca, 0xeb, 0xce, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x22, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x2f, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x36, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x58, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_ATTR_PROPERTY_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_PROPERTY_FRAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 54 24 20 movl 0x20(%esp), %edx + // 9: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // d: 8b 44 24 18 movl 0x18(%esp), %eax + // 11: 8b 35 18 00 00 00 movl 0x18, %esi + // 00000013: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 17: 8b 7e 18 movl 0x18(%esi), %edi + // 1a: 83 e7 0d andl $0xd, %edi + // 1d: 83 ff 01 cmpl $0x1, %edi + // 20: 0f 85 ef 00 00 00 jne 0x115 <__JIT_ENTRY+0x115> + // 26: 83 7e 24 00 cmpl $0x0, 0x24(%esi) + // 2a: 0f 85 e5 00 00 00 jne 0x115 <__JIT_ENTRY+0x115> + // 30: 83 7e 1c 01 cmpl $0x1, 0x1c(%esi) + // 34: 0f 85 db 00 00 00 jne 0x115 <__JIT_ENTRY+0x115> + // 3a: 8b ba 94 00 00 00 movl 0x94(%edx), %edi + // 40: 85 ff testl %edi, %edi + // 42: 0f 84 cd 00 00 00 je 0x115 <__JIT_ENTRY+0x115> + // 48: 8b 6e 34 movl 0x34(%esi), %ebp + // 4b: 8b 9a 98 00 00 00 movl 0x98(%edx), %ebx + // 51: 29 fb subl %edi, %ebx + // 53: c1 fb 02 sarl $0x2, %ebx + // 56: 39 eb cmpl %ebp, %ebx + // 58: 0f 8e b7 00 00 00 jle 0x115 <__JIT_ENTRY+0x115> + // 5e: 8b 59 fc movl -0x4(%ecx), %ebx + // 61: 89 1c 24 movl %ebx, (%esp) + // 64: 8b 1d 00 00 00 00 movl 0x0, %ebx + // 00000066: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 6a: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 70: 7f 07 jg 0x79 <__JIT_ENTRY+0x79> + // 72: 43 incl %ebx + // 73: 89 1d 00 00 00 00 movl %ebx, 0x0 + // 00000075: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 79: 8d 1c af leal (%edi,%ebp,4), %ebx + // 7c: 89 9a 94 00 00 00 movl %ebx, 0x94(%edx) + // 82: 89 47 04 movl %eax, 0x4(%edi) + // 85: c7 47 08 00 00 00 00 movl $0x0, 0x8(%edi) + // 00000088: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 8c: 8b 1e movl (%esi), %ebx + // 8e: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 94: 7f 03 jg 0x99 <__JIT_ENTRY+0x99> + // 96: 43 incl %ebx + // 97: 89 1e movl %ebx, (%esi) + // 99: 89 37 movl %esi, (%edi) + // 9b: f2 0f 10 05 08 00 00 00 movsd 0x8, %xmm0 + // 0000009f: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // a3: f2 0f 11 47 0c movsd %xmm0, 0xc(%edi) + // a8: c7 47 14 00 00 00 00 movl $0x0, 0x14(%edi) + // af: 8b 5e 30 movl 0x30(%esi), %ebx + // b2: 8d 5c 9f 28 leal 0x28(%edi,%ebx,4), %ebx + // b6: 89 5f 20 movl %ebx, 0x20(%edi) + // b9: c7 47 18 00 00 00 00 movl $0x0, 0x18(%edi) + // c0: 8d 9e 80 00 00 00 leal 0x80(%esi), %ebx + // c6: 89 5f 1c movl %ebx, 0x1c(%edi) + // c9: c7 47 24 00 00 00 00 movl $0x0, 0x24(%edi) + // d0: 83 7e 30 02 cmpl $0x2, 0x30(%esi) + // d4: 7c 1e jl 0xf4 <__JIT_ENTRY+0xf4> + // d6: bd 0b 00 00 00 movl $0xb, %ebp + // db: 0f 1f 44 00 00 nopl (%eax,%eax) + // e0: c7 04 af 00 00 00 00 movl $0x0, (%edi,%ebp,4) + // e7: 8d 5d 01 leal 0x1(%ebp), %ebx + // ea: 83 c5 f7 addl $-0x9, %ebp + // ed: 3b 6e 30 cmpl 0x30(%esi), %ebp + // f0: 89 dd movl %ebx, %ebp + // f2: 7c ec jl 0xe0 <__JIT_ENTRY+0xe0> + // f4: 8b 34 24 movl (%esp), %esi + // f7: 89 77 28 movl %esi, 0x28(%edi) + // fa: 89 79 fc movl %edi, -0x4(%ecx) + // fd: 89 54 24 20 movl %edx, 0x20(%esp) + // 101: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 105: 89 44 24 18 movl %eax, 0x18(%esp) + // 109: 83 c4 04 addl $0x4, %esp + // 10c: 5e popl %esi + // 10d: 5f popl %edi + // 10e: 5b popl %ebx + // 10f: 5d popl %ebp + // 110: e9 00 00 00 00 jmp 0x115 <__JIT_ENTRY+0x115> + // 00000111: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 115: 89 54 24 20 movl %edx, 0x20(%esp) + // 119: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 11d: 89 44 24 18 movl %eax, 0x18(%esp) + // 121: 83 c4 04 addl $0x4, %esp + // 124: 5e popl %esi + // 125: 5f popl %edi + // 126: 5b popl %ebx + // 127: 5d popl %ebp + // 128: e9 00 00 00 00 jmp 0x12d <__JIT_ENTRY+0x12d> + // 00000129: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[301] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x54, 0x24, + 0x20, 0x8b, 0x4c, 0x24, 0x1c, 0x8b, 0x44, 0x24, + 0x18, 0x8b, 0x35, 0x18, 0x00, 0x00, 0x00, 0x8b, + 0x7e, 0x18, 0x83, 0xe7, 0x0d, 0x83, 0xff, 0x01, + 0x0f, 0x85, 0xef, 0x00, 0x00, 0x00, 0x83, 0x7e, + 0x24, 0x00, 0x0f, 0x85, 0xe5, 0x00, 0x00, 0x00, + 0x83, 0x7e, 0x1c, 0x01, 0x0f, 0x85, 0xdb, 0x00, + 0x00, 0x00, 0x8b, 0xba, 0x94, 0x00, 0x00, 0x00, + 0x85, 0xff, 0x0f, 0x84, 0xcd, 0x00, 0x00, 0x00, + 0x8b, 0x6e, 0x34, 0x8b, 0x9a, 0x98, 0x00, 0x00, + 0x00, 0x29, 0xfb, 0xc1, 0xfb, 0x02, 0x39, 0xeb, + 0x0f, 0x8e, 0xb7, 0x00, 0x00, 0x00, 0x8b, 0x59, + 0xfc, 0x89, 0x1c, 0x24, 0x8b, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x81, 0xfb, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x07, 0x43, 0x89, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x8d, 0x1c, 0xaf, 0x89, 0x9a, 0x94, 0x00, + 0x00, 0x00, 0x89, 0x47, 0x04, 0xc7, 0x47, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x1e, 0x81, 0xfb, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x43, 0x89, + 0x1e, 0x89, 0x37, 0xf2, 0x0f, 0x10, 0x05, 0x08, + 0x00, 0x00, 0x00, 0xf2, 0x0f, 0x11, 0x47, 0x0c, + 0xc7, 0x47, 0x14, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x5e, 0x30, 0x8d, 0x5c, 0x9f, 0x28, 0x89, 0x5f, + 0x20, 0xc7, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x8d, 0x9e, 0x80, 0x00, 0x00, 0x00, 0x89, 0x5f, + 0x1c, 0xc7, 0x47, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x7e, 0x30, 0x02, 0x7c, 0x1e, 0xbd, 0x0b, + 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0xc7, 0x04, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x8d, + 0x5d, 0x01, 0x83, 0xc5, 0xf7, 0x3b, 0x6e, 0x30, + 0x89, 0xdd, 0x7c, 0xec, 0x8b, 0x34, 0x24, 0x89, + 0x77, 0x28, 0x89, 0x79, 0xfc, 0x89, 0x54, 0x24, + 0x20, 0x89, 0x4c, 0x24, 0x1c, 0x89, 0x44, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x20, 0x89, 0x4c, 0x24, 0x1c, 0x89, 0x44, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (instruction->operand0 & UINT32_MAX) + 0x18); + patch_32(code + 0x66, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x75, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x88, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x9f, (instruction->operand0 & UINT32_MAX) + 0x8); + patch_x86_64_32rx(code + 0x111, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x129, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_SLOT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 7c 24 18 movl 0x18(%esp), %edi + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 47 fc movl -0x4(%edi), %eax + // 13: b9 00 00 00 00 movl $0x0, %ecx + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 18: 0f b7 c9 movzwl %cx, %ecx + // 1b: 8b 2c 08 movl (%eax,%ecx), %ebp + // 1e: 85 ed testl %ebp, %ebp + // 20: 74 3f je 0x61 <__JIT_ENTRY+0x61> + // 22: 8b 4d 00 movl (%ebp), %ecx + // 25: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 2b: 7f 04 jg 0x31 <__JIT_ENTRY+0x31> + // 2d: 41 incl %ecx + // 2e: 89 4d 00 movl %ecx, (%ebp) + // 31: 8b 08 movl (%eax), %ecx + // 33: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 39: 7f 0e jg 0x49 <__JIT_ENTRY+0x49> + // 3b: 49 decl %ecx + // 3c: 89 08 movl %ecx, (%eax) + // 3e: 75 09 jne 0x49 <__JIT_ENTRY+0x49> + // 40: 50 pushl %eax + // 41: e8 00 00 00 00 calll 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __Py_Dealloc + // 46: 83 c4 04 addl $0x4, %esp + // 49: 89 6f fc movl %ebp, -0x4(%edi) + // 4c: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 50: 89 7c 24 18 movl %edi, 0x18(%esp) + // 54: 89 74 24 14 movl %esi, 0x14(%esp) + // 58: 5e popl %esi + // 59: 5f popl %edi + // 5a: 5b popl %ebx + // 5b: 5d popl %ebp + // 5c: e9 00 00 00 00 jmp 0x61 <__JIT_ENTRY+0x61> + // 0000005d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 61: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 65: 89 7c 24 18 movl %edi, 0x18(%esp) + // 69: 89 74 24 14 movl %esi, 0x14(%esp) + // 6d: 5e popl %esi + // 6e: 5f popl %edi + // 6f: 5b popl %ebx + // 70: 5d popl %ebp + // 71: e9 00 00 00 00 jmp 0x76 <__JIT_ENTRY+0x76> + // 00000072: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[118] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x47, 0xfc, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc9, 0x8b, 0x2c, 0x08, 0x85, 0xed, + 0x74, 0x3f, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x04, 0x41, 0x89, 0x4d, + 0x00, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x89, 0x6f, 0xfc, 0x89, 0x5c, 0x24, 0x1c, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x42, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x72, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_WITH_HINT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 5c 24 2c movl 0x2c(%esp), %ebx + // b: 8b 6c 24 28 movl 0x28(%esp), %ebp + // f: 8b 74 24 24 movl 0x24(%esp), %esi + // 13: 8d 7d fc leal -0x4(%ebp), %edi + // 16: 8b 4d fc movl -0x4(%ebp), %ecx + // 19: b8 00 00 00 00 movl $0x0, %eax + // 0000001a: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1e: 0f b7 c0 movzwl %ax, %eax + // 21: 8b 51 18 movl 0x18(%ecx), %edx + // 24: 39 42 10 cmpl %eax, 0x10(%edx) + // 27: 76 5a jbe 0x83 <__JIT_ENTRY+0x83> + // 29: 80 7a 06 01 cmpb $0x1, 0x6(%edx) + // 2d: 75 54 jne 0x83 <__JIT_ENTRY+0x83> + // 2f: 89 5c 24 0c movl %ebx, 0xc(%esp) + // 33: 89 7c 24 04 movl %edi, 0x4(%esp) + // 37: 8b 0e movl (%esi), %ecx + // 39: 8b 49 10 movl 0x10(%ecx), %ecx + // 3c: 89 0c 24 movl %ecx, (%esp) + // 3f: bb 00 00 00 00 movl $0x0, %ebx + // 00000040: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 44: 81 e3 fe ff 00 00 andl $0xfffe, %ebx # imm = 0xFFFE + // 4a: 0f b6 4a 05 movzbl 0x5(%edx), %ecx + // 4e: bf 01 00 00 00 movl $0x1, %edi + // 53: d3 e7 shll %cl, %edi + // 55: 8d 0c 3a leal (%edx,%edi), %ecx + // 58: 8b 4c c1 14 movl 0x14(%ecx,%eax,8), %ecx + // 5c: 89 74 24 08 movl %esi, 0x8(%esp) + // 60: 8b 34 24 movl (%esp), %esi + // 63: 3b 4c 5e 0c cmpl 0xc(%esi,%ebx,2), %ecx + // 67: 74 32 je 0x9b <__JIT_ENTRY+0x9b> + // 69: 8b 44 24 0c movl 0xc(%esp), %eax + // 6d: 89 44 24 2c movl %eax, 0x2c(%esp) + // 71: 8b 44 24 04 movl 0x4(%esp), %eax + // 75: 89 44 24 28 movl %eax, 0x28(%esp) + // 79: 8b 44 24 08 movl 0x8(%esp), %eax + // 7d: 89 44 24 24 movl %eax, 0x24(%esp) + // 81: eb 0c jmp 0x8f <__JIT_ENTRY+0x8f> + // 83: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 87: 89 7c 24 28 movl %edi, 0x28(%esp) + // 8b: 89 74 24 24 movl %esi, 0x24(%esp) + // 8f: 83 c4 10 addl $0x10, %esp + // 92: 5e popl %esi + // 93: 5f popl %edi + // 94: 5b popl %ebx + // 95: 5d popl %ebp + // 96: e9 00 00 00 00 jmp 0x9b <__JIT_ENTRY+0x9b> + // 00000097: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 9b: 8b 74 24 08 movl 0x8(%esp), %esi + // 9f: 8d 0c 3a leal (%edx,%edi), %ecx + // a2: 83 c1 14 addl $0x14, %ecx + // a5: 8b 54 c1 04 movl 0x4(%ecx,%eax,8), %edx + // a9: 85 d2 testl %edx, %edx + // ab: 8b 5c 24 0c movl 0xc(%esp), %ebx + // af: 74 4f je 0x100 <__JIT_ENTRY+0x100> + // b1: 8b 45 f8 movl -0x8(%ebp), %eax + // b4: 8b 0a movl (%edx), %ecx + // b6: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // bc: 8b 7c 24 04 movl 0x4(%esp), %edi + // c0: 7f 03 jg 0xc5 <__JIT_ENTRY+0xc5> + // c2: 41 incl %ecx + // c3: 89 0a movl %ecx, (%edx) + // c5: 8b 08 movl (%eax), %ecx + // c7: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // cd: 7f 16 jg 0xe5 <__JIT_ENTRY+0xe5> + // cf: 49 decl %ecx + // d0: 89 08 movl %ecx, (%eax) + // d2: 75 11 jne 0xe5 <__JIT_ENTRY+0xe5> + // d4: 50 pushl %eax + // d5: 89 54 24 04 movl %edx, 0x4(%esp) + // d9: e8 00 00 00 00 calll 0xde <__JIT_ENTRY+0xde> + // 000000da: IMAGE_REL_I386_REL32 __Py_Dealloc + // de: 8b 54 24 04 movl 0x4(%esp), %edx + // e2: 83 c4 04 addl $0x4, %esp + // e5: 89 55 f8 movl %edx, -0x8(%ebp) + // e8: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // ec: 89 7c 24 28 movl %edi, 0x28(%esp) + // f0: 89 74 24 24 movl %esi, 0x24(%esp) + // f4: 83 c4 10 addl $0x10, %esp + // f7: 5e popl %esi + // f8: 5f popl %edi + // f9: 5b popl %ebx + // fa: 5d popl %ebp + // fb: e9 00 00 00 00 jmp 0x100 <__JIT_ENTRY+0x100> + // 000000fc: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 100: 89 5c 24 2c movl %ebx, 0x2c(%esp) + // 104: 8b 44 24 04 movl 0x4(%esp), %eax + // 108: 89 44 24 28 movl %eax, 0x28(%esp) + // 10c: e9 7a ff ff ff jmp 0x8b <__JIT_ENTRY+0x8b> + const unsigned char code_body[273] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x5c, 0x24, 0x2c, 0x8b, 0x6c, 0x24, 0x28, 0x8b, + 0x74, 0x24, 0x24, 0x8d, 0x7d, 0xfc, 0x8b, 0x4d, + 0xfc, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc0, 0x8b, 0x51, 0x18, 0x39, 0x42, 0x10, 0x76, + 0x5a, 0x80, 0x7a, 0x06, 0x01, 0x75, 0x54, 0x89, + 0x5c, 0x24, 0x0c, 0x89, 0x7c, 0x24, 0x04, 0x8b, + 0x0e, 0x8b, 0x49, 0x10, 0x89, 0x0c, 0x24, 0xbb, + 0x00, 0x00, 0x00, 0x00, 0x81, 0xe3, 0xfe, 0xff, + 0x00, 0x00, 0x0f, 0xb6, 0x4a, 0x05, 0xbf, 0x01, + 0x00, 0x00, 0x00, 0xd3, 0xe7, 0x8d, 0x0c, 0x3a, + 0x8b, 0x4c, 0xc1, 0x14, 0x89, 0x74, 0x24, 0x08, + 0x8b, 0x34, 0x24, 0x3b, 0x4c, 0x5e, 0x0c, 0x74, + 0x32, 0x8b, 0x44, 0x24, 0x0c, 0x89, 0x44, 0x24, + 0x2c, 0x8b, 0x44, 0x24, 0x04, 0x89, 0x44, 0x24, + 0x28, 0x8b, 0x44, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x24, 0xeb, 0x0c, 0x89, 0x5c, 0x24, 0x2c, 0x89, + 0x7c, 0x24, 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, + 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x74, 0x24, 0x08, 0x8d, + 0x0c, 0x3a, 0x83, 0xc1, 0x14, 0x8b, 0x54, 0xc1, + 0x04, 0x85, 0xd2, 0x8b, 0x5c, 0x24, 0x0c, 0x74, + 0x4f, 0x8b, 0x45, 0xf8, 0x8b, 0x0a, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x8b, 0x7c, 0x24, 0x04, + 0x7f, 0x03, 0x41, 0x89, 0x0a, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x16, 0x49, + 0x89, 0x08, 0x75, 0x11, 0x50, 0x89, 0x54, 0x24, + 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, + 0x24, 0x04, 0x83, 0xc4, 0x04, 0x89, 0x55, 0xf8, + 0x89, 0x5c, 0x24, 0x2c, 0x89, 0x7c, 0x24, 0x28, + 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x5c, 0x24, 0x2c, 0x8b, 0x44, 0x24, 0x04, + 0x89, 0x44, 0x24, 0x28, 0xe9, 0x7a, 0xff, 0xff, + 0xff, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1a, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x40, instruction->oparg); + patch_x86_64_32rx(code + 0x97, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xda, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xfc, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__LOAD_BUILD_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_BUILD_CLASS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 50 pushl %eax + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 44 24 14 movl 0x14(%esp), %eax + // f: 89 46 20 movl %eax, 0x20(%esi) + // 12: 89 e0 movl %esp, %eax + // 14: 50 pushl %eax + // 15: 68 b4 50 00 00 pushl $0x50b4 # imm = 0x50B4 + // 00000016: IMAGE_REL_I386_DIR32 __PyRuntime + // 1a: ff 76 10 pushl 0x10(%esi) + // 1d: e8 00 00 00 00 calll 0x22 <__JIT_ENTRY+0x22> + // 0000001e: IMAGE_REL_I386_REL32 _PyMapping_GetOptionalItem + // 22: 83 c4 0c addl $0xc, %esp + // 25: 8b 4e 20 movl 0x20(%esi), %ecx + // 28: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 2f: 85 c0 testl %eax, %eax + // 31: 78 22 js 0x55 <__JIT_ENTRY+0x55> + // 33: 8b 04 24 movl (%esp), %eax + // 36: 85 c0 testl %eax, %eax + // 38: 74 25 je 0x5f <__JIT_ENTRY+0x5f> + // 3a: 89 01 movl %eax, (%ecx) + // 3c: 83 c1 04 addl $0x4, %ecx + // 3f: 89 74 24 10 movl %esi, 0x10(%esp) + // 43: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 47: 89 7c 24 18 movl %edi, 0x18(%esp) + // 4b: 83 c4 04 addl $0x4, %esp + // 4e: 5e popl %esi + // 4f: 5f popl %edi + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 55: 89 7c 24 18 movl %edi, 0x18(%esp) + // 59: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 5d: eb 29 jmp 0x88 <__JIT_ENTRY+0x88> + // 5f: 89 4e 20 movl %ecx, 0x20(%esi) + // 62: 68 00 00 00 00 pushl $0x0 + // 00000063: IMAGE_REL_I386_DIR32 ??_C@_0BK@IAGNFEAN@__build_class__?5not?5found?$AA@ + // 67: ff 35 00 00 00 00 pushl 0x0 + // 00000069: IMAGE_REL_I386_DIR32 _PyExc_NameError + // 6d: 57 pushl %edi + // 6e: e8 00 00 00 00 calll 0x73 <__JIT_ENTRY+0x73> + // 0000006f: IMAGE_REL_I386_REL32 __PyErr_SetString + // 73: 83 c4 0c addl $0xc, %esp + // 76: 8b 46 20 movl 0x20(%esi), %eax + // 79: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 80: 89 7c 24 18 movl %edi, 0x18(%esp) + // 84: 89 44 24 14 movl %eax, 0x14(%esp) + // 88: 89 74 24 10 movl %esi, 0x10(%esp) + // 8c: 83 c4 04 addl $0x4, %esp + // 8f: 5e popl %esi + // 90: 5f popl %edi + // 91: e9 00 00 00 00 jmp 0x96 <__JIT_ENTRY+0x96> + // 00000092: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[150] = { + 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x44, 0x24, 0x14, 0x89, + 0x46, 0x20, 0x89, 0xe0, 0x50, 0x68, 0xb4, 0x50, + 0x00, 0x00, 0xff, 0x76, 0x10, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x4e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x22, 0x8b, 0x04, 0x24, 0x85, 0xc0, + 0x74, 0x25, 0x89, 0x01, 0x83, 0xc1, 0x04, 0x89, + 0x74, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x4c, 0x24, 0x14, 0xeb, 0x29, 0x89, + 0x4e, 0x20, 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0x00, 0x00, 0x57, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x46, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x83, 0xc4, 0x04, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '__build_class__ not found\x00' + // 1a: 00 00 00 00 00 00 + const unsigned char data_body[32] = { + 0x5f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x5f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&_PyRuntime + 0x50b4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)&PyMapping_GetOptionalItem + -0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x63, (uintptr_t)data); + patch_32(code + 0x69, (uintptr_t)&PyExc_NameError); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)&_PyErr_SetString + -0x4); + patch_x86_64_32rx(code + 0x92, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_COMMON_CONSTANT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_COMMON_CONSTANT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 4c 24 0c movl 0xc(%esp), %ecx + // a: 8b 54 24 10 movl 0x10(%esp), %edx + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 66 85 f6 testw %si, %si + // 16: be 00 00 00 00 movl $0x0, %esi + // 00000017: IMAGE_REL_I386_DIR32 _PyExc_AssertionError + // 1b: bf 00 00 00 00 movl $0x0, %edi + // 0000001c: IMAGE_REL_I386_DIR32 _PyExc_NotImplementedError + // 20: 0f 44 fe cmovel %esi, %edi + // 23: 8b 37 movl (%edi), %esi + // 25: 89 32 movl %esi, (%edx) + // 27: 83 c2 04 addl $0x4, %edx + // 2a: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2e: 89 54 24 10 movl %edx, 0x10(%esp) + // 32: 89 44 24 14 movl %eax, 0x14(%esp) + // 36: 5e popl %esi + // 37: 5f popl %edi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x57, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x0c, 0x8b, 0x54, 0x24, 0x10, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xf6, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x44, 0xfe, 0x8b, 0x37, 0x89, 0x32, 0x83, + 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_32(code + 0x17, (uintptr_t)&PyExc_AssertionError); + patch_32(code + 0x1c, (uintptr_t)&PyExc_NotImplementedError); +} + +void +emit__LOAD_CONST_IMMORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_IMMORTAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 54 24 0c movl 0xc(%esp), %edx + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: 8b 3a movl (%edx), %edi + // 18: 8b 7f 0c movl 0xc(%edi), %edi + // 1b: 8b 74 b7 0c movl 0xc(%edi,%esi,4), %esi + // 1f: 89 31 movl %esi, (%ecx) + // 21: 83 c1 04 addl $0x4, %ecx + // 24: 89 54 24 0c movl %edx, 0xc(%esp) + // 28: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2c: 89 44 24 14 movl %eax, 0x14(%esp) + // 30: 5e popl %esi + // 31: 5f popl %edi + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 00000033: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[50] = { + 0x57, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x54, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0x8b, 0x3a, + 0x8b, 0x7f, 0x0c, 0x8b, 0x74, 0xb7, 0x0c, 0x89, + 0x31, 0x83, 0xc1, 0x04, 0x89, 0x54, 0x24, 0x0c, + 0x89, 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x14, + 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); +} + +void +emit__LOAD_CONST_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 4c 24 10 movl 0x10(%esp), %ecx + // 5: 8b 54 24 0c movl 0xc(%esp), %edx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 35 00 00 00 00 movl 0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 13: 81 fe ff ff ff 3f cmpl $0x3fffffff, %esi # imm = 0x3FFFFFFF + // 19: 7f 07 jg 0x22 <__JIT_ENTRY+0x22> + // 1b: 46 incl %esi + // 1c: 89 35 00 00 00 00 movl %esi, 0x0 + // 0000001e: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 22: c7 02 00 00 00 00 movl $0x0, (%edx) + // 00000024: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 28: 83 c2 04 addl $0x4, %edx + // 2b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2f: 89 54 24 0c movl %edx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x54, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x81, 0xfe, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x07, 0x46, 0x89, 0x35, 0x00, 0x00, + 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x54, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x1e, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x24, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE_BORROW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 08 movl 0x8(%esp), %edx + // c: c7 02 00 00 00 00 movl $0x0, (%edx) + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 12: 83 c2 04 addl $0x4, %edx + // 15: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 19: 89 54 24 08 movl %edx, 0x8(%esp) + // 1d: 89 44 24 0c movl %eax, 0xc(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x08, 0xc7, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__LOAD_CONST_MORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_MORTAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: 8b 38 movl (%eax), %edi + // 18: 8b 7f 0c movl 0xc(%edi), %edi + // 1b: 8b 74 b7 0c movl 0xc(%edi,%esi,4), %esi + // 1f: 8b 3e movl (%esi), %edi + // 21: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 27: 7f 03 jg 0x2c <__JIT_ENTRY+0x2c> + // 29: 47 incl %edi + // 2a: 89 3e movl %edi, (%esi) + // 2c: 89 32 movl %esi, (%edx) + // 2e: 83 c2 04 addl $0x4, %edx + // 31: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 35: 89 54 24 10 movl %edx, 0x10(%esp) + // 39: 89 44 24 0c movl %eax, 0xc(%esp) + // 3d: 5e popl %esi + // 3e: 5f popl %edi + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 00000040: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[63] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0x8b, 0x38, + 0x8b, 0x7f, 0x0c, 0x8b, 0x74, 0xb7, 0x0c, 0x8b, + 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, 0x83, 0xc2, + 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, 0x54, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); +} + +void +emit__LOAD_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_DEREF.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 44 24 10 movl 0x10(%esp), %eax + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: b9 00 00 00 00 movl $0x0, %ecx + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 d1 movzwl %cx, %edx + // 16: 8b 4c 96 28 movl 0x28(%esi,%edx,4), %ecx + // 1a: 8b 49 08 movl 0x8(%ecx), %ecx + // 1d: 85 c9 testl %ecx, %ecx + // 1f: 74 25 je 0x46 <__JIT_ENTRY+0x46> + // 21: 8b 11 movl (%ecx), %edx + // 23: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 29: 7f 03 jg 0x2e <__JIT_ENTRY+0x2e> + // 2b: 42 incl %edx + // 2c: 89 11 movl %edx, (%ecx) + // 2e: 89 08 movl %ecx, (%eax) + // 30: 83 c0 04 addl $0x4, %eax + // 33: 89 7c 24 14 movl %edi, 0x14(%esp) + // 37: 89 44 24 10 movl %eax, 0x10(%esp) + // 3b: 89 74 24 0c movl %esi, 0xc(%esp) + // 3f: 5e popl %esi + // 40: 5f popl %edi + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 00000042: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 46: 89 46 20 movl %eax, 0x20(%esi) + // 49: 52 pushl %edx + // 4a: ff 36 pushl (%esi) + // 4c: 57 pushl %edi + // 4d: e8 00 00 00 00 calll 0x52 <__JIT_ENTRY+0x52> + // 0000004e: IMAGE_REL_I386_REL32 __PyEval_FormatExcUnbound + // 52: 83 c4 0c addl $0xc, %esp + // 55: 8b 46 20 movl 0x20(%esi), %eax + // 58: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 5f: 89 7c 24 14 movl %edi, 0x14(%esp) + // 63: 89 44 24 10 movl %eax, 0x10(%esp) + // 67: 89 74 24 0c movl %esi, 0xc(%esp) + // 6b: 5e popl %esi + // 6c: 5f popl %edi + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[114] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x44, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd1, 0x8b, 0x4c, + 0x96, 0x28, 0x8b, 0x49, 0x08, 0x85, 0xc9, 0x74, + 0x25, 0x8b, 0x11, 0x81, 0xfa, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x42, 0x89, 0x11, 0x89, 0x08, + 0x83, 0xc0, 0x04, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x46, + 0x20, 0x52, 0xff, 0x36, 0x57, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_x86_64_32rx(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)&_PyEval_FormatExcUnbound + -0x4); + patch_x86_64_32rx(code + 0x6e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: 8b 74 b0 28 movl 0x28(%eax,%esi,4), %esi + // 1a: 8b 3e movl (%esi), %edi + // 1c: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 22: 7f 03 jg 0x27 <__JIT_ENTRY+0x27> + // 24: 47 incl %edi + // 25: 89 3e movl %edi, (%esi) + // 27: 89 32 movl %esi, (%edx) + // 29: 83 c2 04 addl $0x4, %edx + // 2c: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 30: 89 54 24 10 movl %edx, 0x10(%esp) + // 34: 89 44 24 0c movl %eax, 0xc(%esp) + // 38: 5e popl %esi + // 39: 5f popl %edi + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 0000003b: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[58] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0x8b, 0x74, + 0xb0, 0x28, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, + 0x32, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, + 0x89, 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, + 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); +} + +void +emit__LOAD_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_0.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 28 movl 0x28(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x28, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 2c movl 0x2c(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x2c, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_2.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 30 movl 0x30(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x30, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_3.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 34 movl 0x34(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x34, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_4.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 38 movl 0x38(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x38, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_5.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 3c movl 0x3c(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x3c, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_6.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 40 movl 0x40(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x40, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_7.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 6: 8b 54 24 10 movl 0x10(%esp), %edx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 70 44 movl 0x44(%eax), %esi + // 11: 8b 3e movl (%esi), %edi + // 13: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 19: 7f 03 jg 0x1e <__JIT_ENTRY+0x1e> + // 1b: 47 incl %edi + // 1c: 89 3e movl %edi, (%esi) + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 44 24 0c movl %eax, 0xc(%esp) + // 2f: 5e popl %esi + // 30: 5f popl %edi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x70, + 0x44, 0x8b, 0x3e, 0x81, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x3e, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x14, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_AND_CLEAR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_AND_CLEAR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 54 24 0c movl 0xc(%esp), %edx + // e: be 00 00 00 00 movl $0x0, %esi + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 f6 movzwl %si, %esi + // 16: 8b 7c b2 28 movl 0x28(%edx,%esi,4), %edi + // 1a: c7 44 b2 28 00 00 00 00 movl $0x0, 0x28(%edx,%esi,4) + // 22: 89 39 movl %edi, (%ecx) + // 24: 83 c1 04 addl $0x4, %ecx + // 27: 89 54 24 0c movl %edx, 0xc(%esp) + // 2b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2f: 89 44 24 14 movl %eax, 0x14(%esp) + // 33: 5e popl %esi + // 34: 5f popl %edi + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 00000036: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[53] = { + 0x57, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x54, 0x24, 0x0c, 0xbe, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0x8b, 0x7c, + 0xb2, 0x28, 0xc7, 0x44, 0xb2, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x39, 0x83, 0xc1, 0x04, 0x89, + 0x54, 0x24, 0x0c, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x44, 0x24, 0x14, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); +} + +void +emit__LOAD_FAST_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_CHECK.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 44 24 10 movl 0x10(%esp), %eax + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: b9 00 00 00 00 movl $0x0, %ecx + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 d1 movzwl %cx, %edx + // 16: 8b 4c 96 28 movl 0x28(%esi,%edx,4), %ecx + // 1a: 85 c9 testl %ecx, %ecx + // 1c: 74 25 je 0x43 <__JIT_ENTRY+0x43> + // 1e: 8b 11 movl (%ecx), %edx + // 20: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 26: 7f 03 jg 0x2b <__JIT_ENTRY+0x2b> + // 28: 42 incl %edx + // 29: 89 11 movl %edx, (%ecx) + // 2b: 89 08 movl %ecx, (%eax) + // 2d: 83 c0 04 addl $0x4, %eax + // 30: 89 7c 24 14 movl %edi, 0x14(%esp) + // 34: 89 44 24 10 movl %eax, 0x10(%esp) + // 38: 89 74 24 0c movl %esi, 0xc(%esp) + // 3c: 5e popl %esi + // 3d: 5f popl %edi + // 3e: e9 00 00 00 00 jmp 0x43 <__JIT_ENTRY+0x43> + // 0000003f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 43: 89 46 20 movl %eax, 0x20(%esi) + // 46: 8b 06 movl (%esi), %eax + // 48: 52 pushl %edx + // 49: ff 70 48 pushl 0x48(%eax) + // 4c: e8 00 00 00 00 calll 0x51 <__JIT_ENTRY+0x51> + // 0000004d: IMAGE_REL_I386_REL32 _PyTuple_GetItem + // 51: 83 c4 08 addl $0x8, %esp + // 54: 50 pushl %eax + // 55: 68 00 00 00 00 pushl $0x0 + // 00000056: IMAGE_REL_I386_DIR32 ??_C@_0EK@CHGBBAMA@cannot?5access?5local?5variable?5?8?$CFs@ + // 5a: ff 35 00 00 00 00 pushl 0x0 + // 0000005c: IMAGE_REL_I386_DIR32 _PyExc_UnboundLocalError + // 60: 57 pushl %edi + // 61: e8 00 00 00 00 calll 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __PyEval_FormatExcCheckArg + // 66: 83 c4 10 addl $0x10, %esp + // 69: 8b 46 20 movl 0x20(%esi), %eax + // 6c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 73: 89 7c 24 14 movl %edi, 0x14(%esp) + // 77: 89 44 24 10 movl %eax, 0x10(%esp) + // 7b: 89 74 24 0c movl %esi, 0xc(%esp) + // 7f: 5e popl %esi + // 80: 5f popl %edi + // 81: e9 00 00 00 00 jmp 0x86 <__JIT_ENTRY+0x86> + // 00000082: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[134] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x44, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd1, 0x8b, 0x4c, + 0x96, 0x28, 0x85, 0xc9, 0x74, 0x25, 0x8b, 0x11, + 0x81, 0xfa, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x42, 0x89, 0x11, 0x89, 0x08, 0x83, 0xc0, 0x04, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x46, 0x20, 0x8b, 0x06, + 0x52, 0xff, 0x70, 0x48, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x08, 0x50, 0x68, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x10, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + const unsigned char data_body[80] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)&PyTuple_GetItem + -0x4); + patch_32(code + 0x56, (uintptr_t)data); + patch_32(code + 0x5c, (uintptr_t)&PyExc_UnboundLocalError); + patch_x86_64_32rx(code + 0x62, (uintptr_t)&_PyEval_FormatExcCheckArg + -0x4); + patch_x86_64_32rx(code + 0x82, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_FROM_DICT_OR_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FROM_DICT_OR_DEREF.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 7c 24 20 movl 0x20(%esp), %edi + // 9: 8b 74 24 18 movl 0x18(%esp), %esi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: b9 00 00 00 00 movl $0x0, %ecx + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 16: 0f b7 e9 movzwl %cx, %ebp + // 19: 8b 58 fc movl -0x4(%eax), %ebx + // 1c: 8b 0e movl (%esi), %ecx + // 1e: 8b 49 48 movl 0x48(%ecx), %ecx + // 21: 8b 4c a9 0c movl 0xc(%ecx,%ebp,4), %ecx + // 25: 89 46 20 movl %eax, 0x20(%esi) + // 28: 89 e0 movl %esp, %eax + // 2a: 50 pushl %eax + // 2b: 51 pushl %ecx + // 2c: 53 pushl %ebx + // 2d: e8 00 00 00 00 calll 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 _PyMapping_GetOptionalItem + // 32: 83 c4 0c addl $0xc, %esp + // 35: 8b 4e 20 movl 0x20(%esi), %ecx + // 38: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3f: 85 c0 testl %eax, %eax + // 41: 78 6a js 0xad <__JIT_ENTRY+0xad> + // 43: 8b 04 24 movl (%esp), %eax + // 46: 85 c0 testl %eax, %eax + // 48: 75 1b jne 0x65 <__JIT_ENTRY+0x65> + // 4a: 8b 44 ae 28 movl 0x28(%esi,%ebp,4), %eax + // 4e: 8b 40 08 movl 0x8(%eax), %eax + // 51: 85 c0 testl %eax, %eax + // 53: 74 70 je 0xc5 <__JIT_ENTRY+0xc5> + // 55: 8b 10 movl (%eax), %edx + // 57: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 5d: 7f 03 jg 0x62 <__JIT_ENTRY+0x62> + // 5f: 42 incl %edx + // 60: 89 10 movl %edx, (%eax) + // 62: 89 04 24 movl %eax, (%esp) + // 65: 83 c1 fc addl $-0x4, %ecx + // 68: 89 4e 20 movl %ecx, 0x20(%esi) + // 6b: 8b 0b movl (%ebx), %ecx + // 6d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 73: 7f 11 jg 0x86 <__JIT_ENTRY+0x86> + // 75: 49 decl %ecx + // 76: 89 0b movl %ecx, (%ebx) + // 78: 75 0c jne 0x86 <__JIT_ENTRY+0x86> + // 7a: 53 pushl %ebx + // 7b: e8 00 00 00 00 calll 0x80 <__JIT_ENTRY+0x80> + // 0000007c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 80: 83 c4 04 addl $0x4, %esp + // 83: 8b 04 24 movl (%esp), %eax + // 86: 8b 4e 20 movl 0x20(%esi), %ecx + // 89: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 90: 89 01 movl %eax, (%ecx) + // 92: 83 c1 04 addl $0x4, %ecx + // 95: 89 74 24 18 movl %esi, 0x18(%esp) + // 99: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 9d: 89 7c 24 20 movl %edi, 0x20(%esp) + // a1: 83 c4 04 addl $0x4, %esp + // a4: 5e popl %esi + // a5: 5f popl %edi + // a6: 5b popl %ebx + // a7: 5d popl %ebp + // a8: e9 00 00 00 00 jmp 0xad <__JIT_ENTRY+0xad> + // 000000a9: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // ad: 89 7c 24 20 movl %edi, 0x20(%esp) + // b1: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // b5: 89 74 24 18 movl %esi, 0x18(%esp) + // b9: 83 c4 04 addl $0x4, %esp + // bc: 5e popl %esi + // bd: 5f popl %edi + // be: 5b popl %ebx + // bf: 5d popl %ebp + // c0: e9 00 00 00 00 jmp 0xc5 <__JIT_ENTRY+0xc5> + // 000000c1: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // c5: c7 04 24 00 00 00 00 movl $0x0, (%esp) + // cc: 89 4e 20 movl %ecx, 0x20(%esi) + // cf: 55 pushl %ebp + // d0: ff 36 pushl (%esi) + // d2: 57 pushl %edi + // d3: e8 00 00 00 00 calll 0xd8 <__JIT_ENTRY+0xd8> + // 000000d4: IMAGE_REL_I386_REL32 __PyEval_FormatExcUnbound + // d8: 83 c4 0c addl $0xc, %esp + // db: 8b 46 20 movl 0x20(%esi), %eax + // de: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // e5: 89 7c 24 20 movl %edi, 0x20(%esp) + // e9: 89 44 24 1c movl %eax, 0x1c(%esp) + // ed: eb c6 jmp 0xb5 <__JIT_ENTRY+0xb5> + const unsigned char code_body[239] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, + 0x20, 0x8b, 0x74, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xe9, 0x8b, 0x58, 0xfc, 0x8b, 0x0e, 0x8b, 0x49, + 0x48, 0x8b, 0x4c, 0xa9, 0x0c, 0x89, 0x46, 0x20, + 0x89, 0xe0, 0x50, 0x51, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x4e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x6a, 0x8b, 0x04, 0x24, 0x85, 0xc0, + 0x75, 0x1b, 0x8b, 0x44, 0xae, 0x28, 0x8b, 0x40, + 0x08, 0x85, 0xc0, 0x74, 0x70, 0x8b, 0x10, 0x81, + 0xfa, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x42, + 0x89, 0x10, 0x89, 0x04, 0x24, 0x83, 0xc1, 0xfc, + 0x89, 0x4e, 0x20, 0x8b, 0x0b, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x11, 0x49, 0x89, 0x0b, + 0x75, 0x0c, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x04, 0x24, 0x8b, 0x4e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x01, 0x83, 0xc1, 0x04, 0x89, 0x74, 0x24, + 0x18, 0x89, 0x4c, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x20, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, + 0x20, 0x89, 0x4c, 0x24, 0x1c, 0x89, 0x74, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x04, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x4e, 0x20, 0x55, + 0xff, 0x36, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x0c, 0x8b, 0x46, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, + 0x20, 0x89, 0x44, 0x24, 0x1c, 0xeb, 0xc6, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, instruction->oparg); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)&PyMapping_GetOptionalItem + -0x4); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc1, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xd4, (uintptr_t)&_PyEval_FormatExcUnbound + -0x4); +} + +void +emit__LOAD_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 5c 24 14 movl 0x14(%esp), %ebx + // f: 8b 06 movl (%esi), %eax + // 11: 8b 4e 0c movl 0xc(%esi), %ecx + // 14: 8b 40 10 movl 0x10(%eax), %eax + // 17: ba 00 00 00 00 movl $0x0, %edx + // 00000018: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1c: 81 e2 fe ff 00 00 andl $0xfffe, %edx # imm = 0xFFFE + // 22: 8b 44 50 0c movl 0xc(%eax,%edx,2), %eax + // 26: 89 5e 20 movl %ebx, 0x20(%esi) + // 29: 53 pushl %ebx + // 2a: 50 pushl %eax + // 2b: ff 76 10 pushl 0x10(%esi) + // 2e: 51 pushl %ecx + // 2f: e8 00 00 00 00 calll 0x34 <__JIT_ENTRY+0x34> + // 00000030: IMAGE_REL_I386_REL32 __PyEval_LoadGlobalStackRef + // 34: 83 c4 10 addl $0x10, %esp + // 37: 8b 46 20 movl 0x20(%esi), %eax + // 3a: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 41: 83 3b 00 cmpl $0x0, (%ebx) + // 44: 74 17 je 0x5d <__JIT_ENTRY+0x5d> + // 46: 83 c0 04 addl $0x4, %eax + // 49: 89 7c 24 18 movl %edi, 0x18(%esp) + // 4d: 89 74 24 10 movl %esi, 0x10(%esp) + // 51: 89 44 24 14 movl %eax, 0x14(%esp) + // 55: 5e popl %esi + // 56: 5f popl %edi + // 57: 5b popl %ebx + // 58: e9 00 00 00 00 jmp 0x5d <__JIT_ENTRY+0x5d> + // 00000059: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 5d: 89 7c 24 18 movl %edi, 0x18(%esp) + // 61: 89 44 24 14 movl %eax, 0x14(%esp) + // 65: 89 74 24 10 movl %esi, 0x10(%esp) + // 69: 5e popl %esi + // 6a: 5f popl %edi + // 6b: 5b popl %ebx + // 6c: e9 00 00 00 00 jmp 0x71 <__JIT_ENTRY+0x71> + // 0000006d: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[113] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x5c, 0x24, 0x14, 0x8b, + 0x06, 0x8b, 0x4e, 0x0c, 0x8b, 0x40, 0x10, 0xba, + 0x00, 0x00, 0x00, 0x00, 0x81, 0xe2, 0xfe, 0xff, + 0x00, 0x00, 0x8b, 0x44, 0x50, 0x0c, 0x89, 0x5e, + 0x20, 0x53, 0x50, 0xff, 0x76, 0x10, 0x51, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x10, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x83, 0x3b, 0x00, 0x74, 0x17, 0x83, 0xc0, + 0x04, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, + 0x10, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, 0x74, 0x24, + 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x18, instruction->oparg); + patch_x86_64_32rx(code + 0x30, (uintptr_t)&_PyEval_LoadGlobalStackRef + -0x4); + patch_x86_64_32rx(code + 0x59, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_BUILTINS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 74 24 18 movl 0x18(%esp), %esi + // 7: 8b 54 24 14 movl 0x14(%esp), %edx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: 8b 48 10 movl 0x10(%eax), %ecx + // 12: 8b 79 18 movl 0x18(%ecx), %edi + // 15: 0f b6 4f 05 movzbl 0x5(%edi), %ecx + // 19: bb 01 00 00 00 movl $0x1, %ebx + // 1e: d3 e3 shll %cl, %ebx + // 20: 01 fb addl %edi, %ebx + // 22: b9 00 00 00 00 movl $0x0, %ecx + // 00000023: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 27: 0f b7 c9 movzwl %cx, %ecx + // 2a: 8b 4c cb 18 movl 0x18(%ebx,%ecx,8), %ecx + // 2e: 85 c9 testl %ecx, %ecx + // 30: 74 26 je 0x58 <__JIT_ENTRY+0x58> + // 32: 8b 39 movl (%ecx), %edi + // 34: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 3a: 7f 03 jg 0x3f <__JIT_ENTRY+0x3f> + // 3c: 47 incl %edi + // 3d: 89 39 movl %edi, (%ecx) + // 3f: 89 0a movl %ecx, (%edx) + // 41: 83 c2 04 addl $0x4, %edx + // 44: 89 74 24 18 movl %esi, 0x18(%esp) + // 48: 89 54 24 14 movl %edx, 0x14(%esp) + // 4c: 89 44 24 10 movl %eax, 0x10(%esp) + // 50: 5e popl %esi + // 51: 5f popl %edi + // 52: 5b popl %ebx + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 58: 89 74 24 18 movl %esi, 0x18(%esp) + // 5c: 89 54 24 14 movl %edx, 0x14(%esp) + // 60: 89 44 24 10 movl %eax, 0x10(%esp) + // 64: 5e popl %esi + // 65: 5f popl %edi + // 66: 5b popl %ebx + // 67: e9 00 00 00 00 jmp 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[108] = { + 0x53, 0x57, 0x56, 0x8b, 0x74, 0x24, 0x18, 0x8b, + 0x54, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0x8b, + 0x48, 0x10, 0x8b, 0x79, 0x18, 0x0f, 0xb6, 0x4f, + 0x05, 0xbb, 0x01, 0x00, 0x00, 0x00, 0xd3, 0xe3, + 0x01, 0xfb, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xc9, 0x8b, 0x4c, 0xcb, 0x18, 0x85, 0xc9, + 0x74, 0x26, 0x8b, 0x39, 0x81, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x39, 0x89, + 0x0a, 0x83, 0xc2, 0x04, 0x89, 0x74, 0x24, 0x18, + 0x89, 0x54, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x74, 0x24, 0x18, 0x89, 0x54, 0x24, 0x14, + 0x89, 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x23, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x68, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS_FROM_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 74 24 18 movl 0x18(%esp), %esi + // 7: 8b 54 24 14 movl 0x14(%esp), %edx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: 8b 7a fc movl -0x4(%edx), %edi + // 12: 0f b6 4f 05 movzbl 0x5(%edi), %ecx + // 16: bb 01 00 00 00 movl $0x1, %ebx + // 1b: d3 e3 shll %cl, %ebx + // 1d: 01 fb addl %edi, %ebx + // 1f: b9 00 00 00 00 movl $0x0, %ecx + // 00000020: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 24: 0f b7 c9 movzwl %cx, %ecx + // 27: 8b 4c cb 18 movl 0x18(%ebx,%ecx,8), %ecx + // 2b: 85 c9 testl %ecx, %ecx + // 2d: 74 24 je 0x53 <__JIT_ENTRY+0x53> + // 2f: 8b 39 movl (%ecx), %edi + // 31: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 37: 7f 03 jg 0x3c <__JIT_ENTRY+0x3c> + // 39: 47 incl %edi + // 3a: 89 39 movl %edi, (%ecx) + // 3c: 89 4a fc movl %ecx, -0x4(%edx) + // 3f: 89 74 24 18 movl %esi, 0x18(%esp) + // 43: 89 54 24 14 movl %edx, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 5e popl %esi + // 4c: 5f popl %edi + // 4d: 5b popl %ebx + // 4e: e9 00 00 00 00 jmp 0x53 <__JIT_ENTRY+0x53> + // 0000004f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 53: 83 c2 fc addl $-0x4, %edx + // 56: 89 74 24 18 movl %esi, 0x18(%esp) + // 5a: 89 54 24 14 movl %edx, 0x14(%esp) + // 5e: 89 44 24 10 movl %eax, 0x10(%esp) + // 62: 5e popl %esi + // 63: 5f popl %edi + // 64: 5b popl %ebx + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[106] = { + 0x53, 0x57, 0x56, 0x8b, 0x74, 0x24, 0x18, 0x8b, + 0x54, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0x8b, + 0x7a, 0xfc, 0x0f, 0xb6, 0x4f, 0x05, 0xbb, 0x01, + 0x00, 0x00, 0x00, 0xd3, 0xe3, 0x01, 0xfb, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, + 0x4c, 0xcb, 0x18, 0x85, 0xc9, 0x74, 0x24, 0x8b, + 0x39, 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x03, 0x47, 0x89, 0x39, 0x89, 0x4a, 0xfc, 0x89, + 0x74, 0x24, 0x18, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc2, 0xfc, 0x89, 0x74, + 0x24, 0x18, 0x89, 0x54, 0x24, 0x14, 0x89, 0x44, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x20, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x66, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 74 24 18 movl 0x18(%esp), %esi + // 7: 8b 54 24 14 movl 0x14(%esp), %edx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: 8b 48 0c movl 0xc(%eax), %ecx + // 12: 8b 79 18 movl 0x18(%ecx), %edi + // 15: 0f b6 4f 05 movzbl 0x5(%edi), %ecx + // 19: bb 01 00 00 00 movl $0x1, %ebx + // 1e: d3 e3 shll %cl, %ebx + // 20: 01 fb addl %edi, %ebx + // 22: b9 00 00 00 00 movl $0x0, %ecx + // 00000023: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 27: 0f b7 c9 movzwl %cx, %ecx + // 2a: 8b 4c cb 18 movl 0x18(%ebx,%ecx,8), %ecx + // 2e: 85 c9 testl %ecx, %ecx + // 30: 74 26 je 0x58 <__JIT_ENTRY+0x58> + // 32: 8b 39 movl (%ecx), %edi + // 34: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 3a: 7f 03 jg 0x3f <__JIT_ENTRY+0x3f> + // 3c: 47 incl %edi + // 3d: 89 39 movl %edi, (%ecx) + // 3f: 89 0a movl %ecx, (%edx) + // 41: 83 c2 04 addl $0x4, %edx + // 44: 89 74 24 18 movl %esi, 0x18(%esp) + // 48: 89 54 24 14 movl %edx, 0x14(%esp) + // 4c: 89 44 24 10 movl %eax, 0x10(%esp) + // 50: 5e popl %esi + // 51: 5f popl %edi + // 52: 5b popl %ebx + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 00000054: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 58: 89 74 24 18 movl %esi, 0x18(%esp) + // 5c: 89 54 24 14 movl %edx, 0x14(%esp) + // 60: 89 44 24 10 movl %eax, 0x10(%esp) + // 64: 5e popl %esi + // 65: 5f popl %edi + // 66: 5b popl %ebx + // 67: e9 00 00 00 00 jmp 0x6c <__JIT_ENTRY+0x6c> + // 00000068: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[108] = { + 0x53, 0x57, 0x56, 0x8b, 0x74, 0x24, 0x18, 0x8b, + 0x54, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0x8b, + 0x48, 0x0c, 0x8b, 0x79, 0x18, 0x0f, 0xb6, 0x4f, + 0x05, 0xbb, 0x01, 0x00, 0x00, 0x00, 0xd3, 0xe3, + 0x01, 0xfb, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xc9, 0x8b, 0x4c, 0xcb, 0x18, 0x85, 0xc9, + 0x74, 0x26, 0x8b, 0x39, 0x81, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x03, 0x47, 0x89, 0x39, 0x89, + 0x0a, 0x83, 0xc2, 0x04, 0x89, 0x74, 0x24, 0x18, + 0x89, 0x54, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x74, 0x24, 0x18, 0x89, 0x54, 0x24, 0x14, + 0x89, 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x23, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x68, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE_FROM_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 74 24 18 movl 0x18(%esp), %esi + // 7: 8b 54 24 14 movl 0x14(%esp), %edx + // b: 8b 44 24 10 movl 0x10(%esp), %eax + // f: 8b 7a fc movl -0x4(%edx), %edi + // 12: 0f b6 4f 05 movzbl 0x5(%edi), %ecx + // 16: bb 01 00 00 00 movl $0x1, %ebx + // 1b: d3 e3 shll %cl, %ebx + // 1d: 01 fb addl %edi, %ebx + // 1f: b9 00 00 00 00 movl $0x0, %ecx + // 00000020: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 24: 0f b7 c9 movzwl %cx, %ecx + // 27: 8b 4c cb 18 movl 0x18(%ebx,%ecx,8), %ecx + // 2b: 85 c9 testl %ecx, %ecx + // 2d: 74 24 je 0x53 <__JIT_ENTRY+0x53> + // 2f: 8b 39 movl (%ecx), %edi + // 31: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 37: 7f 03 jg 0x3c <__JIT_ENTRY+0x3c> + // 39: 47 incl %edi + // 3a: 89 39 movl %edi, (%ecx) + // 3c: 89 4a fc movl %ecx, -0x4(%edx) + // 3f: 89 74 24 18 movl %esi, 0x18(%esp) + // 43: 89 54 24 14 movl %edx, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 5e popl %esi + // 4c: 5f popl %edi + // 4d: 5b popl %ebx + // 4e: e9 00 00 00 00 jmp 0x53 <__JIT_ENTRY+0x53> + // 0000004f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 53: 83 c2 fc addl $-0x4, %edx + // 56: 89 74 24 18 movl %esi, 0x18(%esp) + // 5a: 89 54 24 14 movl %edx, 0x14(%esp) + // 5e: 89 44 24 10 movl %eax, 0x10(%esp) + // 62: 5e popl %esi + // 63: 5f popl %edi + // 64: 5b popl %ebx + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[106] = { + 0x53, 0x57, 0x56, 0x8b, 0x74, 0x24, 0x18, 0x8b, + 0x54, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x10, 0x8b, + 0x7a, 0xfc, 0x0f, 0xb6, 0x4f, 0x05, 0xbb, 0x01, + 0x00, 0x00, 0x00, 0xd3, 0xe3, 0x01, 0xfb, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, + 0x4c, 0xcb, 0x18, 0x85, 0xc9, 0x74, 0x24, 0x8b, + 0x39, 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x03, 0x47, 0x89, 0x39, 0x89, 0x4a, 0xfc, 0x89, + 0x74, 0x24, 0x18, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc2, 0xfc, 0x89, 0x74, + 0x24, 0x18, 0x89, 0x54, 0x24, 0x14, 0x89, 0x44, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x20, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x66, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_LOCALS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_LOCALS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 44 24 10 movl 0x10(%esp), %eax + // a: 8b 74 24 0c movl 0xc(%esp), %esi + // e: 8b 4e 14 movl 0x14(%esi), %ecx + // 11: 85 c9 testl %ecx, %ecx + // 13: 74 25 je 0x3a <__JIT_ENTRY+0x3a> + // 15: 8b 11 movl (%ecx), %edx + // 17: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 1d: 7f 03 jg 0x22 <__JIT_ENTRY+0x22> + // 1f: 42 incl %edx + // 20: 89 11 movl %edx, (%ecx) + // 22: 89 08 movl %ecx, (%eax) + // 24: 83 c0 04 addl $0x4, %eax + // 27: 89 7c 24 14 movl %edi, 0x14(%esp) + // 2b: 89 44 24 10 movl %eax, 0x10(%esp) + // 2f: 89 74 24 0c movl %esi, 0xc(%esp) + // 33: 5e popl %esi + // 34: 5f popl %edi + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 00000036: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 3a: 89 46 20 movl %eax, 0x20(%esi) + // 3d: 68 00 00 00 00 pushl $0x0 + // 0000003e: IMAGE_REL_I386_DIR32 ??_C@_0BA@GFAKPHCI@no?5locals?5found?$AA@ + // 42: ff 35 00 00 00 00 pushl 0x0 + // 00000044: IMAGE_REL_I386_DIR32 _PyExc_SystemError + // 48: 57 pushl %edi + // 49: e8 00 00 00 00 calll 0x4e <__JIT_ENTRY+0x4e> + // 0000004a: IMAGE_REL_I386_REL32 __PyErr_SetString + // 4e: 83 c4 0c addl $0xc, %esp + // 51: 8b 46 20 movl 0x20(%esi), %eax + // 54: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 5b: 89 7c 24 14 movl %edi, 0x14(%esp) + // 5f: 89 44 24 10 movl %eax, 0x10(%esp) + // 63: 89 74 24 0c movl %esi, 0xc(%esp) + // 67: 5e popl %esi + // 68: 5f popl %edi + // 69: e9 00 00 00 00 jmp 0x6e <__JIT_ENTRY+0x6e> + // 0000006a: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[110] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x44, + 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0x8b, 0x4e, + 0x14, 0x85, 0xc9, 0x74, 0x25, 0x8b, 0x11, 0x81, + 0xfa, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, 0x42, + 0x89, 0x11, 0x89, 0x08, 0x83, 0xc0, 0x04, 0x89, + 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x46, 0x20, 0x68, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x0c, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'no locals found\x00' + const unsigned char data_body[16] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x36, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x3e, (uintptr_t)data); + patch_32(code + 0x44, (uintptr_t)&PyExc_SystemError); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)&_PyErr_SetString + -0x4); + patch_x86_64_32rx(code + 0x6a, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_NAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: b9 00 00 00 00 movl $0x0, %ecx + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 c9 movzwl %cx, %ecx + // 16: 8b 16 movl (%esi), %edx + // 18: 8b 52 10 movl 0x10(%edx), %edx + // 1b: 8b 4c 8a 0c movl 0xc(%edx,%ecx,4), %ecx + // 1f: 89 46 20 movl %eax, 0x20(%esi) + // 22: 51 pushl %ecx + // 23: 56 pushl %esi + // 24: 57 pushl %edi + // 25: e8 00 00 00 00 calll 0x2a <__JIT_ENTRY+0x2a> + // 00000026: IMAGE_REL_I386_REL32 __PyEval_LoadName + // 2a: 83 c4 0c addl $0xc, %esp + // 2d: 8b 4e 20 movl 0x20(%esi), %ecx + // 30: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 37: 85 c0 testl %eax, %eax + // 39: 74 18 je 0x53 <__JIT_ENTRY+0x53> + // 3b: 89 01 movl %eax, (%ecx) + // 3d: 83 c1 04 addl $0x4, %ecx + // 40: 89 7c 24 14 movl %edi, 0x14(%esp) + // 44: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 48: 89 74 24 0c movl %esi, 0xc(%esp) + // 4c: 5e popl %esi + // 4d: 5f popl %edi + // 4e: e9 00 00 00 00 jmp 0x53 <__JIT_ENTRY+0x53> + // 0000004f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 53: 89 7c 24 14 movl %edi, 0x14(%esp) + // 57: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 5b: 89 74 24 0c movl %esi, 0xc(%esp) + // 5f: 5e popl %esi + // 60: 5f popl %edi + // 61: e9 00 00 00 00 jmp 0x66 <__JIT_ENTRY+0x66> + // 00000062: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[102] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, 0x16, + 0x8b, 0x52, 0x10, 0x8b, 0x4c, 0x8a, 0x0c, 0x89, + 0x46, 0x20, 0x51, 0x56, 0x57, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x4e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x18, 0x89, 0x01, 0x83, 0xc1, 0x04, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_x86_64_32rx(code + 0x26, (uintptr_t)&_PyEval_LoadName + -0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x62, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_SMALL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 44 24 10 movl 0x10(%esp), %eax + // 5: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 9: 8b 54 24 0c movl 0xc(%esp), %edx + // d: be 00 00 00 00 movl $0x0, %esi + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 12: 0f b7 f6 movzwl %si, %esi + // 15: c1 e6 04 shll $0x4, %esi + // 18: 8d b6 3c 22 00 00 leal 0x223c(%esi), %esi + // 0000001a: IMAGE_REL_I386_DIR32 __PyRuntime + // 1e: 89 32 movl %esi, (%edx) + // 20: 83 c2 04 addl $0x4, %edx + // 23: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 27: 89 54 24 0c movl %edx, 0xc(%esp) + // 2b: 89 44 24 10 movl %eax, 0x10(%esp) + // 2f: 5e popl %esi + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 00000031: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[48] = { + 0x56, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x08, 0x8b, 0x54, 0x24, 0x0c, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xc1, 0xe6, 0x04, + 0x8d, 0xb6, 0x3c, 0x22, 0x00, 0x00, 0x89, 0x32, + 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, 0x08, 0x89, + 0x54, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x10, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, instruction->oparg); + patch_32(code + 0x1a, (uintptr_t)&_PyRuntime + 0x223c); +} + +void +emit__LOAD_SMALL_INT_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_0.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 08 movl 0x8(%esp), %edx + // c: c7 02 3c 22 00 00 movl $0x223c, (%edx) # imm = 0x223C + // 0000000e: IMAGE_REL_I386_DIR32 __PyRuntime + // 12: 83 c2 04 addl $0x4, %edx + // 15: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 19: 89 54 24 08 movl %edx, 0x8(%esp) + // 1d: 89 44 24 0c movl %eax, 0xc(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x08, 0xc7, 0x02, 0x3c, 0x22, + 0x00, 0x00, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (uintptr_t)&_PyRuntime + 0x223c); +} + +void +emit__LOAD_SMALL_INT_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 08 movl 0x8(%esp), %edx + // c: c7 02 4c 22 00 00 movl $0x224c, (%edx) # imm = 0x224C + // 0000000e: IMAGE_REL_I386_DIR32 __PyRuntime + // 12: 83 c2 04 addl $0x4, %edx + // 15: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 19: 89 54 24 08 movl %edx, 0x8(%esp) + // 1d: 89 44 24 0c movl %eax, 0xc(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x08, 0xc7, 0x02, 0x4c, 0x22, + 0x00, 0x00, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (uintptr_t)&_PyRuntime + 0x224c); +} + +void +emit__LOAD_SMALL_INT_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_2.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 08 movl 0x8(%esp), %edx + // c: c7 02 5c 22 00 00 movl $0x225c, (%edx) # imm = 0x225C + // 0000000e: IMAGE_REL_I386_DIR32 __PyRuntime + // 12: 83 c2 04 addl $0x4, %edx + // 15: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 19: 89 54 24 08 movl %edx, 0x8(%esp) + // 1d: 89 44 24 0c movl %eax, 0xc(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x08, 0xc7, 0x02, 0x5c, 0x22, + 0x00, 0x00, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (uintptr_t)&_PyRuntime + 0x225c); +} + +void +emit__LOAD_SMALL_INT_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_3.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 08 movl 0x8(%esp), %edx + // c: c7 02 6c 22 00 00 movl $0x226c, (%edx) # imm = 0x226C + // 0000000e: IMAGE_REL_I386_DIR32 __PyRuntime + // 12: 83 c2 04 addl $0x4, %edx + // 15: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 19: 89 54 24 08 movl %edx, 0x8(%esp) + // 1d: 89 44 24 0c movl %eax, 0xc(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x08, 0xc7, 0x02, 0x6c, 0x22, + 0x00, 0x00, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, (uintptr_t)&_PyRuntime + 0x226c); +} + +void +emit__LOAD_SPECIAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SPECIAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 74 24 20 movl 0x20(%esp), %esi + // 9: 8b 7c 24 18 movl 0x18(%esp), %edi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: b9 00 00 00 00 movl $0x0, %ecx + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 16: 0f b7 d9 movzwl %cx, %ebx + // 19: 8b 68 fc movl -0x4(%eax), %ebp + // 1c: 83 c0 fc addl $-0x4, %eax + // 1f: 8b 0c dd 00 00 00 00 movl (,%ebx,8), %ecx + // 00000022: IMAGE_REL_I386_DIR32 __Py_SpecialMethods + // 26: 89 47 20 movl %eax, 0x20(%edi) + // 29: 89 e0 movl %esp, %eax + // 2b: 50 pushl %eax + // 2c: 51 pushl %ecx + // 2d: 55 pushl %ebp + // 2e: e8 00 00 00 00 calll 0x33 <__JIT_ENTRY+0x33> + // 0000002f: IMAGE_REL_I386_REL32 __PyObject_LookupSpecialMethod + // 33: 83 c4 0c addl $0xc, %esp + // 36: 8b 4f 20 movl 0x20(%edi), %ecx + // 39: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 40: 85 c0 testl %eax, %eax + // 42: 74 23 je 0x67 <__JIT_ENTRY+0x67> + // 44: 8b 14 24 movl (%esp), %edx + // 47: 89 01 movl %eax, (%ecx) + // 49: 89 51 04 movl %edx, 0x4(%ecx) + // 4c: 83 c1 08 addl $0x8, %ecx + // 4f: 89 7c 24 18 movl %edi, 0x18(%esp) + // 53: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 57: 89 74 24 20 movl %esi, 0x20(%esp) + // 5b: 83 c4 04 addl $0x4, %esp + // 5e: 5e popl %esi + // 5f: 5f popl %edi + // 60: 5b popl %ebx + // 61: 5d popl %ebp + // 62: e9 00 00 00 00 jmp 0x67 <__JIT_ENTRY+0x67> + // 00000063: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 67: 8b 46 48 movl 0x48(%esi), %eax + // 6a: 85 c0 testl %eax, %eax + // 6c: 74 06 je 0x74 <__JIT_ENTRY+0x74> + // 6e: 83 78 04 00 cmpl $0x0, 0x4(%eax) + // 72: 75 29 jne 0x9d <__JIT_ENTRY+0x9d> + // 74: 89 4f 20 movl %ecx, 0x20(%edi) + // 77: 8b 45 04 movl 0x4(%ebp), %eax + // 7a: ff 70 0c pushl 0xc(%eax) + // 7d: ff 34 dd 04 00 00 00 pushl 0x4(,%ebx,8) + // 00000080: IMAGE_REL_I386_DIR32 __Py_SpecialMethods + // 84: ff 35 00 00 00 00 pushl 0x0 + // 00000086: IMAGE_REL_I386_DIR32 _PyExc_TypeError + // 8a: 56 pushl %esi + // 8b: e8 00 00 00 00 calll 0x90 <__JIT_ENTRY+0x90> + // 0000008c: IMAGE_REL_I386_REL32 __PyErr_Format + // 90: 83 c4 10 addl $0x10, %esp + // 93: 8b 4f 20 movl 0x20(%edi), %ecx + // 96: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 9d: 89 74 24 20 movl %esi, 0x20(%esp) + // a1: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // a5: 89 7c 24 18 movl %edi, 0x18(%esp) + // a9: 83 c4 04 addl $0x4, %esp + // ac: 5e popl %esi + // ad: 5f popl %edi + // ae: 5b popl %ebx + // af: 5d popl %ebp + // b0: e9 00 00 00 00 jmp 0xb5 <__JIT_ENTRY+0xb5> + // 000000b1: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[181] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x74, 0x24, + 0x20, 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xd9, 0x8b, 0x68, 0xfc, 0x83, 0xc0, 0xfc, 0x8b, + 0x0c, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x89, 0x47, + 0x20, 0x89, 0xe0, 0x50, 0x51, 0x55, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x4f, + 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x23, 0x8b, 0x14, 0x24, 0x89, + 0x01, 0x89, 0x51, 0x04, 0x83, 0xc1, 0x08, 0x89, + 0x7c, 0x24, 0x18, 0x89, 0x4c, 0x24, 0x1c, 0x89, + 0x74, 0x24, 0x20, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x46, 0x48, 0x85, 0xc0, 0x74, 0x06, 0x83, 0x78, + 0x04, 0x00, 0x75, 0x29, 0x89, 0x4f, 0x20, 0x8b, + 0x45, 0x04, 0xff, 0x70, 0x0c, 0xff, 0x34, 0xdd, + 0x04, 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x10, 0x8b, 0x4f, 0x20, 0xc7, 0x47, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x74, 0x24, + 0x20, 0x89, 0x4c, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, instruction->oparg); + patch_32(code + 0x22, (uintptr_t)&_Py_SpecialMethods); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)&_PyObject_LookupSpecialMethod + -0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x80, (uintptr_t)&_Py_SpecialMethods + 0x4); + patch_32(code + 0x86, (uintptr_t)&PyExc_TypeError); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0xb1, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_SUPER_ATTR_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_ATTR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 5c 24 24 movl 0x24(%esp), %ebx + // b: 8b 44 24 20 movl 0x20(%esp), %eax + // f: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 13: 81 78 f4 00 00 00 00 cmpl $0x0, -0xc(%eax) + // 00000016: IMAGE_REL_I386_DIR32 _PySuper_Type + // 1a: 75 0c jne 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 68 f8 movl -0x8(%eax), %ebp + // 1f: 8b 4d 04 movl 0x4(%ebp), %ecx + // 22: 83 79 54 00 cmpl $0x0, 0x54(%ecx) + // 26: 78 18 js 0x40 <__JIT_ENTRY+0x40> + // 28: 89 5c 24 24 movl %ebx, 0x24(%esp) + // 2c: 89 44 24 20 movl %eax, 0x20(%esp) + // 30: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 34: 83 c4 08 addl $0x8, %esp + // 37: 5e popl %esi + // 38: 5f popl %edi + // 39: 5b popl %ebx + // 3a: 5d popl %ebp + // 3b: e9 00 00 00 00 jmp 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 40: 8b 70 fc movl -0x4(%eax), %esi + // 43: 8b 0f movl (%edi), %ecx + // 45: 8b 49 10 movl 0x10(%ecx), %ecx + // 48: ba 00 00 00 00 movl $0x0, %edx + // 00000049: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 4d: 81 e2 fc ff 00 00 andl $0xfffc, %edx # imm = 0xFFFC + // 53: 8b 4c 11 0c movl 0xc(%ecx,%edx), %ecx + // 57: 89 47 20 movl %eax, 0x20(%edi) + // 5a: 6a 00 pushl $0x0 + // 5c: 51 pushl %ecx + // 5d: 89 74 24 0c movl %esi, 0xc(%esp) + // 61: 56 pushl %esi + // 62: 55 pushl %ebp + // 63: e8 00 00 00 00 calll 0x68 <__JIT_ENTRY+0x68> + // 00000064: IMAGE_REL_I386_REL32 __PySuper_Lookup + // 68: 83 c4 10 addl $0x10, %esp + // 6b: 8b 77 20 movl 0x20(%edi), %esi + // 6e: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 75: 8b 0d 00 00 00 00 movl 0x0, %ecx + // 00000077: IMAGE_REL_I386_DIR32 _PySuper_Type + // 7b: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 81: 7f 1e jg 0xa1 <__JIT_ENTRY+0xa1> + // 83: 49 decl %ecx + // 84: 89 0d 00 00 00 00 movl %ecx, 0x0 + // 00000086: IMAGE_REL_I386_DIR32 _PySuper_Type + // 8a: 75 15 jne 0xa1 <__JIT_ENTRY+0xa1> + // 8c: 68 00 00 00 00 pushl $0x0 + // 0000008d: IMAGE_REL_I386_DIR32 _PySuper_Type + // 91: 89 44 24 04 movl %eax, 0x4(%esp) + // 95: e8 00 00 00 00 calll 0x9a <__JIT_ENTRY+0x9a> + // 00000096: IMAGE_REL_I386_REL32 __Py_Dealloc + // 9a: 8b 44 24 04 movl 0x4(%esp), %eax + // 9e: 83 c4 04 addl $0x4, %esp + // a1: 8b 4d 00 movl (%ebp), %ecx + // a4: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // aa: 7f 13 jg 0xbf <__JIT_ENTRY+0xbf> + // ac: 49 decl %ecx + // ad: 89 4d 00 movl %ecx, (%ebp) + // b0: 75 0d jne 0xbf <__JIT_ENTRY+0xbf> + // b2: 55 pushl %ebp + // b3: 89 c5 movl %eax, %ebp + // b5: e8 00 00 00 00 calll 0xba <__JIT_ENTRY+0xba> + // 000000b6: IMAGE_REL_I386_REL32 __Py_Dealloc + // ba: 89 e8 movl %ebp, %eax + // bc: 83 c4 04 addl $0x4, %esp + // bf: 8b 4c 24 04 movl 0x4(%esp), %ecx + // c3: 8b 11 movl (%ecx), %edx + // c5: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // cb: 7f 12 jg 0xdf <__JIT_ENTRY+0xdf> + // cd: 4a decl %edx + // ce: 89 11 movl %edx, (%ecx) + // d0: 75 0d jne 0xdf <__JIT_ENTRY+0xdf> + // d2: 51 pushl %ecx + // d3: 89 c5 movl %eax, %ebp + // d5: e8 00 00 00 00 calll 0xda <__JIT_ENTRY+0xda> + // 000000d6: IMAGE_REL_I386_REL32 __Py_Dealloc + // da: 89 e8 movl %ebp, %eax + // dc: 83 c4 04 addl $0x4, %esp + // df: 85 c0 testl %eax, %eax + // e1: 74 1e je 0x101 <__JIT_ENTRY+0x101> + // e3: 89 46 f4 movl %eax, -0xc(%esi) + // e6: 83 c6 f8 addl $-0x8, %esi + // e9: 89 5c 24 24 movl %ebx, 0x24(%esp) + // ed: 89 74 24 20 movl %esi, 0x20(%esp) + // f1: 89 7c 24 1c movl %edi, 0x1c(%esp) + // f5: 83 c4 08 addl $0x8, %esp + // f8: 5e popl %esi + // f9: 5f popl %edi + // fa: 5b popl %ebx + // fb: 5d popl %ebp + // fc: e9 00 00 00 00 jmp 0x101 <__JIT_ENTRY+0x101> + // 000000fd: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 101: 83 c6 f4 addl $-0xc, %esi + // 104: 89 5c 24 24 movl %ebx, 0x24(%esp) + // 108: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 10c: 89 74 24 20 movl %esi, 0x20(%esp) + // 110: 83 c4 08 addl $0x8, %esp + // 113: 5e popl %esi + // 114: 5f popl %edi + // 115: 5b popl %ebx + // 116: 5d popl %ebp + // 117: e9 00 00 00 00 jmp 0x11c <__JIT_ENTRY+0x11c> + // 00000118: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[284] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x5c, 0x24, 0x24, 0x8b, 0x44, 0x24, 0x20, 0x8b, + 0x7c, 0x24, 0x1c, 0x81, 0x78, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x0c, 0x8b, 0x68, 0xf8, 0x8b, + 0x4d, 0x04, 0x83, 0x79, 0x54, 0x00, 0x78, 0x18, + 0x89, 0x5c, 0x24, 0x24, 0x89, 0x44, 0x24, 0x20, + 0x89, 0x7c, 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x70, 0xfc, 0x8b, 0x0f, 0x8b, 0x49, 0x10, + 0xba, 0x00, 0x00, 0x00, 0x00, 0x81, 0xe2, 0xfc, + 0xff, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x0c, 0x89, + 0x47, 0x20, 0x6a, 0x00, 0x51, 0x89, 0x74, 0x24, + 0x0c, 0x56, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x10, 0x8b, 0x77, 0x20, 0xc7, 0x47, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x1e, 0x49, 0x89, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x15, 0x68, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x44, 0x24, 0x04, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x44, 0x24, 0x04, 0x83, 0xc4, + 0x04, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x13, 0x49, 0x89, 0x4d, 0x00, + 0x75, 0x0d, 0x55, 0x89, 0xc5, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xe8, 0x83, 0xc4, 0x04, 0x8b, + 0x4c, 0x24, 0x04, 0x8b, 0x11, 0x81, 0xfa, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x4a, 0x89, 0x11, + 0x75, 0x0d, 0x51, 0x89, 0xc5, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xe8, 0x83, 0xc4, 0x04, 0x85, + 0xc0, 0x74, 0x1e, 0x89, 0x46, 0xf4, 0x83, 0xc6, + 0xf8, 0x89, 0x5c, 0x24, 0x24, 0x89, 0x74, 0x24, + 0x20, 0x89, 0x7c, 0x24, 0x1c, 0x83, 0xc4, 0x08, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc6, 0xf4, 0x89, 0x5c, 0x24, 0x24, + 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x74, 0x24, 0x20, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&PySuper_Type); + patch_x86_64_32rx(code + 0x3c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x49, instruction->oparg); + patch_x86_64_32rx(code + 0x64, (uintptr_t)&_PySuper_Lookup + -0x4); + patch_32(code + 0x77, (uintptr_t)&PySuper_Type); + patch_32(code + 0x86, (uintptr_t)&PySuper_Type); + patch_32(code + 0x8d, (uintptr_t)&PySuper_Type); + patch_x86_64_32rx(code + 0x96, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xb6, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xd6, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xfd, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x118, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_SUPER_ATTR_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_METHOD.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 7c 24 28 movl 0x28(%esp), %edi + // b: 8b 44 24 24 movl 0x24(%esp), %eax + // f: 8b 74 24 20 movl 0x20(%esp), %esi + // 13: 81 78 f4 00 00 00 00 cmpl $0x0, -0xc(%eax) + // 00000016: IMAGE_REL_I386_DIR32 _PySuper_Type + // 1a: 75 0c jne 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 58 f8 movl -0x8(%eax), %ebx + // 1f: 8b 4b 04 movl 0x4(%ebx), %ecx + // 22: 83 79 54 00 cmpl $0x0, 0x54(%ecx) + // 26: 78 18 js 0x40 <__JIT_ENTRY+0x40> + // 28: 89 7c 24 28 movl %edi, 0x28(%esp) + // 2c: 89 44 24 24 movl %eax, 0x24(%esp) + // 30: 89 74 24 20 movl %esi, 0x20(%esp) + // 34: 83 c4 0c addl $0xc, %esp + // 37: 5e popl %esi + // 38: 5f popl %edi + // 39: 5b popl %ebx + // 3a: 5d popl %ebp + // 3b: e9 00 00 00 00 jmp 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 40: 8b 68 fc movl -0x4(%eax), %ebp + // 43: 8b 0e movl (%esi), %ecx + // 45: 8b 49 10 movl 0x10(%ecx), %ecx + // 48: ba 00 00 00 00 movl $0x0, %edx + // 00000049: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 4d: 81 e2 fc ff 00 00 andl $0xfffc, %edx # imm = 0xFFFC + // 53: 8b 4c 11 0c movl 0xc(%ecx,%edx), %ecx + // 57: c7 44 24 08 00 00 00 00 movl $0x0, 0x8(%esp) + // 5f: 89 46 20 movl %eax, 0x20(%esi) + // 62: 8b 45 04 movl 0x4(%ebp), %eax + // 65: 31 d2 xorl %edx, %edx + // 67: 81 78 48 00 00 00 00 cmpl $0x0, 0x48(%eax) + // 0000006a: IMAGE_REL_I386_DIR32 _PyObject_GenericGetAttr + // 6e: 8d 44 24 08 leal 0x8(%esp), %eax + // 72: 0f 45 c2 cmovnel %edx, %eax + // 75: 50 pushl %eax + // 76: 51 pushl %ecx + // 77: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 7b: 55 pushl %ebp + // 7c: 53 pushl %ebx + // 7d: e8 00 00 00 00 calll 0x82 <__JIT_ENTRY+0x82> + // 0000007e: IMAGE_REL_I386_REL32 __PySuper_Lookup + // 82: 83 c4 10 addl $0x10, %esp + // 85: 8b 6e 20 movl 0x20(%esi), %ebp + // 88: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8f: 85 c0 testl %eax, %eax + // 91: 74 1d je 0xb0 <__JIT_ENTRY+0xb0> + // 93: 83 7c 24 08 00 cmpl $0x0, 0x8(%esp) + // 98: 74 2e je 0xc8 <__JIT_ENTRY+0xc8> + // 9a: 8b 14 24 movl (%esp), %edx + // 9d: 8b 0d 00 00 00 00 movl 0x0, %ecx + // 0000009f: IMAGE_REL_I386_DIR32 _PySuper_Type + // a3: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a9: 7e 5f jle 0x10a <__JIT_ENTRY+0x10a> + // ab: e9 80 00 00 00 jmp 0x130 <__JIT_ENTRY+0x130> + // b0: 89 7c 24 28 movl %edi, 0x28(%esp) + // b4: 89 6c 24 24 movl %ebp, 0x24(%esp) + // b8: 89 74 24 20 movl %esi, 0x20(%esp) + // bc: 83 c4 0c addl $0xc, %esp + // bf: 5e popl %esi + // c0: 5f popl %edi + // c1: 5b popl %ebx + // c2: 5d popl %ebp + // c3: e9 00 00 00 00 jmp 0xc8 <__JIT_ENTRY+0xc8> + // 000000c4: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // c8: 83 c5 fc addl $-0x4, %ebp + // cb: 89 6e 20 movl %ebp, 0x20(%esi) + // ce: 8b 14 24 movl (%esp), %edx + // d1: 8b 0a movl (%edx), %ecx + // d3: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // d9: 7f 12 jg 0xed <__JIT_ENTRY+0xed> + // db: 49 decl %ecx + // dc: 89 0a movl %ecx, (%edx) + // de: 75 0d jne 0xed <__JIT_ENTRY+0xed> + // e0: 52 pushl %edx + // e1: 89 c5 movl %eax, %ebp + // e3: e8 00 00 00 00 calll 0xe8 <__JIT_ENTRY+0xe8> + // 000000e4: IMAGE_REL_I386_REL32 __Py_Dealloc + // e8: 89 e8 movl %ebp, %eax + // ea: 83 c4 04 addl $0x4, %esp + // ed: 8b 6e 20 movl 0x20(%esi), %ebp + // f0: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // f7: 83 c5 04 addl $0x4, %ebp + // fa: 31 d2 xorl %edx, %edx + // fc: 8b 0d 00 00 00 00 movl 0x0, %ecx + // 000000fe: IMAGE_REL_I386_DIR32 _PySuper_Type + // 102: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 108: 7f 26 jg 0x130 <__JIT_ENTRY+0x130> + // 10a: 49 decl %ecx + // 10b: 89 0d 00 00 00 00 movl %ecx, 0x0 + // 0000010d: IMAGE_REL_I386_DIR32 _PySuper_Type + // 111: 75 1d jne 0x130 <__JIT_ENTRY+0x130> + // 113: 68 00 00 00 00 pushl $0x0 + // 00000114: IMAGE_REL_I386_DIR32 _PySuper_Type + // 118: 89 44 24 08 movl %eax, 0x8(%esp) + // 11c: 89 54 24 04 movl %edx, 0x4(%esp) + // 120: e8 00 00 00 00 calll 0x125 <__JIT_ENTRY+0x125> + // 00000121: IMAGE_REL_I386_REL32 __Py_Dealloc + // 125: 8b 54 24 04 movl 0x4(%esp), %edx + // 129: 8b 44 24 08 movl 0x8(%esp), %eax + // 12d: 83 c4 04 addl $0x4, %esp + // 130: 8b 0b movl (%ebx), %ecx + // 132: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 138: 7f 1a jg 0x154 <__JIT_ENTRY+0x154> + // 13a: 49 decl %ecx + // 13b: 89 0b movl %ecx, (%ebx) + // 13d: 75 15 jne 0x154 <__JIT_ENTRY+0x154> + // 13f: 53 pushl %ebx + // 140: 89 44 24 08 movl %eax, 0x8(%esp) + // 144: 89 d3 movl %edx, %ebx + // 146: e8 00 00 00 00 calll 0x14b <__JIT_ENTRY+0x14b> + // 00000147: IMAGE_REL_I386_REL32 __Py_Dealloc + // 14b: 89 da movl %ebx, %edx + // 14d: 8b 44 24 08 movl 0x8(%esp), %eax + // 151: 83 c4 04 addl $0x4, %esp + // 154: 89 45 f4 movl %eax, -0xc(%ebp) + // 157: 89 55 f8 movl %edx, -0x8(%ebp) + // 15a: 83 c5 fc addl $-0x4, %ebp + // 15d: 89 74 24 20 movl %esi, 0x20(%esp) + // 161: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 165: 89 7c 24 28 movl %edi, 0x28(%esp) + // 169: 83 c4 0c addl $0xc, %esp + // 16c: 5e popl %esi + // 16d: 5f popl %edi + // 16e: 5b popl %ebx + // 16f: 5d popl %ebp + // 170: e9 00 00 00 00 jmp 0x175 <__JIT_ENTRY+0x175> + // 00000171: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[368] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x7c, 0x24, 0x28, 0x8b, 0x44, 0x24, 0x24, 0x8b, + 0x74, 0x24, 0x20, 0x81, 0x78, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x0c, 0x8b, 0x58, 0xf8, 0x8b, + 0x4b, 0x04, 0x83, 0x79, 0x54, 0x00, 0x78, 0x18, + 0x89, 0x7c, 0x24, 0x28, 0x89, 0x44, 0x24, 0x24, + 0x89, 0x74, 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x68, 0xfc, 0x8b, 0x0e, 0x8b, 0x49, 0x10, + 0xba, 0x00, 0x00, 0x00, 0x00, 0x81, 0xe2, 0xfc, + 0xff, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x0c, 0xc7, + 0x44, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x46, 0x20, 0x8b, 0x45, 0x04, 0x31, 0xd2, 0x81, + 0x78, 0x48, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x44, + 0x24, 0x08, 0x0f, 0x45, 0xc2, 0x50, 0x51, 0x89, + 0x6c, 0x24, 0x08, 0x55, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x10, 0x8b, 0x6e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x1d, 0x83, 0x7c, 0x24, 0x08, 0x00, + 0x74, 0x2e, 0x8b, 0x14, 0x24, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0x5f, 0xe9, 0x80, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x28, 0x89, 0x6c, 0x24, 0x24, + 0x89, 0x74, 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc5, 0xfc, 0x89, 0x6e, 0x20, 0x8b, 0x14, + 0x24, 0x8b, 0x0a, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x0a, 0x75, 0x0d, + 0x52, 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xe8, 0x83, 0xc4, 0x04, 0x8b, 0x6e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc5, 0x04, 0x31, 0xd2, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x26, 0x49, 0x89, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x1d, 0x68, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x44, 0x24, 0x08, 0x89, 0x54, 0x24, 0x04, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, + 0x04, 0x8b, 0x44, 0x24, 0x08, 0x83, 0xc4, 0x04, + 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x1a, 0x49, 0x89, 0x0b, 0x75, 0x15, 0x53, + 0x89, 0x44, 0x24, 0x08, 0x89, 0xd3, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xda, 0x8b, 0x44, 0x24, + 0x08, 0x83, 0xc4, 0x04, 0x89, 0x45, 0xf4, 0x89, + 0x55, 0xf8, 0x83, 0xc5, 0xfc, 0x89, 0x74, 0x24, + 0x20, 0x89, 0x6c, 0x24, 0x24, 0x89, 0x7c, 0x24, + 0x28, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&PySuper_Type); + patch_x86_64_32rx(code + 0x3c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x49, instruction->oparg); + patch_32(code + 0x6a, (uintptr_t)&PyObject_GenericGetAttr); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)&_PySuper_Lookup + -0x4); + patch_32(code + 0x9f, (uintptr_t)&PySuper_Type); + patch_x86_64_32rx(code + 0xc4, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0xfe, (uintptr_t)&PySuper_Type); + patch_32(code + 0x10d, (uintptr_t)&PySuper_Type); + patch_32(code + 0x114, (uintptr_t)&PySuper_Type); + patch_x86_64_32rx(code + 0x121, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x147, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__MAKE_CALLARGS_A_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CALLARGS_A_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 4c 24 18 movl 0x18(%esp), %ecx + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 69 f8 movl -0x8(%ecx), %ebp + // 13: 8b 59 fc movl -0x4(%ecx), %ebx + // 16: 81 7d 04 00 00 00 00 cmpl $0x0, 0x4(%ebp) + // 00000019: IMAGE_REL_I386_DIR32 _PyTuple_Type + // 1d: 74 6c je 0x8b <__JIT_ENTRY+0x8b> + // 1f: 8b 41 f0 movl -0x10(%ecx), %eax + // 22: 89 4e 20 movl %ecx, 0x20(%esi) + // 25: 55 pushl %ebp + // 26: 50 pushl %eax + // 27: 57 pushl %edi + // 28: e8 00 00 00 00 calll 0x2d <__JIT_ENTRY+0x2d> + // 00000029: IMAGE_REL_I386_REL32 __Py_Check_ArgsIterable + // 2d: 83 c4 0c addl $0xc, %esp + // 30: 8b 4e 20 movl 0x20(%esi), %ecx + // 33: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 68 js 0xa6 <__JIT_ENTRY+0xa6> + // 3e: 89 4e 20 movl %ecx, 0x20(%esi) + // 41: 55 pushl %ebp + // 42: e8 00 00 00 00 calll 0x47 <__JIT_ENTRY+0x47> + // 00000043: IMAGE_REL_I386_REL32 _PySequence_Tuple + // 47: 83 c4 04 addl $0x4, %esp + // 4a: 8b 4e 20 movl 0x20(%esi), %ecx + // 4d: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 54: 85 c0 testl %eax, %eax + // 56: 74 4e je 0xa6 <__JIT_ENTRY+0xa6> + // 58: 83 c1 f8 addl $-0x8, %ecx + // 5b: 89 4e 20 movl %ecx, 0x20(%esi) + // 5e: 8b 4d 00 movl (%ebp), %ecx + // 61: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 67: 7f 13 jg 0x7c <__JIT_ENTRY+0x7c> + // 69: 49 decl %ecx + // 6a: 89 4d 00 movl %ecx, (%ebp) + // 6d: 75 0d jne 0x7c <__JIT_ENTRY+0x7c> + // 6f: 55 pushl %ebp + // 70: 89 c5 movl %eax, %ebp + // 72: e8 00 00 00 00 calll 0x77 <__JIT_ENTRY+0x77> + // 00000073: IMAGE_REL_I386_REL32 __Py_Dealloc + // 77: 89 e8 movl %ebp, %eax + // 79: 83 c4 04 addl $0x4, %esp + // 7c: 8b 4e 20 movl 0x20(%esi), %ecx + // 7f: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 86: 83 c1 08 addl $0x8, %ecx + // 89: 89 c5 movl %eax, %ebp + // 8b: 89 69 f8 movl %ebp, -0x8(%ecx) + // 8e: 89 59 fc movl %ebx, -0x4(%ecx) + // 91: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 95: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 99: 89 74 24 14 movl %esi, 0x14(%esp) + // 9d: 5e popl %esi + // 9e: 5f popl %edi + // 9f: 5b popl %ebx + // a0: 5d popl %ebp + // a1: e9 00 00 00 00 jmp 0xa6 <__JIT_ENTRY+0xa6> + // 000000a2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // a6: 89 7c 24 1c movl %edi, 0x1c(%esp) + // aa: 89 4c 24 18 movl %ecx, 0x18(%esp) + // ae: 89 74 24 14 movl %esi, 0x14(%esp) + // b2: 5e popl %esi + // b3: 5f popl %edi + // b4: 5b popl %ebx + // b5: 5d popl %ebp + // b6: e9 00 00 00 00 jmp 0xbb <__JIT_ENTRY+0xbb> + // 000000b7: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[187] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x4c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x69, 0xf8, 0x8b, 0x59, 0xfc, 0x81, 0x7d, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, 0x6c, 0x8b, + 0x41, 0xf0, 0x89, 0x4e, 0x20, 0x55, 0x50, 0x57, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, + 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x68, 0x89, 0x4e, + 0x20, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x4e, + 0x83, 0xc1, 0xf8, 0x89, 0x4e, 0x20, 0x8b, 0x4d, + 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x13, 0x49, 0x89, 0x4d, 0x00, 0x75, 0x0d, 0x55, + 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xe8, 0x83, 0xc4, 0x04, 0x8b, 0x4e, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc1, + 0x08, 0x89, 0xc5, 0x89, 0x69, 0xf8, 0x89, 0x59, + 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x4c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x1c, 0x89, 0x4c, 0x24, 0x18, 0x89, 0x74, + 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyTuple_Type); + patch_x86_64_32rx(code + 0x29, (uintptr_t)&_Py_Check_ArgsIterable + -0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)&PySequence_Tuple + -0x4); + patch_x86_64_32rx(code + 0x73, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xb7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MAKE_CELL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CELL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 5c 24 18 movl 0x18(%esp), %ebx + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: b8 00 00 00 00 movl $0x0, %eax + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 e8 movzwl %ax, %ebp + // 18: ff 74 ae 28 pushl 0x28(%esi,%ebp,4) + // 1c: e8 00 00 00 00 calll 0x21 <__JIT_ENTRY+0x21> + // 0000001d: IMAGE_REL_I386_REL32 _PyCell_New + // 21: 83 c4 04 addl $0x4, %esp + // 24: 85 c0 testl %eax, %eax + // 26: 74 45 je 0x6d <__JIT_ENTRY+0x6d> + // 28: 8b 4c ae 28 movl 0x28(%esi,%ebp,4), %ecx + // 2c: 89 44 ae 28 movl %eax, 0x28(%esi,%ebp,4) + // 30: 89 5e 20 movl %ebx, 0x20(%esi) + // 33: 85 c9 testl %ecx, %ecx + // 35: 74 17 je 0x4e <__JIT_ENTRY+0x4e> + // 37: 8b 01 movl (%ecx), %eax + // 39: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 3e: 7f 0e jg 0x4e <__JIT_ENTRY+0x4e> + // 40: 48 decl %eax + // 41: 89 01 movl %eax, (%ecx) + // 43: 75 09 jne 0x4e <__JIT_ENTRY+0x4e> + // 45: 51 pushl %ecx + // 46: e8 00 00 00 00 calll 0x4b <__JIT_ENTRY+0x4b> + // 00000047: IMAGE_REL_I386_REL32 __Py_Dealloc + // 4b: 83 c4 04 addl $0x4, %esp + // 4e: 8b 46 20 movl 0x20(%esi), %eax + // 51: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 58: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 5c: 89 44 24 18 movl %eax, 0x18(%esp) + // 60: 89 74 24 14 movl %esi, 0x14(%esp) + // 64: 5e popl %esi + // 65: 5f popl %edi + // 66: 5b popl %ebx + // 67: 5d popl %ebp + // 68: e9 00 00 00 00 jmp 0x6d <__JIT_ENTRY+0x6d> + // 00000069: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 6d: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 71: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 75: 89 74 24 14 movl %esi, 0x14(%esp) + // 79: 5e popl %esi + // 7a: 5f popl %edi + // 7b: 5b popl %ebx + // 7c: 5d popl %ebp + // 7d: e9 00 00 00 00 jmp 0x82 <__JIT_ENTRY+0x82> + // 0000007e: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[130] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x5c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xe8, + 0xff, 0x74, 0xae, 0x28, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x74, 0x45, + 0x8b, 0x4c, 0xae, 0x28, 0x89, 0x44, 0xae, 0x28, + 0x89, 0x5e, 0x20, 0x85, 0xc9, 0x74, 0x17, 0x8b, + 0x01, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x48, 0x89, 0x01, 0x75, 0x09, 0x51, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x44, 0x24, 0x18, + 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, + 0x1c, 0x89, 0x5c, 0x24, 0x18, 0x89, 0x74, 0x24, + 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)&PyCell_New + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x69, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x7e, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MAKE_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_FUNCTION.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: 8b 68 fc movl -0x4(%eax), %ebp + // 17: 89 47 20 movl %eax, 0x20(%edi) + // 1a: ff 77 0c pushl 0xc(%edi) + // 1d: 55 pushl %ebp + // 1e: e8 00 00 00 00 calll 0x23 <__JIT_ENTRY+0x23> + // 0000001f: IMAGE_REL_I386_REL32 _PyFunction_New + // 23: 83 c4 08 addl $0x8, %esp + // 26: 83 47 20 fc addl $-0x4, 0x20(%edi) + // 2a: 89 c6 movl %eax, %esi + // 2c: 8b 45 00 movl (%ebp), %eax + // 2f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 34: 7f 06 jg 0x3c <__JIT_ENTRY+0x3c> + // 36: 48 decl %eax + // 37: 89 45 00 movl %eax, (%ebp) + // 3a: 74 3a je 0x76 <__JIT_ENTRY+0x76> + // 3c: 8b 5f 20 movl 0x20(%edi), %ebx + // 3f: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 46: 85 f6 testl %esi, %esi + // 48: 74 43 je 0x8d <__JIT_ENTRY+0x8d> + // 4a: ff 75 44 pushl 0x44(%ebp) + // 4d: 56 pushl %esi + // 4e: e8 00 00 00 00 calll 0x53 <__JIT_ENTRY+0x53> + // 0000004f: IMAGE_REL_I386_REL32 __PyFunction_SetVersion + // 53: 83 c4 08 addl $0x8, %esp + // 56: 89 33 movl %esi, (%ebx) + // 58: 83 c3 04 addl $0x4, %ebx + // 5b: 8b 04 24 movl (%esp), %eax + // 5e: 89 44 24 20 movl %eax, 0x20(%esp) + // 62: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 66: 89 7c 24 18 movl %edi, 0x18(%esp) + // 6a: 83 c4 04 addl $0x4, %esp + // 6d: 5e popl %esi + // 6e: 5f popl %edi + // 6f: 5b popl %ebx + // 70: 5d popl %ebp + // 71: e9 00 00 00 00 jmp 0x76 <__JIT_ENTRY+0x76> + // 00000072: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 76: 55 pushl %ebp + // 77: e8 00 00 00 00 calll 0x7c <__JIT_ENTRY+0x7c> + // 00000078: IMAGE_REL_I386_REL32 __Py_Dealloc + // 7c: 83 c4 04 addl $0x4, %esp + // 7f: 8b 5f 20 movl 0x20(%edi), %ebx + // 82: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 89: 85 f6 testl %esi, %esi + // 8b: 75 bd jne 0x4a <__JIT_ENTRY+0x4a> + // 8d: 8b 04 24 movl (%esp), %eax + // 90: 89 44 24 20 movl %eax, 0x20(%esp) + // 94: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 98: 89 7c 24 18 movl %edi, 0x18(%esp) + // 9c: 83 c4 04 addl $0x4, %esp + // 9f: 5e popl %esi + // a0: 5f popl %edi + // a1: 5b popl %ebx + // a2: 5d popl %ebp + // a3: e9 00 00 00 00 jmp 0xa8 <__JIT_ENTRY+0xa8> + // 000000a4: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[168] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0x8b, 0x68, 0xfc, 0x89, + 0x47, 0x20, 0xff, 0x77, 0x0c, 0x55, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x83, 0x47, + 0x20, 0xfc, 0x89, 0xc6, 0x8b, 0x45, 0x00, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x06, 0x48, 0x89, + 0x45, 0x00, 0x74, 0x3a, 0x8b, 0x5f, 0x20, 0xc7, + 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xf6, + 0x74, 0x43, 0xff, 0x75, 0x44, 0x56, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x08, 0x89, 0x33, + 0x83, 0xc3, 0x04, 0x8b, 0x04, 0x24, 0x89, 0x44, + 0x24, 0x20, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, + 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x5f, 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xf6, 0x75, 0xbd, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x20, 0x89, 0x5c, 0x24, 0x1c, + 0x89, 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)&PyFunction_New + -0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)&_PyFunction_SetVersion + -0x4); + patch_x86_64_32rx(code + 0x72, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x78, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa4, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MAKE_WARM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_WARM.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: c6 05 13 00 00 00 01 movb $0x1, 0x13 + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_EXECUTOR + // 14: 8b 72 08 movl 0x8(%edx), %esi + // 17: ff 8e d0 bb 01 00 decl 0x1bbd0(%esi) + // 1d: 75 08 jne 0x27 <__JIT_ENTRY+0x27> + // 1f: f0 lock + // 20: 81 4a 0c 80 00 00 00 orl $0x80, 0xc(%edx) + // 27: 89 54 24 10 movl %edx, 0x10(%esp) + // 2b: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2f: 89 44 24 08 movl %eax, 0x8(%esp) + // 33: 5e popl %esi + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 00000035: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[52] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0xc6, 0x05, 0x13, + 0x00, 0x00, 0x00, 0x01, 0x8b, 0x72, 0x08, 0xff, + 0x8e, 0xd0, 0xbb, 0x01, 0x00, 0x75, 0x08, 0xf0, + 0x81, 0x4a, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x89, + 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, + 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, (uintptr_t)executor + 0x13); +} + +void +emit__MAP_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAP_ADD.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c9 movzwl %cx, %ecx + // 18: 8b 50 f8 movl -0x8(%eax), %edx + // 1b: 8b 58 fc movl -0x4(%eax), %ebx + // 1e: bd fe ff ff ff movl $0xfffffffe, %ebp # imm = 0xFFFFFFFE + // 23: 29 cd subl %ecx, %ebp + // 25: 8b 0c a8 movl (%eax,%ebp,4), %ecx + // 28: 89 46 20 movl %eax, 0x20(%esi) + // 2b: 53 pushl %ebx + // 2c: 52 pushl %edx + // 2d: 51 pushl %ecx + // 2e: e8 00 00 00 00 calll 0x33 <__JIT_ENTRY+0x33> + // 0000002f: IMAGE_REL_I386_REL32 __PyDict_SetItem_Take2 + // 33: 83 c4 0c addl $0xc, %esp + // 36: 8b 4e 20 movl 0x20(%esi), %ecx + // 39: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 40: 83 c1 f8 addl $-0x8, %ecx + // 43: 85 c0 testl %eax, %eax + // 45: 74 15 je 0x5c <__JIT_ENTRY+0x5c> + // 47: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 4b: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 4f: 89 74 24 14 movl %esi, 0x14(%esp) + // 53: 5e popl %esi + // 54: 5f popl %edi + // 55: 5b popl %ebx + // 56: 5d popl %ebp + // 57: e9 00 00 00 00 jmp 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 5c: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 60: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 64: 89 74 24 14 movl %esi, 0x14(%esp) + // 68: 5e popl %esi + // 69: 5f popl %edi + // 6a: 5b popl %ebx + // 6b: 5d popl %ebp + // 6c: e9 00 00 00 00 jmp 0x71 <__JIT_ENTRY+0x71> + // 0000006d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[108] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x8b, 0x50, 0xf8, 0x8b, 0x58, 0xfc, 0xbd, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xcd, 0x8b, 0x0c, 0xa8, + 0x89, 0x46, 0x20, 0x53, 0x52, 0x51, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x4e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc1, 0xf8, 0x85, 0xc0, 0x74, 0x15, 0x89, + 0x7c, 0x24, 0x1c, 0x89, 0x4c, 0x24, 0x18, 0x89, + 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x4c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)&_PyDict_SetItem_Take2 + -0x4); + patch_x86_64_32rx(code + 0x58, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MATCH_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_CLASS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 54 24 28 movl 0x28(%esp), %edx + // b: 8b 5c 24 20 movl 0x20(%esp), %ebx + // f: 8b 44 24 24 movl 0x24(%esp), %eax + // 13: b9 00 00 00 00 movl $0x0, %ecx + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 c9 movzwl %cx, %ecx + // 1b: 8b 68 fc movl -0x4(%eax), %ebp + // 1e: 8b 78 f4 movl -0xc(%eax), %edi + // 21: 8b 70 f8 movl -0x8(%eax), %esi + // 24: 89 43 20 movl %eax, 0x20(%ebx) + // 27: 89 6c 24 04 movl %ebp, 0x4(%esp) + // 2b: 55 pushl %ebp + // 2c: 51 pushl %ecx + // 2d: 56 pushl %esi + // 2e: 57 pushl %edi + // 2f: 89 54 24 18 movl %edx, 0x18(%esp) + // 33: 52 pushl %edx + // 34: e8 00 00 00 00 calll 0x39 <__JIT_ENTRY+0x39> + // 00000035: IMAGE_REL_I386_REL32 __PyEval_MatchClass + // 39: 83 c4 14 addl $0x14, %esp + // 3c: 8b 6b 20 movl 0x20(%ebx), %ebp + // 3f: 89 1c 24 movl %ebx, (%esp) + // 42: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // 49: 8b 0f movl (%edi), %ecx + // 4b: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 51: 7f 05 jg 0x58 <__JIT_ENTRY+0x58> + // 53: 49 decl %ecx + // 54: 89 0f movl %ecx, (%edi) + // 56: 74 1e je 0x76 <__JIT_ENTRY+0x76> + // 58: 8b 0e movl (%esi), %ecx + // 5a: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 60: 7f 2b jg 0x8d <__JIT_ENTRY+0x8d> + // 62: 49 decl %ecx + // 63: 89 0e movl %ecx, (%esi) + // 65: 75 26 jne 0x8d <__JIT_ENTRY+0x8d> + // 67: 56 pushl %esi + // 68: 89 c6 movl %eax, %esi + // 6a: e8 00 00 00 00 calll 0x6f <__JIT_ENTRY+0x6f> + // 0000006b: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6f: 89 f0 movl %esi, %eax + // 71: 83 c4 04 addl $0x4, %esp + // 74: eb 17 jmp 0x8d <__JIT_ENTRY+0x8d> + // 76: 57 pushl %edi + // 77: 89 c7 movl %eax, %edi + // 79: e8 00 00 00 00 calll 0x7e <__JIT_ENTRY+0x7e> + // 0000007a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 7e: 89 f8 movl %edi, %eax + // 80: 83 c4 04 addl $0x4, %esp + // 83: 8b 0e movl (%esi), %ecx + // 85: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 8b: 7e d5 jle 0x62 <__JIT_ENTRY+0x62> + // 8d: 8b 54 24 04 movl 0x4(%esp), %edx + // 91: 8b 0a movl (%edx), %ecx + // 93: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 99: 7f 05 jg 0xa0 <__JIT_ENTRY+0xa0> + // 9b: 49 decl %ecx + // 9c: 89 0a movl %ecx, (%edx) + // 9e: 74 29 je 0xc9 <__JIT_ENTRY+0xc9> + // a0: 85 c0 testl %eax, %eax + // a2: 8b 4c 24 08 movl 0x8(%esp), %ecx + // a6: 74 36 je 0xde <__JIT_ENTRY+0xde> + // a8: 89 45 f4 movl %eax, -0xc(%ebp) + // ab: 83 c5 f8 addl $-0x8, %ebp + // ae: 89 4c 24 28 movl %ecx, 0x28(%esp) + // b2: 89 6c 24 24 movl %ebp, 0x24(%esp) + // b6: 8b 04 24 movl (%esp), %eax + // b9: 89 44 24 20 movl %eax, 0x20(%esp) + // bd: 83 c4 0c addl $0xc, %esp + // c0: 5e popl %esi + // c1: 5f popl %edi + // c2: 5b popl %ebx + // c3: 5d popl %ebp + // c4: e9 00 00 00 00 jmp 0xc9 <__JIT_ENTRY+0xc9> + // 000000c5: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // c9: 52 pushl %edx + // ca: 89 c6 movl %eax, %esi + // cc: e8 00 00 00 00 calll 0xd1 <__JIT_ENTRY+0xd1> + // 000000cd: IMAGE_REL_I386_REL32 __Py_Dealloc + // d1: 89 f0 movl %esi, %eax + // d3: 83 c4 04 addl $0x4, %esp + // d6: 85 c0 testl %eax, %eax + // d8: 8b 4c 24 08 movl 0x8(%esp), %ecx + // dc: 75 ca jne 0xa8 <__JIT_ENTRY+0xa8> + // de: 8b 51 48 movl 0x48(%ecx), %edx + // e1: b8 00 00 00 00 movl $0x0, %eax + // 000000e2: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // e6: 85 d2 testl %edx, %edx + // e8: 74 be je 0xa8 <__JIT_ENTRY+0xa8> + // ea: 83 7a 04 00 cmpl $0x0, 0x4(%edx) + // ee: 74 b8 je 0xa8 <__JIT_ENTRY+0xa8> + // f0: 83 c5 f4 addl $-0xc, %ebp + // f3: 89 4c 24 28 movl %ecx, 0x28(%esp) + // f7: 8b 04 24 movl (%esp), %eax + // fa: 89 44 24 20 movl %eax, 0x20(%esp) + // fe: 89 6c 24 24 movl %ebp, 0x24(%esp) + // 102: 83 c4 0c addl $0xc, %esp + // 105: 5e popl %esi + // 106: 5f popl %edi + // 107: 5b popl %ebx + // 108: 5d popl %ebp + // 109: e9 00 00 00 00 jmp 0x10e <__JIT_ENTRY+0x10e> + // 0000010a: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[270] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x54, 0x24, 0x28, 0x8b, 0x5c, 0x24, 0x20, 0x8b, + 0x44, 0x24, 0x24, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc9, 0x8b, 0x68, 0xfc, 0x8b, 0x78, + 0xf4, 0x8b, 0x70, 0xf8, 0x89, 0x43, 0x20, 0x89, + 0x6c, 0x24, 0x04, 0x55, 0x51, 0x56, 0x57, 0x89, + 0x54, 0x24, 0x18, 0x52, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x14, 0x8b, 0x6b, 0x20, 0x89, + 0x1c, 0x24, 0xc7, 0x43, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0f, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0f, 0x74, 0x1e, + 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x2b, 0x49, 0x89, 0x0e, 0x75, 0x26, 0x56, + 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x83, 0xc4, 0x04, 0xeb, 0x17, 0x57, 0x89, + 0xc7, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf8, + 0x83, 0xc4, 0x04, 0x8b, 0x0e, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7e, 0xd5, 0x8b, 0x54, 0x24, + 0x04, 0x8b, 0x0a, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0a, 0x74, 0x29, + 0x85, 0xc0, 0x8b, 0x4c, 0x24, 0x08, 0x74, 0x36, + 0x89, 0x45, 0xf4, 0x83, 0xc5, 0xf8, 0x89, 0x4c, + 0x24, 0x28, 0x89, 0x6c, 0x24, 0x24, 0x8b, 0x04, + 0x24, 0x89, 0x44, 0x24, 0x20, 0x83, 0xc4, 0x0c, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x85, 0xc0, + 0x8b, 0x4c, 0x24, 0x08, 0x75, 0xca, 0x8b, 0x51, + 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x85, 0xd2, + 0x74, 0xbe, 0x83, 0x7a, 0x04, 0x00, 0x74, 0xb8, + 0x83, 0xc5, 0xf4, 0x89, 0x4c, 0x24, 0x28, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, 0x89, 0x6c, + 0x24, 0x24, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_x86_64_32rx(code + 0x35, (uintptr_t)&_PyEval_MatchClass + -0x4); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xcd, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0xe2, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x10a, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MATCH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_KEYS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: 8b 48 f8 movl -0x8(%eax), %ecx + // 11: 8b 50 fc movl -0x4(%eax), %edx + // 14: 89 46 20 movl %eax, 0x20(%esi) + // 17: 52 pushl %edx + // 18: 51 pushl %ecx + // 19: 57 pushl %edi + // 1a: e8 00 00 00 00 calll 0x1f <__JIT_ENTRY+0x1f> + // 0000001b: IMAGE_REL_I386_REL32 __PyEval_MatchKeys + // 1f: 83 c4 0c addl $0xc, %esp + // 22: 8b 4e 20 movl 0x20(%esi), %ecx + // 25: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 2c: 85 c0 testl %eax, %eax + // 2e: 74 18 je 0x48 <__JIT_ENTRY+0x48> + // 30: 89 01 movl %eax, (%ecx) + // 32: 83 c1 04 addl $0x4, %ecx + // 35: 89 7c 24 14 movl %edi, 0x14(%esp) + // 39: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 3d: 89 74 24 0c movl %esi, 0xc(%esp) + // 41: 5e popl %esi + // 42: 5f popl %edi + // 43: e9 00 00 00 00 jmp 0x48 <__JIT_ENTRY+0x48> + // 00000044: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 48: 89 7c 24 14 movl %edi, 0x14(%esp) + // 4c: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 50: 89 74 24 0c movl %esi, 0xc(%esp) + // 54: 5e popl %esi + // 55: 5f popl %edi + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 00000057: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[91] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x48, + 0xf8, 0x8b, 0x50, 0xfc, 0x89, 0x46, 0x20, 0x52, + 0x51, 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x0c, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x18, + 0x89, 0x01, 0x83, 0xc1, 0x04, 0x89, 0x7c, 0x24, + 0x14, 0x89, 0x4c, 0x24, 0x10, 0x89, 0x74, 0x24, + 0x0c, 0x5e, 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x7c, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)&_PyEval_MatchKeys + -0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x57, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MATCH_MAPPING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_MAPPING.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 4c 24 0c movl 0xc(%esp), %ecx + // a: 8b 54 24 10 movl 0x10(%esp), %edx + // e: 8b 72 fc movl -0x4(%edx), %esi + // 11: 8b 76 04 movl 0x4(%esi), %esi + // 14: f6 46 54 40 testb $0x40, 0x54(%esi) + // 18: be 00 00 00 00 movl $0x0, %esi + // 00000019: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 1d: bf 00 00 00 00 movl $0x0, %edi + // 0000001e: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 22: 0f 44 fe cmovel %esi, %edi + // 25: 89 3a movl %edi, (%edx) + // 27: 83 c2 04 addl $0x4, %edx + // 2a: 89 54 24 10 movl %edx, 0x10(%esp) + // 2e: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 32: 89 44 24 14 movl %eax, 0x14(%esp) + // 36: 5e popl %esi + // 37: 5f popl %edi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x57, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x0c, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x72, + 0xfc, 0x8b, 0x76, 0x04, 0xf6, 0x46, 0x54, 0x40, + 0xbe, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x44, 0xfe, 0x89, 0x3a, 0x83, + 0xc2, 0x04, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, + 0x24, 0x0c, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x1e, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__MATCH_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_SEQUENCE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 4c 24 0c movl 0xc(%esp), %ecx + // a: 8b 54 24 10 movl 0x10(%esp), %edx + // e: 8b 72 fc movl -0x4(%edx), %esi + // 11: 8b 76 04 movl 0x4(%esi), %esi + // 14: f6 46 54 20 testb $0x20, 0x54(%esi) + // 18: be 00 00 00 00 movl $0x0, %esi + // 00000019: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 1d: bf 00 00 00 00 movl $0x0, %edi + // 0000001e: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 22: 0f 44 fe cmovel %esi, %edi + // 25: 89 3a movl %edi, (%edx) + // 27: 83 c2 04 addl $0x4, %edx + // 2a: 89 54 24 10 movl %edx, 0x10(%esp) + // 2e: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 32: 89 44 24 14 movl %eax, 0x14(%esp) + // 36: 5e popl %esi + // 37: 5f popl %edi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x57, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x0c, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x72, + 0xfc, 0x8b, 0x76, 0x04, 0xf6, 0x46, 0x54, 0x20, + 0xbe, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x44, 0xfe, 0x89, 0x3a, 0x83, + 0xc2, 0x04, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, + 0x24, 0x0c, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x1e, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__MAYBE_EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 7c 24 28 movl 0x28(%esp), %edi + // b: 8b 44 24 24 movl 0x24(%esp), %eax + // f: 8b 74 24 20 movl 0x20(%esp), %esi + // 13: b9 00 00 00 00 movl $0x0, %ecx + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 d1 movzwl %cx, %edx + // 1b: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 20: 29 d1 subl %edx, %ecx + // 22: 8b 1c 88 movl (%eax,%ecx,4), %ebx + // 25: 81 7b 04 00 00 00 00 cmpl $0x0, 0x4(%ebx) + // 00000028: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 2c: 75 70 jne 0x9e <__JIT_ENTRY+0x9e> + // 2e: f7 d2 notl %edx + // 30: 83 3c 90 00 cmpl $0x0, (%eax,%edx,4) + // 34: 75 68 jne 0x9e <__JIT_ENTRY+0x9e> + // 36: 8b 6b 0c movl 0xc(%ebx), %ebp + // 39: 89 2c 24 movl %ebp, (%esp) + // 3c: 8b 6d 00 movl (%ebp), %ebp + // 3f: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 45: 7f 17 jg 0x5e <__JIT_ENTRY+0x5e> + // 47: 45 incl %ebp + // 48: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 4c: 8b 2c 24 movl (%esp), %ebp + // 4f: 89 7c 24 04 movl %edi, 0x4(%esp) + // 53: 8b 7c 24 08 movl 0x8(%esp), %edi + // 57: 89 7d 00 movl %edi, (%ebp) + // 5a: 8b 7c 24 04 movl 0x4(%esp), %edi + // 5e: 8b 2c 24 movl (%esp), %ebp + // 61: 89 2c 90 movl %ebp, (%eax,%edx,4) + // 64: 8b 5b 08 movl 0x8(%ebx), %ebx + // 67: 8b 14 88 movl (%eax,%ecx,4), %edx + // 6a: 8b 2b movl (%ebx), %ebp + // 6c: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 72: 7f 03 jg 0x77 <__JIT_ENTRY+0x77> + // 74: 45 incl %ebp + // 75: 89 2b movl %ebp, (%ebx) + // 77: 89 1c 88 movl %ebx, (%eax,%ecx,4) + // 7a: 89 46 20 movl %eax, 0x20(%esi) + // 7d: 8b 02 movl (%edx), %eax + // 7f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 84: 7f 0e jg 0x94 <__JIT_ENTRY+0x94> + // 86: 48 decl %eax + // 87: 89 02 movl %eax, (%edx) + // 89: 75 09 jne 0x94 <__JIT_ENTRY+0x94> + // 8b: 52 pushl %edx + // 8c: e8 00 00 00 00 calll 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 91: 83 c4 04 addl $0x4, %esp + // 94: 8b 46 20 movl 0x20(%esi), %eax + // 97: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 9e: 89 7c 24 28 movl %edi, 0x28(%esp) + // a2: 89 44 24 24 movl %eax, 0x24(%esp) + // a6: 89 74 24 20 movl %esi, 0x20(%esp) + // aa: 83 c4 0c addl $0xc, %esp + // ad: 5e popl %esi + // ae: 5f popl %edi + // af: 5b popl %ebx + // b0: 5d popl %ebp + // b1: e9 00 00 00 00 jmp 0xb6 <__JIT_ENTRY+0xb6> + // 000000b2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[177] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x7c, 0x24, 0x28, 0x8b, 0x44, 0x24, 0x24, 0x8b, + 0x74, 0x24, 0x20, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xd1, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xd1, 0x8b, 0x1c, 0x88, 0x81, 0x7b, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x70, 0xf7, 0xd2, + 0x83, 0x3c, 0x90, 0x00, 0x75, 0x68, 0x8b, 0x6b, + 0x0c, 0x89, 0x2c, 0x24, 0x8b, 0x6d, 0x00, 0x81, + 0xfd, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x17, 0x45, + 0x89, 0x6c, 0x24, 0x08, 0x8b, 0x2c, 0x24, 0x89, + 0x7c, 0x24, 0x04, 0x8b, 0x7c, 0x24, 0x08, 0x89, + 0x7d, 0x00, 0x8b, 0x7c, 0x24, 0x04, 0x8b, 0x2c, + 0x24, 0x89, 0x2c, 0x90, 0x8b, 0x5b, 0x08, 0x8b, + 0x14, 0x88, 0x8b, 0x2b, 0x81, 0xfd, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x03, 0x45, 0x89, 0x2b, 0x89, + 0x1c, 0x88, 0x89, 0x46, 0x20, 0x8b, 0x02, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, + 0x02, 0x75, 0x09, 0x52, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x28, 0x89, 0x44, 0x24, 0x24, 0x89, 0x74, + 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x28, (uintptr_t)&PyMethod_Type); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__MAYBE_EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD_KW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 54 24 2c movl 0x2c(%esp), %edx + // b: 8b 44 24 28 movl 0x28(%esp), %eax + // f: 8b 74 24 24 movl 0x24(%esp), %esi + // 13: b9 00 00 00 00 movl $0x0, %ecx + // 00000014: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 18: 0f b7 f9 movzwl %cx, %edi + // 1b: 8b 58 fc movl -0x4(%eax), %ebx + // 1e: b9 fd ff ff ff movl $0xfffffffd, %ecx # imm = 0xFFFFFFFD + // 23: 29 f9 subl %edi, %ecx + // 25: 8b 2c 88 movl (%eax,%ecx,4), %ebp + // 28: 81 7d 04 00 00 00 00 cmpl $0x0, 0x4(%ebp) + // 0000002b: IMAGE_REL_I386_DIR32 _PyMethod_Type + // 2f: 0f 85 85 00 00 00 jne 0xba <__JIT_ENTRY+0xba> + // 35: 89 54 24 08 movl %edx, 0x8(%esp) + // 39: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 3e: 29 fa subl %edi, %edx + // 40: 83 3c 90 00 cmpl $0x0, (%eax,%edx,4) + // 44: 75 70 jne 0xb6 <__JIT_ENTRY+0xb6> + // 46: 8b 7d 0c movl 0xc(%ebp), %edi + // 49: 89 7c 24 04 movl %edi, 0x4(%esp) + // 4d: 8b 3f movl (%edi), %edi + // 4f: 89 2c 24 movl %ebp, (%esp) + // 52: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 58: 7f 1b jg 0x75 <__JIT_ENTRY+0x75> + // 5a: 47 incl %edi + // 5b: 89 3c 24 movl %edi, (%esp) + // 5e: 8b 7c 24 04 movl 0x4(%esp), %edi + // 62: 89 5c 24 0c movl %ebx, 0xc(%esp) + // 66: 8b 1c 24 movl (%esp), %ebx + // 69: 89 1f movl %ebx, (%edi) + // 6b: 8b 5c 24 0c movl 0xc(%esp), %ebx + // 6f: 8b 3c 88 movl (%eax,%ecx,4), %edi + // 72: 89 3c 24 movl %edi, (%esp) + // 75: 8b 7c 24 04 movl 0x4(%esp), %edi + // 79: 89 3c 90 movl %edi, (%eax,%edx,4) + // 7c: 8b 55 08 movl 0x8(%ebp), %edx + // 7f: 8b 3a movl (%edx), %edi + // 81: 81 ff ff ff ff 3f cmpl $0x3fffffff, %edi # imm = 0x3FFFFFFF + // 87: 7f 03 jg 0x8c <__JIT_ENTRY+0x8c> + // 89: 47 incl %edi + // 8a: 89 3a movl %edi, (%edx) + // 8c: 89 14 88 movl %edx, (%eax,%ecx,4) + // 8f: 89 46 20 movl %eax, 0x20(%esi) + // 92: 8b 0c 24 movl (%esp), %ecx + // 95: 8b 01 movl (%ecx), %eax + // 97: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 9c: 7f 0e jg 0xac <__JIT_ENTRY+0xac> + // 9e: 48 decl %eax + // 9f: 89 01 movl %eax, (%ecx) + // a1: 75 09 jne 0xac <__JIT_ENTRY+0xac> + // a3: 51 pushl %ecx + // a4: e8 00 00 00 00 calll 0xa9 <__JIT_ENTRY+0xa9> + // 000000a5: IMAGE_REL_I386_REL32 __Py_Dealloc + // a9: 83 c4 04 addl $0x4, %esp + // ac: 8b 46 20 movl 0x20(%esi), %eax + // af: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // b6: 8b 54 24 08 movl 0x8(%esp), %edx + // ba: 89 58 fc movl %ebx, -0x4(%eax) + // bd: 89 54 24 2c movl %edx, 0x2c(%esp) + // c1: 89 44 24 28 movl %eax, 0x28(%esp) + // c5: 89 74 24 24 movl %esi, 0x24(%esp) + // c9: 83 c4 10 addl $0x10, %esp + // cc: 5e popl %esi + // cd: 5f popl %edi + // ce: 5b popl %ebx + // cf: 5d popl %ebp + // d0: e9 00 00 00 00 jmp 0xd5 <__JIT_ENTRY+0xd5> + // 000000d1: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[208] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x54, 0x24, 0x2c, 0x8b, 0x44, 0x24, 0x28, 0x8b, + 0x74, 0x24, 0x24, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xf9, 0x8b, 0x58, 0xfc, 0xb9, 0xfd, + 0xff, 0xff, 0xff, 0x29, 0xf9, 0x8b, 0x2c, 0x88, + 0x81, 0x7d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x85, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x08, 0xba, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xfa, + 0x83, 0x3c, 0x90, 0x00, 0x75, 0x70, 0x8b, 0x7d, + 0x0c, 0x89, 0x7c, 0x24, 0x04, 0x8b, 0x3f, 0x89, + 0x2c, 0x24, 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x1b, 0x47, 0x89, 0x3c, 0x24, 0x8b, 0x7c, + 0x24, 0x04, 0x89, 0x5c, 0x24, 0x0c, 0x8b, 0x1c, + 0x24, 0x89, 0x1f, 0x8b, 0x5c, 0x24, 0x0c, 0x8b, + 0x3c, 0x88, 0x89, 0x3c, 0x24, 0x8b, 0x7c, 0x24, + 0x04, 0x89, 0x3c, 0x90, 0x8b, 0x55, 0x08, 0x8b, + 0x3a, 0x81, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x03, 0x47, 0x89, 0x3a, 0x89, 0x14, 0x88, 0x89, + 0x46, 0x20, 0x8b, 0x0c, 0x24, 0x8b, 0x01, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, + 0x01, 0x75, 0x09, 0x51, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, + 0x24, 0x08, 0x89, 0x58, 0xfc, 0x89, 0x54, 0x24, + 0x2c, 0x89, 0x44, 0x24, 0x28, 0x89, 0x74, 0x24, + 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x14, instruction->oparg); + patch_32(code + 0x2b, (uintptr_t)&PyMethod_Type); + patch_x86_64_32rx(code + 0xa5, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__NOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _NOP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 54 24 04 movl 0x4(%esp), %edx + // c: 89 54 24 04 movl %edx, 0x4(%esp) + // 10: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 14: 89 44 24 0c movl %eax, 0xc(%esp) + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 00000019: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x54, 0x24, 0x04, 0x89, 0x54, 0x24, 0x04, + 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__POP_EXCEPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_EXCEPT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 44 24 14 movl 0x14(%esp), %eax + // f: 8b 48 fc movl -0x4(%eax), %ecx + // 12: 8b 57 4c movl 0x4c(%edi), %edx + // 15: 89 46 20 movl %eax, 0x20(%esi) + // 18: 8b 02 movl (%edx), %eax + // 1a: 31 db xorl %ebx, %ebx + // 1c: 81 f9 00 00 00 00 cmpl $0x0, %ecx + // 0000001e: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 22: 0f 45 d9 cmovnel %ecx, %ebx + // 25: 89 1a movl %ebx, (%edx) + // 27: 85 c0 testl %eax, %eax + // 29: 74 18 je 0x43 <__JIT_ENTRY+0x43> + // 2b: 8b 08 movl (%eax), %ecx + // 2d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 33: 7f 0e jg 0x43 <__JIT_ENTRY+0x43> + // 35: 49 decl %ecx + // 36: 89 08 movl %ecx, (%eax) + // 38: 75 09 jne 0x43 <__JIT_ENTRY+0x43> + // 3a: 50 pushl %eax + // 3b: e8 00 00 00 00 calll 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 40: 83 c4 04 addl $0x4, %esp + // 43: 8b 46 20 movl 0x20(%esi), %eax + // 46: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4d: 83 c0 fc addl $-0x4, %eax + // 50: 89 7c 24 18 movl %edi, 0x18(%esp) + // 54: 89 44 24 14 movl %eax, 0x14(%esp) + // 58: 89 74 24 10 movl %esi, 0x10(%esp) + // 5c: 5e popl %esi + // 5d: 5f popl %edi + // 5e: 5b popl %ebx + // 5f: e9 00 00 00 00 jmp 0x64 <__JIT_ENTRY+0x64> + // 00000060: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[95] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x44, 0x24, 0x14, 0x8b, + 0x48, 0xfc, 0x8b, 0x57, 0x4c, 0x89, 0x46, 0x20, + 0x8b, 0x02, 0x31, 0xdb, 0x81, 0xf9, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x45, 0xd9, 0x89, 0x1a, 0x85, + 0xc0, 0x74, 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, + 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc0, 0xfc, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, + 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1e, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__POP_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 5c 24 14 movl 0x14(%esp), %ebx + // f: 8b 43 fc movl -0x4(%ebx), %eax + // 12: 83 c3 fc addl $-0x4, %ebx + // 15: 8b 08 movl (%eax), %ecx + // 17: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1d: 7f 0e jg 0x2d <__JIT_ENTRY+0x2d> + // 1f: 49 decl %ecx + // 20: 89 08 movl %ecx, (%eax) + // 22: 75 09 jne 0x2d <__JIT_ENTRY+0x2d> + // 24: 50 pushl %eax + // 25: e8 00 00 00 00 calll 0x2a <__JIT_ENTRY+0x2a> + // 00000026: IMAGE_REL_I386_REL32 __Py_Dealloc + // 2a: 83 c4 04 addl $0x4, %esp + // 2d: 89 7c 24 18 movl %edi, 0x18(%esp) + // 31: 89 5c 24 14 movl %ebx, 0x14(%esp) + // 35: 89 74 24 10 movl %esi, 0x10(%esp) + // 39: 5e popl %esi + // 3a: 5f popl %edi + // 3b: 5b popl %ebx + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 0000003d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[60] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x5c, 0x24, 0x14, 0x8b, + 0x43, 0xfc, 0x83, 0xc3, 0xfc, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, + 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x5c, 0x24, 0x14, 0x89, 0x74, 0x24, + 0x10, 0x5e, 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x26, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__POP_TOP_LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP_LOAD_CONST_INLINE_BORROW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 41 fc movl -0x4(%ecx), %eax + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 89 4e 20 movl %ecx, 0x20(%esi) + // 17: 8b 08 movl (%eax), %ecx + // 19: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1f: 7f 0e jg 0x2f <__JIT_ENTRY+0x2f> + // 21: 49 decl %ecx + // 22: 89 08 movl %ecx, (%eax) + // 24: 75 09 jne 0x2f <__JIT_ENTRY+0x2f> + // 26: 50 pushl %eax + // 27: e8 00 00 00 00 calll 0x2c <__JIT_ENTRY+0x2c> + // 00000028: IMAGE_REL_I386_REL32 __Py_Dealloc + // 2c: 83 c4 04 addl $0x4, %esp + // 2f: 8b 46 20 movl 0x20(%esi), %eax + // 32: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 39: c7 00 00 00 00 00 movl $0x0, (%eax) + // 0000003b: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 3f: 83 c0 04 addl $0x4, %eax + // 42: 89 7c 24 14 movl %edi, 0x14(%esp) + // 46: 89 44 24 10 movl %eax, 0x10(%esp) + // 4a: 89 74 24 0c movl %esi, 0xc(%esp) + // 4e: 5e popl %esi + // 4f: 5f popl %edi + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 00000051: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[80] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x41, + 0xfc, 0x83, 0xc1, 0xfc, 0x89, 0x4e, 0x20, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc0, 0x04, 0x89, 0x7c, 0x24, 0x14, 0x89, 0x44, + 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x28, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x3b, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__PUSH_EXC_INFO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_EXC_INFO.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 4c 24 1c movl 0x1c(%esp), %ecx + // 8: 8b 54 24 18 movl 0x18(%esp), %edx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 72 fc movl -0x4(%edx), %esi + // 13: 8b 79 4c movl 0x4c(%ecx), %edi + // 16: 8b 1f movl (%edi), %ebx + // 18: 8b 2e movl (%esi), %ebp + // 1a: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 20: 7f 03 jg 0x25 <__JIT_ENTRY+0x25> + // 22: 45 incl %ebp + // 23: 89 2e movl %ebp, (%esi) + // 25: 85 db testl %ebx, %ebx + // 27: bd 00 00 00 00 movl $0x0, %ebp + // 00000028: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 2c: 0f 45 eb cmovnel %ebx, %ebp + // 2f: 89 37 movl %esi, (%edi) + // 31: 89 6a fc movl %ebp, -0x4(%edx) + // 34: 89 32 movl %esi, (%edx) + // 36: 83 c2 04 addl $0x4, %edx + // 39: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 3d: 89 54 24 18 movl %edx, 0x18(%esp) + // 41: 89 44 24 14 movl %eax, 0x14(%esp) + // 45: 5e popl %esi + // 46: 5f popl %edi + // 47: 5b popl %ebx + // 48: 5d popl %ebp + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 0000004a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[73] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x4c, 0x24, 0x1c, + 0x8b, 0x54, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x72, 0xfc, 0x8b, 0x79, 0x4c, 0x8b, 0x1f, + 0x8b, 0x2e, 0x81, 0xfd, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x03, 0x45, 0x89, 0x2e, 0x85, 0xdb, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x45, 0xeb, 0x89, + 0x37, 0x89, 0x6a, 0xfc, 0x89, 0x32, 0x83, 0xc2, + 0x04, 0x89, 0x4c, 0x24, 0x1c, 0x89, 0x54, 0x24, + 0x18, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x28, (uintptr_t)&_Py_NoneStruct); +} + +void +emit__PUSH_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_FRAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 44 24 10 movl 0x10(%esp), %eax + // 5: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 9: 8b 54 24 0c movl 0xc(%esp), %edx + // d: 8b 72 fc movl -0x4(%edx), %esi + // 10: 83 c2 fc addl $-0x4, %edx + // 13: 89 51 20 movl %edx, 0x20(%ecx) + // 16: 89 70 34 movl %esi, 0x34(%eax) + // 19: ff 48 1c decl 0x1c(%eax) + // 1c: 8b 4e 20 movl 0x20(%esi), %ecx + // 1f: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 26: 89 74 24 08 movl %esi, 0x8(%esp) + // 2a: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2e: 89 44 24 10 movl %eax, 0x10(%esp) + // 32: 5e popl %esi + // 33: e9 00 00 00 00 jmp 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[51] = { + 0x56, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x08, 0x8b, 0x54, 0x24, 0x0c, 0x8b, 0x72, 0xfc, + 0x83, 0xc2, 0xfc, 0x89, 0x51, 0x20, 0x89, 0x70, + 0x34, 0xff, 0x48, 0x1c, 0x8b, 0x4e, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x74, + 0x24, 0x08, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, + 0x24, 0x10, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 8: 8b 54 24 08 movl 0x8(%esp), %edx + // c: c7 02 00 00 00 00 movl $0x0, (%edx) + // 12: 83 c2 04 addl $0x4, %edx + // 15: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 19: 89 54 24 08 movl %edx, 0x8(%esp) + // 1d: 89 44 24 0c movl %eax, 0xc(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x04, + 0x8b, 0x54, 0x24, 0x08, 0xc7, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc2, 0x04, 0x89, 0x4c, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL_CONDITIONAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL_CONDITIONAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 44 24 10 movl 0x10(%esp), %eax + // 5: 8b 54 24 0c movl 0xc(%esp), %edx + // 9: 8b 4c 24 08 movl 0x8(%esp), %ecx + // d: be 00 00 00 00 movl $0x0, %esi + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 12: 66 83 e6 01 andw $0x1, %si + // 16: 74 06 je 0x1e <__JIT_ENTRY+0x1e> + // 18: c7 02 00 00 00 00 movl $0x0, (%edx) + // 1e: 0f b7 f6 movzwl %si, %esi + // 21: 8d 14 b2 leal (%edx,%esi,4), %edx + // 24: 89 44 24 10 movl %eax, 0x10(%esp) + // 28: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 2c: 89 54 24 0c movl %edx, 0xc(%esp) + // 30: 5e popl %esi + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[49] = { + 0x56, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x54, 0x24, + 0x0c, 0x8b, 0x4c, 0x24, 0x08, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x83, 0xe6, 0x01, 0x74, 0x06, + 0xc7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xf6, 0x8d, 0x14, 0xb2, 0x89, 0x44, 0x24, 0x10, + 0x89, 0x4c, 0x24, 0x08, 0x89, 0x54, 0x24, 0x0c, + 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, instruction->oparg); +} + +void +emit__PY_FRAME_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_GENERAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 1c movl 0x1c(%esp), %eax + // 9: b9 00 00 00 00 movl $0x0, %ecx + // 0000000a: IMAGE_REL_I386_DIR32 __JIT_OPARG + // e: 0f b7 f9 movzwl %cx, %edi + // 11: 8d 0c bd 00 00 00 00 leal (,%edi,4), %ecx + // 18: 89 c6 movl %eax, %esi + // 1a: 29 ce subl %ecx, %esi + // 1c: 89 fd movl %edi, %ebp + // 1e: f7 d5 notl %ebp + // 20: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 25: 29 f9 subl %edi, %ecx + // 27: 31 db xorl %ebx, %ebx + // 29: 31 d2 xorl %edx, %edx + // 2b: 83 3c a8 00 cmpl $0x0, (%eax,%ebp,4) + // 2f: 8b 2c 88 movl (%eax,%ecx,4), %ebp + // 32: 0f 94 c3 sete %bl + // 35: 0f 95 c2 setne %dl + // 38: 01 fa addl %edi, %edx + // 3a: 8d 34 9e leal (%esi,%ebx,4), %esi + // 3d: 83 c6 fc addl $-0x4, %esi + // 40: 89 eb movl %ebp, %ebx + // 42: 89 34 24 movl %esi, (%esp) + // 45: 8b 75 18 movl 0x18(%ebp), %esi + // 48: 31 ed xorl %ebp, %ebp + // 4a: f6 46 18 01 testb $0x1, 0x18(%esi) + // 4e: 8b 7c 24 20 movl 0x20(%esp), %edi + // 52: 8b 74 24 18 movl 0x18(%esp), %esi + // 56: 75 12 jne 0x6a <__JIT_ENTRY+0x6a> + // 58: 8b 6b 08 movl 0x8(%ebx), %ebp + // 5b: 8b 5d 00 movl (%ebp), %ebx + // 5e: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 64: 7f 04 jg 0x6a <__JIT_ENTRY+0x6a> + // 66: 43 incl %ebx + // 67: 89 5d 00 movl %ebx, (%ebp) + // 6a: 89 46 20 movl %eax, 0x20(%esi) + // 6d: 8d 1c 8d 00 00 00 00 leal (,%ecx,4), %ebx + // 74: 56 pushl %esi + // 75: 6a 00 pushl $0x0 + // 77: 52 pushl %edx + // 78: ff 74 24 0c pushl 0xc(%esp) + // 7c: 55 pushl %ebp + // 7d: ff 34 88 pushl (%eax,%ecx,4) + // 80: 57 pushl %edi + // 81: e8 00 00 00 00 calll 0x86 <__JIT_ENTRY+0x86> + // 00000082: IMAGE_REL_I386_REL32 __PyEvalFramePushAndInit + // 86: 83 c4 1c addl $0x1c, %esp + // 89: 03 5e 20 addl 0x20(%esi), %ebx + // 8c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 93: 85 c0 testl %eax, %eax + // 95: 74 1d je 0xb4 <__JIT_ENTRY+0xb4> + // 97: 89 03 movl %eax, (%ebx) + // 99: 83 c3 04 addl $0x4, %ebx + // 9c: 89 7c 24 20 movl %edi, 0x20(%esp) + // a0: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // a4: 89 74 24 18 movl %esi, 0x18(%esp) + // a8: 83 c4 04 addl $0x4, %esp + // ab: 5e popl %esi + // ac: 5f popl %edi + // ad: 5b popl %ebx + // ae: 5d popl %ebp + // af: e9 00 00 00 00 jmp 0xb4 <__JIT_ENTRY+0xb4> + // 000000b0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // b4: 89 7c 24 20 movl %edi, 0x20(%esp) + // b8: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // bc: 89 74 24 18 movl %esi, 0x18(%esp) + // c0: 83 c4 04 addl $0x4, %esp + // c3: 5e popl %esi + // c4: 5f popl %edi + // c5: 5b popl %ebx + // c6: 5d popl %ebp + // c7: e9 00 00 00 00 jmp 0xcc <__JIT_ENTRY+0xcc> + // 000000c8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[204] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xf9, 0x8d, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc6, 0x29, 0xce, 0x89, 0xfd, 0xf7, 0xd5, + 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xf9, 0x31, + 0xdb, 0x31, 0xd2, 0x83, 0x3c, 0xa8, 0x00, 0x8b, + 0x2c, 0x88, 0x0f, 0x94, 0xc3, 0x0f, 0x95, 0xc2, + 0x01, 0xfa, 0x8d, 0x34, 0x9e, 0x83, 0xc6, 0xfc, + 0x89, 0xeb, 0x89, 0x34, 0x24, 0x8b, 0x75, 0x18, + 0x31, 0xed, 0xf6, 0x46, 0x18, 0x01, 0x8b, 0x7c, + 0x24, 0x20, 0x8b, 0x74, 0x24, 0x18, 0x75, 0x12, + 0x8b, 0x6b, 0x08, 0x8b, 0x5d, 0x00, 0x81, 0xfb, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x04, 0x43, 0x89, + 0x5d, 0x00, 0x89, 0x46, 0x20, 0x8d, 0x1c, 0x8d, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x6a, 0x00, 0x52, + 0xff, 0x74, 0x24, 0x0c, 0x55, 0xff, 0x34, 0x88, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x1c, 0x03, 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x1d, 0x89, + 0x03, 0x83, 0xc3, 0x04, 0x89, 0x7c, 0x24, 0x20, + 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x74, 0x24, 0x18, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x20, + 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x74, 0x24, 0x18, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xa, instruction->oparg); + patch_x86_64_32rx(code + 0x82, (uintptr_t)&_PyEvalFramePushAndInit + -0x4); + patch_x86_64_32rx(code + 0xb0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__PY_FRAME_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_KW.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: b9 00 00 00 00 movl $0x0, %ecx + // 0000000c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 10: 0f b7 c9 movzwl %cx, %ecx + // 13: 89 ca movl %ecx, %edx + // 15: f7 d2 notl %edx + // 17: 8d 3c 90 leal (%eax,%edx,4), %edi + // 1a: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 1f: 29 ce subl %ecx, %esi + // 21: bd fd ff ff ff movl $0xfffffffd, %ebp # imm = 0xFFFFFFFD + // 26: 29 cd subl %ecx, %ebp + // 28: 31 db xorl %ebx, %ebx + // 2a: 31 d2 xorl %edx, %edx + // 2c: 83 3c b0 00 cmpl $0x0, (%eax,%esi,4) + // 30: 0f 94 c2 sete %dl + // 33: 8d 54 97 fc leal -0x4(%edi,%edx,4), %edx + // 37: 89 14 24 movl %edx, (%esp) + // 3a: 8b 50 fc movl -0x4(%eax), %edx + // 3d: 0f 95 c3 setne %bl + // 40: 89 54 24 08 movl %edx, 0x8(%esp) + // 44: 2b 4a 08 subl 0x8(%edx), %ecx + // 47: 01 d9 addl %ebx, %ecx + // 49: 89 6c 24 04 movl %ebp, 0x4(%esp) + // 4d: 8b 2c a8 movl (%eax,%ebp,4), %ebp + // 50: 8b 55 18 movl 0x18(%ebp), %edx + // 53: 31 db xorl %ebx, %ebx + // 55: f6 42 18 01 testb $0x1, 0x18(%edx) + // 59: 8b 54 24 28 movl 0x28(%esp), %edx + // 5d: 8b 7c 24 20 movl 0x20(%esp), %edi + // 61: 75 10 jne 0x73 <__JIT_ENTRY+0x73> + // 63: 8b 5d 08 movl 0x8(%ebp), %ebx + // 66: 8b 2b movl (%ebx), %ebp + // 68: 81 fd ff ff ff 3f cmpl $0x3fffffff, %ebp # imm = 0x3FFFFFFF + // 6e: 7f 03 jg 0x73 <__JIT_ENTRY+0x73> + // 70: 45 incl %ebp + // 71: 89 2b movl %ebp, (%ebx) + // 73: 89 47 20 movl %eax, 0x20(%edi) + // 76: 57 pushl %edi + // 77: 8b 6c 24 0c movl 0xc(%esp), %ebp + // 7b: 55 pushl %ebp + // 7c: 51 pushl %ecx + // 7d: ff 74 24 0c pushl 0xc(%esp) + // 81: 53 pushl %ebx + // 82: 8b 4c 24 18 movl 0x18(%esp), %ecx + // 86: ff 34 88 pushl (%eax,%ecx,4) + // 89: 89 d3 movl %edx, %ebx + // 8b: 52 pushl %edx + // 8c: e8 00 00 00 00 calll 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __PyEvalFramePushAndInit + // 91: 83 c4 1c addl $0x1c, %esp + // 94: 83 47 20 fc addl $-0x4, 0x20(%edi) + // 98: 8b 4d 00 movl (%ebp), %ecx + // 9b: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a1: 7f 13 jg 0xb6 <__JIT_ENTRY+0xb6> + // a3: 49 decl %ecx + // a4: 89 4d 00 movl %ecx, (%ebp) + // a7: 75 0d jne 0xb6 <__JIT_ENTRY+0xb6> + // a9: 55 pushl %ebp + // aa: 89 c5 movl %eax, %ebp + // ac: e8 00 00 00 00 calll 0xb1 <__JIT_ENTRY+0xb1> + // 000000ad: IMAGE_REL_I386_REL32 __Py_Dealloc + // b1: 89 e8 movl %ebp, %eax + // b3: 83 c4 04 addl $0x4, %esp + // b6: c1 e6 02 shll $0x2, %esi + // b9: 03 77 20 addl 0x20(%edi), %esi + // bc: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // c3: 85 c0 testl %eax, %eax + // c5: 74 1d je 0xe4 <__JIT_ENTRY+0xe4> + // c7: 89 06 movl %eax, (%esi) + // c9: 83 c6 04 addl $0x4, %esi + // cc: 89 5c 24 28 movl %ebx, 0x28(%esp) + // d0: 89 74 24 24 movl %esi, 0x24(%esp) + // d4: 89 7c 24 20 movl %edi, 0x20(%esp) + // d8: 83 c4 0c addl $0xc, %esp + // db: 5e popl %esi + // dc: 5f popl %edi + // dd: 5b popl %ebx + // de: 5d popl %ebp + // df: e9 00 00 00 00 jmp 0xe4 <__JIT_ENTRY+0xe4> + // 000000e0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // e4: 89 5c 24 28 movl %ebx, 0x28(%esp) + // e8: 89 74 24 24 movl %esi, 0x24(%esp) + // ec: 89 7c 24 20 movl %edi, 0x20(%esp) + // f0: 83 c4 0c addl $0xc, %esp + // f3: 5e popl %esi + // f4: 5f popl %edi + // f5: 5b popl %ebx + // f6: 5d popl %ebp + // f7: e9 00 00 00 00 jmp 0xfc <__JIT_ENTRY+0xfc> + // 000000f8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[252] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x44, 0x24, 0x24, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc9, 0x89, 0xca, 0xf7, 0xd2, 0x8d, + 0x3c, 0x90, 0xbe, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xce, 0xbd, 0xfd, 0xff, 0xff, 0xff, 0x29, 0xcd, + 0x31, 0xdb, 0x31, 0xd2, 0x83, 0x3c, 0xb0, 0x00, + 0x0f, 0x94, 0xc2, 0x8d, 0x54, 0x97, 0xfc, 0x89, + 0x14, 0x24, 0x8b, 0x50, 0xfc, 0x0f, 0x95, 0xc3, + 0x89, 0x54, 0x24, 0x08, 0x2b, 0x4a, 0x08, 0x01, + 0xd9, 0x89, 0x6c, 0x24, 0x04, 0x8b, 0x2c, 0xa8, + 0x8b, 0x55, 0x18, 0x31, 0xdb, 0xf6, 0x42, 0x18, + 0x01, 0x8b, 0x54, 0x24, 0x28, 0x8b, 0x7c, 0x24, + 0x20, 0x75, 0x10, 0x8b, 0x5d, 0x08, 0x8b, 0x2b, + 0x81, 0xfd, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x03, + 0x45, 0x89, 0x2b, 0x89, 0x47, 0x20, 0x57, 0x8b, + 0x6c, 0x24, 0x0c, 0x55, 0x51, 0xff, 0x74, 0x24, + 0x0c, 0x53, 0x8b, 0x4c, 0x24, 0x18, 0xff, 0x34, + 0x88, 0x89, 0xd3, 0x52, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x1c, 0x83, 0x47, 0x20, 0xfc, + 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x13, 0x49, 0x89, 0x4d, 0x00, 0x75, + 0x0d, 0x55, 0x89, 0xc5, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xe8, 0x83, 0xc4, 0x04, 0xc1, 0xe6, + 0x02, 0x03, 0x77, 0x20, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x1d, 0x89, + 0x06, 0x83, 0xc6, 0x04, 0x89, 0x5c, 0x24, 0x28, + 0x89, 0x74, 0x24, 0x24, 0x89, 0x7c, 0x24, 0x20, + 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x5c, 0x24, 0x28, + 0x89, 0x74, 0x24, 0x24, 0x89, 0x7c, 0x24, 0x20, + 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xc, instruction->oparg); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)&_PyEvalFramePushAndInit + -0x4); + patch_x86_64_32rx(code + 0xad, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xe0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xf8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__REPLACE_WITH_TRUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _REPLACE_WITH_TRUE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 5c 24 18 movl 0x18(%esp), %ebx + // 7: 8b 7c 24 14 movl 0x14(%esp), %edi + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 47 fc movl -0x4(%edi), %eax + // 12: 8b 08 movl (%eax), %ecx + // 14: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 1a: 7f 0e jg 0x2a <__JIT_ENTRY+0x2a> + // 1c: 49 decl %ecx + // 1d: 89 08 movl %ecx, (%eax) + // 1f: 75 09 jne 0x2a <__JIT_ENTRY+0x2a> + // 21: 50 pushl %eax + // 22: e8 00 00 00 00 calll 0x27 <__JIT_ENTRY+0x27> + // 00000023: IMAGE_REL_I386_REL32 __Py_Dealloc + // 27: 83 c4 04 addl $0x4, %esp + // 2a: c7 47 fc 00 00 00 00 movl $0x0, -0x4(%edi) + // 0000002d: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 31: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 35: 89 7c 24 14 movl %edi, 0x14(%esp) + // 39: 89 74 24 10 movl %esi, 0x10(%esp) + // 3d: 5e popl %esi + // 3e: 5f popl %edi + // 3f: 5b popl %ebx + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 00000041: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[64] = { + 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x18, 0x8b, + 0x7c, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x47, 0xfc, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, + 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0xc7, 0x47, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x5c, 0x24, 0x18, 0x89, 0x7c, 0x24, + 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x2d, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RESUME_CHECK.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 54 24 14 movl 0x14(%esp), %edx + // 6: 8b 4c 24 10 movl 0x10(%esp), %ecx + // a: 8b 44 24 0c movl 0xc(%esp), %eax + // e: 8b 72 0c movl 0xc(%edx), %esi + // 11: 8b 38 movl (%eax), %edi + // 13: 3b 77 6c cmpl 0x6c(%edi), %esi + // 16: 75 13 jne 0x2b <__JIT_ENTRY+0x2b> + // 18: 89 54 24 14 movl %edx, 0x14(%esp) + // 1c: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 20: 89 44 24 0c movl %eax, 0xc(%esp) + // 24: 5e popl %esi + // 25: 5f popl %edi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 2b: 89 54 24 14 movl %edx, 0x14(%esp) + // 2f: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 33: 89 44 24 0c movl %eax, 0xc(%esp) + // 37: 5e popl %esi + // 38: 5f popl %edi + // 39: e9 00 00 00 00 jmp 0x3e <__JIT_ENTRY+0x3e> + // 0000003a: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[62] = { + 0x57, 0x56, 0x8b, 0x54, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x10, 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x72, + 0x0c, 0x8b, 0x38, 0x3b, 0x77, 0x6c, 0x75, 0x13, + 0x89, 0x54, 0x24, 0x14, 0x89, 0x4c, 0x24, 0x10, + 0x89, 0x44, 0x24, 0x0c, 0x5e, 0x5f, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x14, 0x89, + 0x4c, 0x24, 0x10, 0x89, 0x44, 0x24, 0x0c, 0x5e, + 0x5f, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x27, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__RETURN_GENERATOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_GENERATOR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 74 24 28 movl 0x28(%esp), %esi + // b: 8b 7c 24 20 movl 0x20(%esp), %edi + // f: 8b 44 24 24 movl 0x24(%esp), %eax + // 13: 8b 4f 08 movl 0x8(%edi), %ecx + // 16: 89 47 20 movl %eax, 0x20(%edi) + // 19: 51 pushl %ecx + // 1a: e8 00 00 00 00 calll 0x1f <__JIT_ENTRY+0x1f> + // 0000001b: IMAGE_REL_I386_REL32 __Py_MakeCoro + // 1f: 83 c4 04 addl $0x4, %esp + // 22: 8b 4f 20 movl 0x20(%edi), %ecx + // 25: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 2c: 85 c0 testl %eax, %eax + // 2e: 0f 84 42 01 00 00 je 0x176 <__JIT_ENTRY+0x176> + // 34: 89 74 24 08 movl %esi, 0x8(%esp) + // 38: 89 4f 20 movl %ecx, 0x20(%edi) + // 3b: 83 47 1c 02 addl $0x2, 0x1c(%edi) + // 3f: 0f 10 07 movups (%edi), %xmm0 + // 42: 0f 11 40 24 movups %xmm0, 0x24(%eax) + // 46: 0f 10 47 1c movups 0x1c(%edi), %xmm0 + // 4a: 0f 11 40 40 movups %xmm0, 0x40(%eax) + // 4e: 0f 10 47 10 movups 0x10(%edi), %xmm0 + // 52: 0f 11 40 34 movups %xmm0, 0x34(%eax) + // 56: 8b 5f 20 movl 0x20(%edi), %ebx + // 59: 8d 57 28 leal 0x28(%edi), %edx + // 5c: 29 d3 subl %edx, %ebx + // 5e: 8d 0c 18 leal (%eax,%ebx), %ecx + // 61: 83 c1 4c addl $0x4c, %ecx + // 64: c1 fb 02 sarl $0x2, %ebx + // 67: 89 48 44 movl %ecx, 0x44(%eax) + // 6a: 83 fb 02 cmpl $0x2, %ebx + // 6d: 0f 8c b4 00 00 00 jl 0x127 <__JIT_ENTRY+0x127> + // 73: bd 01 00 00 00 movl $0x1, %ebp + // 78: 83 fb 09 cmpl $0x9, %ebx + // 7b: 72 45 jb 0xc2 <__JIT_ENTRY+0xc2> + // 7d: 89 c1 movl %eax, %ecx + // 7f: 29 f9 subl %edi, %ecx + // 81: 83 c1 24 addl $0x24, %ecx + // 84: 83 f9 20 cmpl $0x20, %ecx + // 87: 72 39 jb 0xc2 <__JIT_ENTRY+0xc2> + // 89: 8d 4b ff leal -0x1(%ebx), %ecx + // 8c: 89 cd movl %ecx, %ebp + // 8e: 83 e5 f8 andl $-0x8, %ebp + // 91: 8d 75 01 leal 0x1(%ebp), %esi + // 94: 89 34 24 movl %esi, (%esp) + // 97: 31 f6 xorl %esi, %esi + // 99: 0f 1f 80 00 00 00 00 nopl (%eax) + // a0: 0f 10 44 b7 2c movups 0x2c(%edi,%esi,4), %xmm0 + // a5: 0f 10 4c b7 3c movups 0x3c(%edi,%esi,4), %xmm1 + // aa: 0f 11 44 b0 50 movups %xmm0, 0x50(%eax,%esi,4) + // af: 0f 11 4c b0 60 movups %xmm1, 0x60(%eax,%esi,4) + // b4: 83 c6 08 addl $0x8, %esi + // b7: 39 f5 cmpl %esi, %ebp + // b9: 75 e5 jne 0xa0 <__JIT_ENTRY+0xa0> + // bb: 39 e9 cmpl %ebp, %ecx + // bd: 8b 2c 24 movl (%esp), %ebp + // c0: 74 65 je 0x127 <__JIT_ENTRY+0x127> + // c2: 89 5c 24 04 movl %ebx, 0x4(%esp) + // c6: 89 d9 movl %ebx, %ecx + // c8: 29 e9 subl %ebp, %ecx + // ca: 89 2c 24 movl %ebp, (%esp) + // cd: 83 e1 03 andl $0x3, %ecx + // d0: 74 1c je 0xee <__JIT_ENTRY+0xee> + // d2: 89 c6 movl %eax, %esi + // d4: 83 c6 4c addl $0x4c, %esi + // d7: 8b 2c 24 movl (%esp), %ebp + // da: 66 0f 1f 44 00 00 nopw (%eax,%eax) + // e0: 89 d3 movl %edx, %ebx + // e2: 8b 14 aa movl (%edx,%ebp,4), %edx + // e5: 89 14 ae movl %edx, (%esi,%ebp,4) + // e8: 89 da movl %ebx, %edx + // ea: 45 incl %ebp + // eb: 49 decl %ecx + // ec: 75 f2 jne 0xe0 <__JIT_ENTRY+0xe0> + // ee: 8b 54 24 04 movl 0x4(%esp), %edx + // f2: 8b 0c 24 movl (%esp), %ecx + // f5: 29 d1 subl %edx, %ecx + // f7: 83 f9 fc cmpl $-0x4, %ecx + // fa: 77 2b ja 0x127 <__JIT_ENTRY+0x127> + // fc: 0f 1f 40 00 nopl (%eax) + // 100: 8b 4c af 28 movl 0x28(%edi,%ebp,4), %ecx + // 104: 89 4c a8 4c movl %ecx, 0x4c(%eax,%ebp,4) + // 108: 8b 4c af 2c movl 0x2c(%edi,%ebp,4), %ecx + // 10c: 89 4c a8 50 movl %ecx, 0x50(%eax,%ebp,4) + // 110: 8b 4c af 30 movl 0x30(%edi,%ebp,4), %ecx + // 114: 89 4c a8 54 movl %ecx, 0x54(%eax,%ebp,4) + // 118: 8b 4c af 34 movl 0x34(%edi,%ebp,4), %ecx + // 11c: 89 4c a8 58 movl %ecx, 0x58(%eax,%ebp,4) + // 120: 83 c5 04 addl $0x4, %ebp + // 123: 39 ea cmpl %ebp, %edx + // 125: 75 d9 jne 0x100 <__JIT_ENTRY+0x100> + // 127: c7 40 28 00 00 00 00 movl $0x0, 0x28(%eax) + // 12e: c6 40 23 fd movb $-0x3, 0x23(%eax) + // 132: c6 40 4a 01 movb $0x1, 0x4a(%eax) + // 136: 8b 5c 24 08 movl 0x8(%esp), %ebx + // 13a: ff 43 1c incl 0x1c(%ebx) + // 13d: 8b 77 04 movl 0x4(%edi), %esi + // 140: 57 pushl %edi + // 141: 53 pushl %ebx + // 142: 89 c7 movl %eax, %edi + // 144: e8 00 00 00 00 calll 0x149 <__JIT_ENTRY+0x149> + // 00000145: IMAGE_REL_I386_REL32 __PyThreadState_PopFrame + // 149: 83 c4 08 addl $0x8, %esp + // 14c: 89 73 34 movl %esi, 0x34(%ebx) + // 14f: 8b 46 20 movl 0x20(%esi), %eax + // 152: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 159: 89 38 movl %edi, (%eax) + // 15b: 83 c0 04 addl $0x4, %eax + // 15e: 89 5c 24 28 movl %ebx, 0x28(%esp) + // 162: 89 44 24 24 movl %eax, 0x24(%esp) + // 166: 89 74 24 20 movl %esi, 0x20(%esp) + // 16a: 83 c4 0c addl $0xc, %esp + // 16d: 5e popl %esi + // 16e: 5f popl %edi + // 16f: 5b popl %ebx + // 170: 5d popl %ebp + // 171: e9 00 00 00 00 jmp 0x176 <__JIT_ENTRY+0x176> + // 00000172: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 176: 89 74 24 28 movl %esi, 0x28(%esp) + // 17a: 89 4c 24 24 movl %ecx, 0x24(%esp) + // 17e: 89 7c 24 20 movl %edi, 0x20(%esp) + // 182: 83 c4 0c addl $0xc, %esp + // 185: 5e popl %esi + // 186: 5f popl %edi + // 187: 5b popl %ebx + // 188: 5d popl %ebp + // 189: e9 00 00 00 00 jmp 0x18e <__JIT_ENTRY+0x18e> + // 0000018a: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[398] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x74, 0x24, 0x28, 0x8b, 0x7c, 0x24, 0x20, 0x8b, + 0x44, 0x24, 0x24, 0x8b, 0x4f, 0x08, 0x89, 0x47, + 0x20, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x4f, 0x20, 0xc7, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x84, + 0x42, 0x01, 0x00, 0x00, 0x89, 0x74, 0x24, 0x08, + 0x89, 0x4f, 0x20, 0x83, 0x47, 0x1c, 0x02, 0x0f, + 0x10, 0x07, 0x0f, 0x11, 0x40, 0x24, 0x0f, 0x10, + 0x47, 0x1c, 0x0f, 0x11, 0x40, 0x40, 0x0f, 0x10, + 0x47, 0x10, 0x0f, 0x11, 0x40, 0x34, 0x8b, 0x5f, + 0x20, 0x8d, 0x57, 0x28, 0x29, 0xd3, 0x8d, 0x0c, + 0x18, 0x83, 0xc1, 0x4c, 0xc1, 0xfb, 0x02, 0x89, + 0x48, 0x44, 0x83, 0xfb, 0x02, 0x0f, 0x8c, 0xb4, + 0x00, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, 0x00, + 0x83, 0xfb, 0x09, 0x72, 0x45, 0x89, 0xc1, 0x29, + 0xf9, 0x83, 0xc1, 0x24, 0x83, 0xf9, 0x20, 0x72, + 0x39, 0x8d, 0x4b, 0xff, 0x89, 0xcd, 0x83, 0xe5, + 0xf8, 0x8d, 0x75, 0x01, 0x89, 0x34, 0x24, 0x31, + 0xf6, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x10, 0x44, 0xb7, 0x2c, 0x0f, 0x10, 0x4c, + 0xb7, 0x3c, 0x0f, 0x11, 0x44, 0xb0, 0x50, 0x0f, + 0x11, 0x4c, 0xb0, 0x60, 0x83, 0xc6, 0x08, 0x39, + 0xf5, 0x75, 0xe5, 0x39, 0xe9, 0x8b, 0x2c, 0x24, + 0x74, 0x65, 0x89, 0x5c, 0x24, 0x04, 0x89, 0xd9, + 0x29, 0xe9, 0x89, 0x2c, 0x24, 0x83, 0xe1, 0x03, + 0x74, 0x1c, 0x89, 0xc6, 0x83, 0xc6, 0x4c, 0x8b, + 0x2c, 0x24, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x89, 0xd3, 0x8b, 0x14, 0xaa, 0x89, 0x14, 0xae, + 0x89, 0xda, 0x45, 0x49, 0x75, 0xf2, 0x8b, 0x54, + 0x24, 0x04, 0x8b, 0x0c, 0x24, 0x29, 0xd1, 0x83, + 0xf9, 0xfc, 0x77, 0x2b, 0x0f, 0x1f, 0x40, 0x00, + 0x8b, 0x4c, 0xaf, 0x28, 0x89, 0x4c, 0xa8, 0x4c, + 0x8b, 0x4c, 0xaf, 0x2c, 0x89, 0x4c, 0xa8, 0x50, + 0x8b, 0x4c, 0xaf, 0x30, 0x89, 0x4c, 0xa8, 0x54, + 0x8b, 0x4c, 0xaf, 0x34, 0x89, 0x4c, 0xa8, 0x58, + 0x83, 0xc5, 0x04, 0x39, 0xea, 0x75, 0xd9, 0xc7, + 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x40, + 0x23, 0xfd, 0xc6, 0x40, 0x4a, 0x01, 0x8b, 0x5c, + 0x24, 0x08, 0xff, 0x43, 0x1c, 0x8b, 0x77, 0x04, + 0x57, 0x53, 0x89, 0xc7, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x08, 0x89, 0x73, 0x34, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x38, 0x83, 0xc0, 0x04, 0x89, 0x5c, + 0x24, 0x28, 0x89, 0x44, 0x24, 0x24, 0x89, 0x74, + 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x74, + 0x24, 0x28, 0x89, 0x4c, 0x24, 0x24, 0x89, 0x7c, + 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)&_Py_MakeCoro + -0x4); + patch_x86_64_32rx(code + 0x145, (uintptr_t)&_PyThreadState_PopFrame + -0x4); + patch_x86_64_32rx(code + 0x172, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x18a, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__RETURN_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_VALUE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 74 24 18 movl 0x18(%esp), %esi + // 7: 8b 44 24 10 movl 0x10(%esp), %eax + // b: 8b 4c 24 14 movl 0x14(%esp), %ecx + // f: 8b 79 fc movl -0x4(%ecx), %edi + // 12: 83 c1 fc addl $-0x4, %ecx + // 15: 89 48 20 movl %ecx, 0x20(%eax) + // 18: ff 46 1c incl 0x1c(%esi) + // 1b: 8b 58 04 movl 0x4(%eax), %ebx + // 1e: 89 5e 34 movl %ebx, 0x34(%esi) + // 21: 50 pushl %eax + // 22: 56 pushl %esi + // 23: e8 00 00 00 00 calll 0x28 <__JIT_ENTRY+0x28> + // 00000024: IMAGE_REL_I386_REL32 __PyEval_FrameClearAndPop + // 28: 83 c4 08 addl $0x8, %esp + // 2b: 8b 43 20 movl 0x20(%ebx), %eax + // 2e: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // 35: 89 38 movl %edi, (%eax) + // 37: 83 c0 04 addl $0x4, %eax + // 3a: 89 5c 24 10 movl %ebx, 0x10(%esp) + // 3e: 89 44 24 14 movl %eax, 0x14(%esp) + // 42: 89 74 24 18 movl %esi, 0x18(%esp) + // 46: 5e popl %esi + // 47: 5f popl %edi + // 48: 5b popl %ebx + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 0000004a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[73] = { + 0x53, 0x57, 0x56, 0x8b, 0x74, 0x24, 0x18, 0x8b, + 0x44, 0x24, 0x10, 0x8b, 0x4c, 0x24, 0x14, 0x8b, + 0x79, 0xfc, 0x83, 0xc1, 0xfc, 0x89, 0x48, 0x20, + 0xff, 0x46, 0x1c, 0x8b, 0x58, 0x04, 0x89, 0x5e, + 0x34, 0x50, 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x43, 0x20, 0xc7, 0x43, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x38, 0x83, + 0xc0, 0x04, 0x89, 0x5c, 0x24, 0x10, 0x89, 0x44, + 0x24, 0x14, 0x89, 0x74, 0x24, 0x18, 0x5e, 0x5f, + 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x24, (uintptr_t)&_PyEval_FrameClearAndPop + -0x4); +} + +void +emit__SAVE_RETURN_OFFSET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SAVE_RETURN_OFFSET.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 44 24 10 movl 0x10(%esp), %eax + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 54 24 08 movl 0x8(%esp), %edx + // d: be 00 00 00 00 movl $0x0, %esi + // 0000000e: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 12: 66 89 72 24 movw %si, 0x24(%edx) + // 16: 89 54 24 08 movl %edx, 0x8(%esp) + // 1a: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 1e: 89 44 24 10 movl %eax, 0x10(%esp) + // 22: 5e popl %esi + // 23: e9 00 00 00 00 jmp 0x28 <__JIT_ENTRY+0x28> + // 00000024: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[35] = { + 0x56, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x54, 0x24, 0x08, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x89, 0x72, 0x24, 0x89, 0x54, + 0x24, 0x08, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, + 0x24, 0x10, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xe, instruction->oparg); +} + +void +emit__SEND_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SEND_GEN_FRAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 54 24 1c movl 0x1c(%esp), %edx + // 8: 8b 4c 24 18 movl 0x18(%esp), %ecx + // c: 8b 44 24 14 movl 0x14(%esp), %eax + // 10: 8b 71 f8 movl -0x8(%ecx), %esi + // 13: 8b 7e 04 movl 0x4(%esi), %edi + // 16: 81 ff 00 00 00 00 cmpl $0x0, %edi + // 00000018: IMAGE_REL_I386_DIR32 _PyGen_Type + // 1c: 0f 94 c3 sete %bl + // 1f: 81 ff 00 00 00 00 cmpl $0x0, %edi + // 00000021: IMAGE_REL_I386_DIR32 _PyCoro_Type + // 25: 0f 94 c7 sete %bh + // 28: 08 df orb %bl, %bh + // 2a: 74 06 je 0x32 <__JIT_ENTRY+0x32> + // 2c: 80 7e 23 00 cmpb $0x0, 0x23(%esi) + // 30: 78 15 js 0x47 <__JIT_ENTRY+0x47> + // 32: 89 54 24 1c movl %edx, 0x1c(%esp) + // 36: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 3a: 89 44 24 14 movl %eax, 0x14(%esp) + // 3e: 5e popl %esi + // 3f: 5f popl %edi + // 40: 5b popl %ebx + // 41: 5d popl %ebp + // 42: e9 00 00 00 00 jmp 0x47 <__JIT_ENTRY+0x47> + // 00000043: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 47: 8b 79 fc movl -0x4(%ecx), %edi + // 4a: 8d 5e 24 leal 0x24(%esi), %ebx + // 4d: 8b 6e 44 movl 0x44(%esi), %ebp + // 50: 89 7d 00 movl %edi, (%ebp) + // 53: 83 46 44 04 addl $0x4, 0x44(%esi) + // 57: c6 46 23 00 movb $0x0, 0x23(%esi) + // 5b: 8b 7a 4c movl 0x4c(%edx), %edi + // 5e: 8d 6e 14 leal 0x14(%esi), %ebp + // 61: 89 7e 18 movl %edi, 0x18(%esi) + // 64: 89 6a 4c movl %ebp, 0x4c(%edx) + // 67: 8d 3d 02 00 00 00 leal 0x2, %edi + // 00000069: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 6d: 66 89 78 24 movw %di, 0x24(%eax) + // 71: 89 46 28 movl %eax, 0x28(%esi) + // 74: 89 59 fc movl %ebx, -0x4(%ecx) + // 77: 89 54 24 1c movl %edx, 0x1c(%esp) + // 7b: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 7f: 89 44 24 14 movl %eax, 0x14(%esp) + // 83: 5e popl %esi + // 84: 5f popl %edi + // 85: 5b popl %ebx + // 86: 5d popl %ebp + // 87: e9 00 00 00 00 jmp 0x8c <__JIT_ENTRY+0x8c> + // 00000088: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[135] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x54, 0x24, 0x1c, + 0x8b, 0x4c, 0x24, 0x18, 0x8b, 0x44, 0x24, 0x14, + 0x8b, 0x71, 0xf8, 0x8b, 0x7e, 0x04, 0x81, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc3, 0x81, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc7, + 0x08, 0xdf, 0x74, 0x06, 0x80, 0x7e, 0x23, 0x00, + 0x78, 0x15, 0x89, 0x54, 0x24, 0x1c, 0x89, 0x4c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x79, 0xfc, 0x8d, 0x5e, 0x24, 0x8b, 0x6e, 0x44, + 0x89, 0x7d, 0x00, 0x83, 0x46, 0x44, 0x04, 0xc6, + 0x46, 0x23, 0x00, 0x8b, 0x7a, 0x4c, 0x8d, 0x6e, + 0x14, 0x89, 0x7e, 0x18, 0x89, 0x6a, 0x4c, 0x8d, + 0x3d, 0x02, 0x00, 0x00, 0x00, 0x66, 0x89, 0x78, + 0x24, 0x89, 0x46, 0x28, 0x89, 0x59, 0xfc, 0x89, + 0x54, 0x24, 0x1c, 0x89, 0x4c, 0x24, 0x18, 0x89, + 0x44, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x18, (uintptr_t)&PyGen_Type); + patch_32(code + 0x21, (uintptr_t)&PyCoro_Type); + patch_x86_64_32rx(code + 0x43, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x69, instruction->oparg + 0x2); +} + +void +emit__SETUP_ANNOTATIONS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SETUP_ANNOTATIONS.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 50 pushl %eax + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 4c 24 18 movl 0x18(%esp), %ecx + // 10: 8b 46 14 movl 0x14(%esi), %eax + // 13: 89 4e 20 movl %ecx, 0x20(%esi) + // 16: 85 c0 testl %eax, %eax + // 18: 74 66 je 0x80 <__JIT_ENTRY+0x80> + // 1a: 89 e1 movl %esp, %ecx + // 1c: 51 pushl %ecx + // 1d: 68 f0 4f 00 00 pushl $0x4ff0 # imm = 0x4FF0 + // 0000001e: IMAGE_REL_I386_DIR32 __PyRuntime + // 22: 50 pushl %eax + // 23: e8 00 00 00 00 calll 0x28 <__JIT_ENTRY+0x28> + // 00000024: IMAGE_REL_I386_REL32 _PyMapping_GetOptionalItem + // 28: 83 c4 0c addl $0xc, %esp + // 2b: 8b 4e 20 movl 0x20(%esi), %ecx + // 2e: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 35: 85 c0 testl %eax, %eax + // 37: 0f 88 c6 00 00 00 js 0x103 <__JIT_ENTRY+0x103> + // 3d: 8b 04 24 movl (%esp), %eax + // 40: 89 4e 20 movl %ecx, 0x20(%esi) + // 43: 85 c0 testl %eax, %eax + // 45: 74 61 je 0xa8 <__JIT_ENTRY+0xa8> + // 47: 8b 08 movl (%eax), %ecx + // 49: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4f: 7f 0e jg 0x5f <__JIT_ENTRY+0x5f> + // 51: 49 decl %ecx + // 52: 89 08 movl %ecx, (%eax) + // 54: 75 09 jne 0x5f <__JIT_ENTRY+0x5f> + // 56: 50 pushl %eax + // 57: e8 00 00 00 00 calll 0x5c <__JIT_ENTRY+0x5c> + // 00000058: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5c: 83 c4 04 addl $0x4, %esp + // 5f: 8b 4e 20 movl 0x20(%esi), %ecx + // 62: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 69: 89 74 24 14 movl %esi, 0x14(%esp) + // 6d: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 71: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 75: 83 c4 04 addl $0x4, %esp + // 78: 5e popl %esi + // 79: 5f popl %edi + // 7a: 5b popl %ebx + // 7b: e9 00 00 00 00 jmp 0x80 <__JIT_ENTRY+0x80> + // 0000007c: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 80: 68 00 00 00 00 pushl $0x0 + // 00000081: IMAGE_REL_I386_DIR32 ??_C@_0CM@CAADNNCE@no?5locals?5found?5when?5setting?5up?5@ + // 85: ff 35 00 00 00 00 pushl 0x0 + // 00000087: IMAGE_REL_I386_DIR32 _PyExc_SystemError + // 8b: 57 pushl %edi + // 8c: e8 00 00 00 00 calll 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __PyErr_Format + // 91: 83 c4 0c addl $0xc, %esp + // 94: 8b 46 20 movl 0x20(%esi), %eax + // 97: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 9e: 89 44 24 18 movl %eax, 0x18(%esp) + // a2: 89 7c 24 1c movl %edi, 0x1c(%esp) + // a6: eb 63 jmp 0x10b <__JIT_ENTRY+0x10b> + // a8: e8 00 00 00 00 calll 0xad <__JIT_ENTRY+0xad> + // 000000a9: IMAGE_REL_I386_REL32 _PyDict_New + // ad: 89 04 24 movl %eax, (%esp) + // b0: 8b 4e 20 movl 0x20(%esi), %ecx + // b3: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // ba: 85 c0 testl %eax, %eax + // bc: 74 45 je 0x103 <__JIT_ENTRY+0x103> + // be: 89 4e 20 movl %ecx, 0x20(%esi) + // c1: 50 pushl %eax + // c2: 68 f0 4f 00 00 pushl $0x4ff0 # imm = 0x4FF0 + // 000000c3: IMAGE_REL_I386_DIR32 __PyRuntime + // c7: ff 76 14 pushl 0x14(%esi) + // ca: e8 00 00 00 00 calll 0xcf <__JIT_ENTRY+0xcf> + // 000000cb: IMAGE_REL_I386_REL32 _PyObject_SetItem + // cf: 83 c4 0c addl $0xc, %esp + // d2: 8b 0c 24 movl (%esp), %ecx + // d5: 8b 11 movl (%ecx), %edx + // d7: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // dd: 7f 12 jg 0xf1 <__JIT_ENTRY+0xf1> + // df: 4a decl %edx + // e0: 89 11 movl %edx, (%ecx) + // e2: 75 0d jne 0xf1 <__JIT_ENTRY+0xf1> + // e4: 51 pushl %ecx + // e5: 89 c3 movl %eax, %ebx + // e7: e8 00 00 00 00 calll 0xec <__JIT_ENTRY+0xec> + // 000000e8: IMAGE_REL_I386_REL32 __Py_Dealloc + // ec: 89 d8 movl %ebx, %eax + // ee: 83 c4 04 addl $0x4, %esp + // f1: 8b 4e 20 movl 0x20(%esi), %ecx + // f4: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // fb: 85 c0 testl %eax, %eax + // fd: 0f 84 66 ff ff ff je 0x69 <__JIT_ENTRY+0x69> + // 103: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 107: 89 4c 24 18 movl %ecx, 0x18(%esp) + // 10b: 89 74 24 14 movl %esi, 0x14(%esp) + // 10f: 83 c4 04 addl $0x4, %esp + // 112: 5e popl %esi + // 113: 5f popl %edi + // 114: 5b popl %ebx + // 115: e9 00 00 00 00 jmp 0x11a <__JIT_ENTRY+0x11a> + // 00000116: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[282] = { + 0x53, 0x57, 0x56, 0x50, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x4c, 0x24, 0x18, + 0x8b, 0x46, 0x14, 0x89, 0x4e, 0x20, 0x85, 0xc0, + 0x74, 0x66, 0x89, 0xe1, 0x51, 0x68, 0xf0, 0x4f, + 0x00, 0x00, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x0c, 0x8b, 0x4e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, + 0x88, 0xc6, 0x00, 0x00, 0x00, 0x8b, 0x04, 0x24, + 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, 0x61, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x74, 0x24, 0x14, 0x89, 0x4c, 0x24, + 0x18, 0x89, 0x7c, 0x24, 0x1c, 0x83, 0xc4, 0x04, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x57, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x44, + 0x24, 0x18, 0x89, 0x7c, 0x24, 0x1c, 0xeb, 0x63, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0x04, 0x24, + 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x74, 0x45, 0x89, 0x4e, + 0x20, 0x50, 0x68, 0xf0, 0x4f, 0x00, 0x00, 0xff, + 0x76, 0x14, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x0c, 0x8b, 0x0c, 0x24, 0x8b, 0x11, 0x81, + 0xfa, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, 0x4a, + 0x89, 0x11, 0x75, 0x0d, 0x51, 0x89, 0xc3, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, + 0x04, 0x8b, 0x4e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x84, 0x66, + 0xff, 0xff, 0xff, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x4c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x83, + 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: 'no locals found when setting up annotations\x00' + // 2c: 00 00 00 00 + const unsigned char data_body[48] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1e, (uintptr_t)&_PyRuntime + 0x4ff0); + patch_x86_64_32rx(code + 0x24, (uintptr_t)&PyMapping_GetOptionalItem + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32(code + 0x81, (uintptr_t)data); + patch_32(code + 0x87, (uintptr_t)&PyExc_SystemError); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)&PyDict_New + -0x4); + patch_32(code + 0xc3, (uintptr_t)&_PyRuntime + 0x4ff0); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)&PyObject_SetItem + -0x4); + patch_x86_64_32rx(code + 0xe8, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x116, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__SET_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_ADD.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: f7 d1 notl %ecx + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: c1 e1 02 shll $0x2, %ecx + // 1d: 81 c9 00 00 fc ff orl $0xfffc0000, %ecx # imm = 0xFFFC0000 + // 23: 8b 0c 08 movl (%eax,%ecx), %ecx + // 26: 89 46 20 movl %eax, 0x20(%esi) + // 29: 53 pushl %ebx + // 2a: 51 pushl %ecx + // 2b: e8 00 00 00 00 calll 0x30 <__JIT_ENTRY+0x30> + // 0000002c: IMAGE_REL_I386_REL32 _PySet_Add + // 30: 83 c4 08 addl $0x8, %esp + // 33: 8b 6e 20 movl 0x20(%esi), %ebp + // 36: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3d: 8b 0b movl (%ebx), %ecx + // 3f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 45: 7f 05 jg 0x4c <__JIT_ENTRY+0x4c> + // 47: 49 decl %ecx + // 48: 89 0b movl %ecx, (%ebx) + // 4a: 74 1c je 0x68 <__JIT_ENTRY+0x68> + // 4c: 83 c5 fc addl $-0x4, %ebp + // 4f: 85 c0 testl %eax, %eax + // 51: 74 29 je 0x7c <__JIT_ENTRY+0x7c> + // 53: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 57: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 5b: 89 74 24 14 movl %esi, 0x14(%esp) + // 5f: 5e popl %esi + // 60: 5f popl %edi + // 61: 5b popl %ebx + // 62: 5d popl %ebp + // 63: e9 00 00 00 00 jmp 0x68 <__JIT_ENTRY+0x68> + // 00000064: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 68: 53 pushl %ebx + // 69: 89 c3 movl %eax, %ebx + // 6b: e8 00 00 00 00 calll 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 70: 89 d8 movl %ebx, %eax + // 72: 83 c4 04 addl $0x4, %esp + // 75: 83 c5 fc addl $-0x4, %ebp + // 78: 85 c0 testl %eax, %eax + // 7a: 75 d7 jne 0x53 <__JIT_ENTRY+0x53> + // 7c: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 80: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 84: 89 74 24 14 movl %esi, 0x14(%esp) + // 88: 5e popl %esi + // 89: 5f popl %edi + // 8a: 5b popl %ebx + // 8b: 5d popl %ebp + // 8c: e9 00 00 00 00 jmp 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[140] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd1, 0x8b, + 0x58, 0xfc, 0xc1, 0xe1, 0x02, 0x81, 0xc9, 0x00, + 0x00, 0xfc, 0xff, 0x8b, 0x0c, 0x08, 0x89, 0x46, + 0x20, 0x53, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, + 0x89, 0x0b, 0x74, 0x1c, 0x83, 0xc5, 0xfc, 0x85, + 0xc0, 0x74, 0x29, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x6c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x83, 0xc5, 0xfc, + 0x85, 0xc0, 0x75, 0xd7, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x6c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)&PySet_Add + -0x4); + patch_x86_64_32rx(code + 0x64, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__SET_FUNCTION_ATTRIBUTE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_FUNCTION_ATTRIBUTE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 44 24 1c movl 0x1c(%esp), %eax + // 8: 8b 4c 24 14 movl 0x14(%esp), %ecx + // c: 8b 54 24 18 movl 0x18(%esp), %edx + // 10: be 00 00 00 00 movl $0x0, %esi + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 f6 movzwl %si, %esi + // 18: 8d 7a fc leal -0x4(%edx), %edi + // 1b: 8b 5a f8 movl -0x8(%edx), %ebx + // 1e: 8b 6a fc movl -0x4(%edx), %ebp + // 21: 8b 34 b5 00 00 00 00 movl (,%esi,4), %esi + // 00000024: IMAGE_REL_I386_DIR32 __Py_FunctionAttributeOffsets + // 28: 89 5c 35 00 movl %ebx, (%ebp,%esi) + // 2c: 89 6a f8 movl %ebp, -0x8(%edx) + // 2f: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 33: 89 7c 24 18 movl %edi, 0x18(%esp) + // 37: 89 44 24 1c movl %eax, 0x1c(%esp) + // 3b: 5e popl %esi + // 3c: 5f popl %edi + // 3d: 5b popl %ebx + // 3e: 5d popl %ebp + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 00000040: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[63] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x44, 0x24, 0x1c, + 0x8b, 0x4c, 0x24, 0x14, 0x8b, 0x54, 0x24, 0x18, + 0xbe, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, + 0x8d, 0x7a, 0xfc, 0x8b, 0x5a, 0xf8, 0x8b, 0x6a, + 0xfc, 0x8b, 0x34, 0xb5, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x5c, 0x35, 0x00, 0x89, 0x6a, 0xf8, 0x89, + 0x4c, 0x24, 0x14, 0x89, 0x7c, 0x24, 0x18, 0x89, + 0x44, 0x24, 0x1c, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_32(code + 0x24, (uintptr_t)&_Py_FunctionAttributeOffsets); +} + +void +emit__SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_IP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 44 24 0c movl 0xc(%esp), %eax + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 54 24 04 movl 0x4(%esp), %edx + // c: c7 42 1c 00 00 00 00 movl $0x0, 0x1c(%edx) + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 13: 89 54 24 04 movl %edx, 0x4(%esp) + // 17: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 1b: 89 44 24 0c movl %eax, 0xc(%esp) + // 1f: e9 00 00 00 00 jmp 0x24 <__JIT_ENTRY+0x24> + // 00000020: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[31] = { + 0x8b, 0x44, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x54, 0x24, 0x04, 0xc7, 0x42, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x04, 0x89, + 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, 0x0c, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, (instruction->operand0 & UINT32_MAX)); +} + +void +emit__SET_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_UPDATE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: f7 d1 notl %ecx + // 17: 8b 58 fc movl -0x4(%eax), %ebx + // 1a: c1 e1 02 shll $0x2, %ecx + // 1d: 81 c9 00 00 fc ff orl $0xfffc0000, %ecx # imm = 0xFFFC0000 + // 23: 8b 0c 08 movl (%eax,%ecx), %ecx + // 26: 89 46 20 movl %eax, 0x20(%esi) + // 29: 53 pushl %ebx + // 2a: 51 pushl %ecx + // 2b: e8 00 00 00 00 calll 0x30 <__JIT_ENTRY+0x30> + // 0000002c: IMAGE_REL_I386_REL32 __PySet_Update + // 30: 83 c4 08 addl $0x8, %esp + // 33: 8b 6e 20 movl 0x20(%esi), %ebp + // 36: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3d: 8b 0b movl (%ebx), %ecx + // 3f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 45: 7f 05 jg 0x4c <__JIT_ENTRY+0x4c> + // 47: 49 decl %ecx + // 48: 89 0b movl %ecx, (%ebx) + // 4a: 74 1c je 0x68 <__JIT_ENTRY+0x68> + // 4c: 83 c5 fc addl $-0x4, %ebp + // 4f: 85 c0 testl %eax, %eax + // 51: 78 29 js 0x7c <__JIT_ENTRY+0x7c> + // 53: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 57: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 5b: 89 74 24 14 movl %esi, 0x14(%esp) + // 5f: 5e popl %esi + // 60: 5f popl %edi + // 61: 5b popl %ebx + // 62: 5d popl %ebp + // 63: e9 00 00 00 00 jmp 0x68 <__JIT_ENTRY+0x68> + // 00000064: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 68: 53 pushl %ebx + // 69: 89 c3 movl %eax, %ebx + // 6b: e8 00 00 00 00 calll 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 70: 89 d8 movl %ebx, %eax + // 72: 83 c4 04 addl $0x4, %esp + // 75: 83 c5 fc addl $-0x4, %ebp + // 78: 85 c0 testl %eax, %eax + // 7a: 79 d7 jns 0x53 <__JIT_ENTRY+0x53> + // 7c: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 80: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 84: 89 74 24 14 movl %esi, 0x14(%esp) + // 88: 5e popl %esi + // 89: 5f popl %edi + // 8a: 5b popl %ebx + // 8b: 5d popl %ebp + // 8c: e9 00 00 00 00 jmp 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[145] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd1, 0x8b, + 0x58, 0xfc, 0xc1, 0xe1, 0x02, 0x81, 0xc9, 0x00, + 0x00, 0xfc, 0xff, 0x8b, 0x0c, 0x08, 0x89, 0x46, + 0x20, 0x53, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, + 0x89, 0x0b, 0x74, 0x1c, 0x83, 0xc5, 0xfc, 0x85, + 0xc0, 0x78, 0x29, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x6c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x83, 0xc5, 0xfc, + 0x85, 0xc0, 0x79, 0xd7, 0x89, 0x7c, 0x24, 0x1c, + 0x89, 0x6c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)&_PySet_Update + -0x4); + patch_x86_64_32rx(code + 0x64, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x8d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__START_EXECUTOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _START_EXECUTOR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: 89 46 20 movl %eax, 0x20(%esi) + // 11: 8b 87 a4 00 00 00 movl 0xa4(%edi), %eax + // 17: 85 c0 testl %eax, %eax + // 19: 74 22 je 0x3d <__JIT_ENTRY+0x3d> + // 1b: c7 87 a4 00 00 00 00 00 00 00 movl $0x0, 0xa4(%edi) + // 25: 8b 08 movl (%eax), %ecx + // 27: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 2d: 7f 0e jg 0x3d <__JIT_ENTRY+0x3d> + // 2f: 49 decl %ecx + // 30: 89 08 movl %ecx, (%eax) + // 32: 75 09 jne 0x3d <__JIT_ENTRY+0x3d> + // 34: 50 pushl %eax + // 35: e8 00 00 00 00 calll 0x3a <__JIT_ENTRY+0x3a> + // 00000036: IMAGE_REL_I386_REL32 __Py_Dealloc + // 3a: 83 c4 04 addl $0x4, %esp + // 3d: 8b 46 20 movl 0x20(%esi), %eax + // 40: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 47: 89 7c 24 14 movl %edi, 0x14(%esp) + // 4b: 89 44 24 10 movl %eax, 0x10(%esp) + // 4f: 89 74 24 0c movl %esi, 0xc(%esp) + // 53: 5e popl %esi + // 54: 5f popl %edi + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[85] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0x89, 0x46, + 0x20, 0x8b, 0x87, 0xa4, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x22, 0xc7, 0x87, 0xa4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, + 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x36, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 44 24 20 movl 0x20(%esp), %eax + // 9: 89 04 24 movl %eax, (%esp) + // c: 8b 7c 24 18 movl 0x18(%esp), %edi + // 10: 8b 44 24 1c movl 0x1c(%esp), %eax + // 14: b9 00 00 00 00 movl $0x0, %ecx + // 00000015: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 19: 0f b7 c9 movzwl %cx, %ecx + // 1c: 8b 70 f8 movl -0x8(%eax), %esi + // 1f: 8b 68 fc movl -0x4(%eax), %ebp + // 22: 8b 17 movl (%edi), %edx + // 24: 8b 52 10 movl 0x10(%edx), %edx + // 27: 8b 4c 8a 0c movl 0xc(%edx,%ecx,4), %ecx + // 2b: 89 47 20 movl %eax, 0x20(%edi) + // 2e: 56 pushl %esi + // 2f: 51 pushl %ecx + // 30: 55 pushl %ebp + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 _PyObject_SetAttr + // 36: 83 c4 0c addl $0xc, %esp + // 39: 8b 5f 20 movl 0x20(%edi), %ebx + // 3c: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 43: 8b 0e movl (%esi), %ecx + // 45: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4b: 7f 05 jg 0x52 <__JIT_ENTRY+0x52> + // 4d: 49 decl %ecx + // 4e: 89 0e movl %ecx, (%esi) + // 50: 74 20 je 0x72 <__JIT_ENTRY+0x72> + // 52: 8b 4d 00 movl (%ebp), %ecx + // 55: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 5b: 7f 2d jg 0x8a <__JIT_ENTRY+0x8a> + // 5d: 49 decl %ecx + // 5e: 89 4d 00 movl %ecx, (%ebp) + // 61: 75 27 jne 0x8a <__JIT_ENTRY+0x8a> + // 63: 55 pushl %ebp + // 64: 89 c6 movl %eax, %esi + // 66: e8 00 00 00 00 calll 0x6b <__JIT_ENTRY+0x6b> + // 00000067: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6b: 89 f0 movl %esi, %eax + // 6d: 83 c4 04 addl $0x4, %esp + // 70: eb 18 jmp 0x8a <__JIT_ENTRY+0x8a> + // 72: 56 pushl %esi + // 73: 89 c6 movl %eax, %esi + // 75: e8 00 00 00 00 calll 0x7a <__JIT_ENTRY+0x7a> + // 00000076: IMAGE_REL_I386_REL32 __Py_Dealloc + // 7a: 89 f0 movl %esi, %eax + // 7c: 83 c4 04 addl $0x4, %esp + // 7f: 8b 4d 00 movl (%ebp), %ecx + // 82: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 88: 7e d3 jle 0x5d <__JIT_ENTRY+0x5d> + // 8a: 83 c3 f8 addl $-0x8, %ebx + // 8d: 85 c0 testl %eax, %eax + // 8f: 74 1b je 0xac <__JIT_ENTRY+0xac> + // 91: 8b 04 24 movl (%esp), %eax + // 94: 89 44 24 20 movl %eax, 0x20(%esp) + // 98: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 9c: 89 7c 24 18 movl %edi, 0x18(%esp) + // a0: 83 c4 04 addl $0x4, %esp + // a3: 5e popl %esi + // a4: 5f popl %edi + // a5: 5b popl %ebx + // a6: 5d popl %ebp + // a7: e9 00 00 00 00 jmp 0xac <__JIT_ENTRY+0xac> + // 000000a8: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // ac: 8b 04 24 movl (%esp), %eax + // af: 89 44 24 20 movl %eax, 0x20(%esp) + // b3: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // b7: 89 7c 24 18 movl %edi, 0x18(%esp) + // bb: 83 c4 04 addl $0x4, %esp + // be: 5e popl %esi + // bf: 5f popl %edi + // c0: 5b popl %ebx + // c1: 5d popl %ebp + // c2: e9 00 00 00 00 jmp 0xc7 <__JIT_ENTRY+0xc7> + // 000000c3: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[194] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x44, 0x24, + 0x20, 0x89, 0x04, 0x24, 0x8b, 0x7c, 0x24, 0x18, + 0x8b, 0x44, 0x24, 0x1c, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xc9, 0x8b, 0x70, 0xf8, 0x8b, + 0x68, 0xfc, 0x8b, 0x17, 0x8b, 0x52, 0x10, 0x8b, + 0x4c, 0x8a, 0x0c, 0x89, 0x47, 0x20, 0x56, 0x51, + 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x0c, 0x8b, 0x5f, 0x20, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0e, + 0x74, 0x20, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x2d, 0x49, 0x89, 0x4d, + 0x00, 0x75, 0x27, 0x55, 0x89, 0xc6, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, + 0xeb, 0x18, 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0x8b, + 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7e, 0xd3, 0x83, 0xc3, 0xf8, 0x85, 0xc0, 0x74, + 0x1b, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, + 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x20, 0x89, 0x5c, 0x24, 0x1c, 0x89, + 0x7c, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, instruction->oparg); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&PyObject_SetAttr + -0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__STORE_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_INSTANCE_VALUE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 7c 24 2c movl 0x2c(%esp), %edi + // b: 8b 74 24 24 movl 0x24(%esp), %esi + // f: 8b 4c 24 28 movl 0x28(%esp), %ecx + // 13: 8b 59 f8 movl -0x8(%ecx), %ebx + // 16: 8b 41 fc movl -0x4(%ecx), %eax + // 19: 83 c1 f8 addl $-0x8, %ecx + // 1c: ba 00 00 00 00 movl $0x0, %edx + // 0000001d: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 21: 0f b7 d2 movzwl %dx, %edx + // 24: 8b 2c 10 movl (%eax,%edx), %ebp + // 27: 89 1c 10 movl %ebx, (%eax,%edx) + // 2a: 85 ed testl %ebp, %ebp + // 2c: 74 0f je 0x3d <__JIT_ENTRY+0x3d> + // 2e: 89 4e 20 movl %ecx, 0x20(%esi) + // 31: 8b 08 movl (%eax), %ecx + // 33: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 39: 7e 59 jle 0x94 <__JIT_ENTRY+0x94> + // 3b: eb 65 jmp 0xa2 <__JIT_ENTRY+0xa2> + // 3d: 01 c2 addl %eax, %edx + // 3f: 8b 58 04 movl 0x4(%eax), %ebx + // 42: 89 6c 24 08 movl %ebp, 0x8(%esp) + // 46: 8b 6b 10 movl 0x10(%ebx), %ebp + // 49: 8d 1c 28 leal (%eax,%ebp), %ebx + // 4c: 89 5c 24 04 movl %ebx, 0x4(%esp) + // 50: 8d 1c 28 leal (%eax,%ebp), %ebx + // 53: 83 c3 04 addl $0x4, %ebx + // 56: 29 da subl %ebx, %edx + // 58: c1 ea 02 shrl $0x2, %edx + // 5b: 0f b6 5c 28 01 movzbl 0x1(%eax,%ebp), %ebx + // 60: 89 7c 24 0c movl %edi, 0xc(%esp) + // 64: 0f b6 3c 28 movzbl (%eax,%ebp), %edi + // 68: 89 34 24 movl %esi, (%esp) + // 6b: 8b 74 24 04 movl 0x4(%esp), %esi + // 6f: 8d 7c be 04 leal 0x4(%esi,%edi,4), %edi + // 73: 8b 34 24 movl (%esp), %esi + // 76: 88 14 3b movb %dl, (%ebx,%edi) + // 79: 8b 7c 24 0c movl 0xc(%esp), %edi + // 7d: fe c3 incb %bl + // 7f: 88 5c 28 01 movb %bl, 0x1(%eax,%ebp) + // 83: 8b 6c 24 08 movl 0x8(%esp), %ebp + // 87: 89 4e 20 movl %ecx, 0x20(%esi) + // 8a: 8b 08 movl (%eax), %ecx + // 8c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 92: 7f 0e jg 0xa2 <__JIT_ENTRY+0xa2> + // 94: 49 decl %ecx + // 95: 89 08 movl %ecx, (%eax) + // 97: 75 09 jne 0xa2 <__JIT_ENTRY+0xa2> + // 99: 50 pushl %eax + // 9a: e8 00 00 00 00 calll 0x9f <__JIT_ENTRY+0x9f> + // 0000009b: IMAGE_REL_I386_REL32 __Py_Dealloc + // 9f: 83 c4 04 addl $0x4, %esp + // a2: 85 ed testl %ebp, %ebp + // a4: 74 19 je 0xbf <__JIT_ENTRY+0xbf> + // a6: 8b 45 00 movl (%ebp), %eax + // a9: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // ae: 7f 0f jg 0xbf <__JIT_ENTRY+0xbf> + // b0: 48 decl %eax + // b1: 89 45 00 movl %eax, (%ebp) + // b4: 75 09 jne 0xbf <__JIT_ENTRY+0xbf> + // b6: 55 pushl %ebp + // b7: e8 00 00 00 00 calll 0xbc <__JIT_ENTRY+0xbc> + // 000000b8: IMAGE_REL_I386_REL32 __Py_Dealloc + // bc: 83 c4 04 addl $0x4, %esp + // bf: 8b 46 20 movl 0x20(%esi), %eax + // c2: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // c9: 89 7c 24 2c movl %edi, 0x2c(%esp) + // cd: 89 44 24 28 movl %eax, 0x28(%esp) + // d1: 89 74 24 24 movl %esi, 0x24(%esp) + // d5: 83 c4 10 addl $0x10, %esp + // d8: 5e popl %esi + // d9: 5f popl %edi + // da: 5b popl %ebx + // db: 5d popl %ebp + // dc: e9 00 00 00 00 jmp 0xe1 <__JIT_ENTRY+0xe1> + // 000000dd: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[220] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x7c, 0x24, 0x2c, 0x8b, 0x74, 0x24, 0x24, 0x8b, + 0x4c, 0x24, 0x28, 0x8b, 0x59, 0xf8, 0x8b, 0x41, + 0xfc, 0x83, 0xc1, 0xf8, 0xba, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xd2, 0x8b, 0x2c, 0x10, 0x89, + 0x1c, 0x10, 0x85, 0xed, 0x74, 0x0f, 0x89, 0x4e, + 0x20, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7e, 0x59, 0xeb, 0x65, 0x01, 0xc2, 0x8b, + 0x58, 0x04, 0x89, 0x6c, 0x24, 0x08, 0x8b, 0x6b, + 0x10, 0x8d, 0x1c, 0x28, 0x89, 0x5c, 0x24, 0x04, + 0x8d, 0x1c, 0x28, 0x83, 0xc3, 0x04, 0x29, 0xda, + 0xc1, 0xea, 0x02, 0x0f, 0xb6, 0x5c, 0x28, 0x01, + 0x89, 0x7c, 0x24, 0x0c, 0x0f, 0xb6, 0x3c, 0x28, + 0x89, 0x34, 0x24, 0x8b, 0x74, 0x24, 0x04, 0x8d, + 0x7c, 0xbe, 0x04, 0x8b, 0x34, 0x24, 0x88, 0x14, + 0x3b, 0x8b, 0x7c, 0x24, 0x0c, 0xfe, 0xc3, 0x88, + 0x5c, 0x28, 0x01, 0x8b, 0x6c, 0x24, 0x08, 0x89, + 0x4e, 0x20, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, + 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x85, 0xed, 0x74, 0x19, 0x8b, 0x45, + 0x00, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0f, + 0x48, 0x89, 0x45, 0x00, 0x75, 0x09, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x89, 0x7c, 0x24, 0x2c, 0x89, 0x44, 0x24, + 0x28, 0x89, 0x74, 0x24, 0x24, 0x83, 0xc4, 0x10, + 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1d, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_SLOT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 4c 24 18 movl 0x18(%esp), %ecx + // 10: 8b 51 f8 movl -0x8(%ecx), %edx + // 13: 8b 41 fc movl -0x4(%ecx), %eax + // 16: 83 c1 f8 addl $-0x8, %ecx + // 19: bb 00 00 00 00 movl $0x0, %ebx + // 0000001a: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 1e: 0f b7 eb movzwl %bx, %ebp + // 21: 8b 1c 28 movl (%eax,%ebp), %ebx + // 24: 89 14 28 movl %edx, (%eax,%ebp) + // 27: 89 4e 20 movl %ecx, 0x20(%esi) + // 2a: 8b 08 movl (%eax), %ecx + // 2c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 32: 7f 0e jg 0x42 <__JIT_ENTRY+0x42> + // 34: 49 decl %ecx + // 35: 89 08 movl %ecx, (%eax) + // 37: 75 09 jne 0x42 <__JIT_ENTRY+0x42> + // 39: 50 pushl %eax + // 3a: e8 00 00 00 00 calll 0x3f <__JIT_ENTRY+0x3f> + // 0000003b: IMAGE_REL_I386_REL32 __Py_Dealloc + // 3f: 83 c4 04 addl $0x4, %esp + // 42: 85 db testl %ebx, %ebx + // 44: 74 17 je 0x5d <__JIT_ENTRY+0x5d> + // 46: 8b 03 movl (%ebx), %eax + // 48: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 4d: 7f 0e jg 0x5d <__JIT_ENTRY+0x5d> + // 4f: 48 decl %eax + // 50: 89 03 movl %eax, (%ebx) + // 52: 75 09 jne 0x5d <__JIT_ENTRY+0x5d> + // 54: 53 pushl %ebx + // 55: e8 00 00 00 00 calll 0x5a <__JIT_ENTRY+0x5a> + // 00000056: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5a: 83 c4 04 addl $0x4, %esp + // 5d: 8b 46 20 movl 0x20(%esi), %eax + // 60: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 67: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 6b: 89 44 24 18 movl %eax, 0x18(%esp) + // 6f: 89 74 24 14 movl %esi, 0x14(%esp) + // 73: 5e popl %esi + // 74: 5f popl %edi + // 75: 5b popl %ebx + // 76: 5d popl %ebp + // 77: e9 00 00 00 00 jmp 0x7c <__JIT_ENTRY+0x7c> + // 00000078: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[119] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x4c, 0x24, 0x18, + 0x8b, 0x51, 0xf8, 0x8b, 0x41, 0xfc, 0x83, 0xc1, + 0xf8, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xeb, 0x8b, 0x1c, 0x28, 0x89, 0x14, 0x28, 0x89, + 0x4e, 0x20, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, + 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x85, 0xdb, 0x74, 0x17, 0x8b, 0x03, + 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, + 0x89, 0x03, 0x75, 0x09, 0x53, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x7c, 0x24, 0x1c, 0x89, 0x44, 0x24, 0x18, 0x89, + 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x1a, (instruction->operand0 & UINT32_MAX)); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_WITH_HINT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 20 subl $0x20, %esp + // 7: 8b 4c 24 3c movl 0x3c(%esp), %ecx + // b: 8b 44 24 38 movl 0x38(%esp), %eax + // f: 8b 74 24 34 movl 0x34(%esp), %esi + // 13: 8b 58 fc movl -0x4(%eax), %ebx + // 16: 8b 53 f4 movl -0xc(%ebx), %edx + // 19: 85 d2 testl %edx, %edx + // 1b: 74 75 je 0x92 <__JIT_ENTRY+0x92> + // 1d: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 21: b9 00 00 00 00 movl $0x0, %ecx + // 00000022: IMAGE_REL_I386_DIR32 __JIT_OPERAND0_LO + // 26: 0f b7 e9 movzwl %cx, %ebp + // 29: 8b 7a 18 movl 0x18(%edx), %edi + // 2c: 39 6f 10 cmpl %ebp, 0x10(%edi) + // 2f: 76 5d jbe 0x8e <__JIT_ENTRY+0x8e> + // 31: 80 7f 06 00 cmpb $0x0, 0x6(%edi) + // 35: 74 57 je 0x8e <__JIT_ENTRY+0x8e> + // 37: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 3b: b9 00 00 00 00 movl $0x0, %ecx + // 0000003c: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 40: 0f b7 c9 movzwl %cx, %ecx + // 43: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 47: 8b 0e movl (%esi), %ecx + // 49: 8b 49 10 movl 0x10(%ecx), %ecx + // 4c: 89 0c 24 movl %ecx, (%esp) + // 4f: 0f b6 4f 05 movzbl 0x5(%edi), %ecx + // 53: 89 74 24 0c movl %esi, 0xc(%esp) + // 57: be 01 00 00 00 movl $0x1, %esi + // 5c: d3 e6 shll %cl, %esi + // 5e: 89 eb movl %ebp, %ebx + // 60: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 64: 8b 2c 24 movl (%esp), %ebp + // 67: 8b 6c 8d 0c movl 0xc(%ebp,%ecx,4), %ebp + // 6b: 8d 0c 37 leal (%edi,%esi), %ecx + // 6e: 89 5c 24 08 movl %ebx, 0x8(%esp) + // 72: 39 6c d9 14 cmpl %ebp, 0x14(%ecx,%ebx,8) + // 76: 74 32 je 0xaa <__JIT_ENTRY+0xaa> + // 78: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 7c: 89 4c 24 3c movl %ecx, 0x3c(%esp) + // 80: 89 44 24 38 movl %eax, 0x38(%esp) + // 84: 8b 44 24 0c movl 0xc(%esp), %eax + // 88: 89 44 24 34 movl %eax, 0x34(%esp) + // 8c: eb 10 jmp 0x9e <__JIT_ENTRY+0x9e> + // 8e: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 92: 89 4c 24 3c movl %ecx, 0x3c(%esp) + // 96: 89 44 24 38 movl %eax, 0x38(%esp) + // 9a: 89 74 24 34 movl %esi, 0x34(%esp) + // 9e: 83 c4 20 addl $0x20, %esp + // a1: 5e popl %esi + // a2: 5f popl %edi + // a3: 5b popl %ebx + // a4: 5d popl %ebp + // a5: e9 00 00 00 00 jmp 0xaa <__JIT_ENTRY+0xaa> + // 000000a6: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // aa: 89 6c 24 18 movl %ebp, 0x18(%esp) + // ae: 8b 4c 24 0c movl 0xc(%esp), %ecx + // b2: 01 f7 addl %esi, %edi + // b4: 83 c7 14 addl $0x14, %edi + // b7: 8b 6c 24 08 movl 0x8(%esp), %ebp + // bb: 8b 74 ef 04 movl 0x4(%edi,%ebp,8), %esi + // bf: 85 f6 testl %esi, %esi + // c1: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // c5: 0f 84 9a 00 00 00 je 0x165 <__JIT_ENTRY+0x165> + // cb: 89 7c 24 10 movl %edi, 0x10(%esp) + // cf: 89 74 24 14 movl %esi, 0x14(%esp) + // d3: 8b 70 f8 movl -0x8(%eax), %esi + // d6: 89 34 24 movl %esi, (%esp) + // d9: 89 ce movl %ecx, %esi + // db: 89 41 20 movl %eax, 0x20(%ecx) + // de: 0f b6 7a 10 movzbl 0x10(%edx), %edi + // e2: 85 ff testl %edi, %edi + // e4: 74 16 je 0xfc <__JIT_ENTRY+0xfc> + // e6: ff 34 24 pushl (%esp) + // e9: ff 74 24 1c pushl 0x1c(%esp) + // ed: 52 pushl %edx + // ee: 6a 01 pushl $0x1 + // f0: 57 pushl %edi + // f1: e8 00 00 00 00 calll 0xf6 <__JIT_ENTRY+0xf6> + // 000000f2: IMAGE_REL_I386_REL32 __PyDict_SendEvent + // f6: 83 c4 14 addl $0x14, %esp + // f9: 8b 46 20 movl 0x20(%esi), %eax + // fc: 8b 4c 24 10 movl 0x10(%esp), %ecx + // 100: 8b 14 24 movl (%esp), %edx + // 103: 89 54 e9 04 movl %edx, 0x4(%ecx,%ebp,8) + // 107: 83 c0 f8 addl $-0x8, %eax + // 10a: 89 46 20 movl %eax, 0x20(%esi) + // 10d: 8b 03 movl (%ebx), %eax + // 10f: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 114: 7f 0e jg 0x124 <__JIT_ENTRY+0x124> + // 116: 48 decl %eax + // 117: 89 03 movl %eax, (%ebx) + // 119: 75 09 jne 0x124 <__JIT_ENTRY+0x124> + // 11b: 53 pushl %ebx + // 11c: e8 00 00 00 00 calll 0x121 <__JIT_ENTRY+0x121> + // 0000011d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 121: 83 c4 04 addl $0x4, %esp + // 124: 8b 4c 24 14 movl 0x14(%esp), %ecx + // 128: 8b 01 movl (%ecx), %eax + // 12a: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 12f: 7f 0e jg 0x13f <__JIT_ENTRY+0x13f> + // 131: 48 decl %eax + // 132: 89 01 movl %eax, (%ecx) + // 134: 75 09 jne 0x13f <__JIT_ENTRY+0x13f> + // 136: 51 pushl %ecx + // 137: e8 00 00 00 00 calll 0x13c <__JIT_ENTRY+0x13c> + // 00000138: IMAGE_REL_I386_REL32 __Py_Dealloc + // 13c: 83 c4 04 addl $0x4, %esp + // 13f: 8b 46 20 movl 0x20(%esi), %eax + // 142: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 149: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 14d: 89 4c 24 3c movl %ecx, 0x3c(%esp) + // 151: 89 44 24 38 movl %eax, 0x38(%esp) + // 155: 89 74 24 34 movl %esi, 0x34(%esp) + // 159: 83 c4 20 addl $0x20, %esp + // 15c: 5e popl %esi + // 15d: 5f popl %edi + // 15e: 5b popl %ebx + // 15f: 5d popl %ebp + // 160: e9 00 00 00 00 jmp 0x165 <__JIT_ENTRY+0x165> + // 00000161: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 165: 8b 54 24 04 movl 0x4(%esp), %edx + // 169: 89 54 24 3c movl %edx, 0x3c(%esp) + // 16d: 89 44 24 38 movl %eax, 0x38(%esp) + // 171: 89 4c 24 34 movl %ecx, 0x34(%esp) + // 175: e9 24 ff ff ff jmp 0x9e <__JIT_ENTRY+0x9e> + const unsigned char code_body[378] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x20, 0x8b, + 0x4c, 0x24, 0x3c, 0x8b, 0x44, 0x24, 0x38, 0x8b, + 0x74, 0x24, 0x34, 0x8b, 0x58, 0xfc, 0x8b, 0x53, + 0xf4, 0x85, 0xd2, 0x74, 0x75, 0x89, 0x4c, 0x24, + 0x04, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xe9, 0x8b, 0x7a, 0x18, 0x39, 0x6f, 0x10, 0x76, + 0x5d, 0x80, 0x7f, 0x06, 0x00, 0x74, 0x57, 0x89, + 0x5c, 0x24, 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc9, 0x89, 0x4c, 0x24, 0x08, 0x8b, + 0x0e, 0x8b, 0x49, 0x10, 0x89, 0x0c, 0x24, 0x0f, + 0xb6, 0x4f, 0x05, 0x89, 0x74, 0x24, 0x0c, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0xd3, 0xe6, 0x89, 0xeb, + 0x8b, 0x4c, 0x24, 0x08, 0x8b, 0x2c, 0x24, 0x8b, + 0x6c, 0x8d, 0x0c, 0x8d, 0x0c, 0x37, 0x89, 0x5c, + 0x24, 0x08, 0x39, 0x6c, 0xd9, 0x14, 0x74, 0x32, + 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, 0x3c, + 0x89, 0x44, 0x24, 0x38, 0x8b, 0x44, 0x24, 0x0c, + 0x89, 0x44, 0x24, 0x34, 0xeb, 0x10, 0x8b, 0x4c, + 0x24, 0x04, 0x89, 0x4c, 0x24, 0x3c, 0x89, 0x44, + 0x24, 0x38, 0x89, 0x74, 0x24, 0x34, 0x83, 0xc4, + 0x20, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x6c, 0x24, 0x18, 0x8b, 0x4c, + 0x24, 0x0c, 0x01, 0xf7, 0x83, 0xc7, 0x14, 0x8b, + 0x6c, 0x24, 0x08, 0x8b, 0x74, 0xef, 0x04, 0x85, + 0xf6, 0x8b, 0x5c, 0x24, 0x1c, 0x0f, 0x84, 0x9a, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x14, 0x8b, 0x70, 0xf8, 0x89, 0x34, + 0x24, 0x89, 0xce, 0x89, 0x41, 0x20, 0x0f, 0xb6, + 0x7a, 0x10, 0x85, 0xff, 0x74, 0x16, 0xff, 0x34, + 0x24, 0xff, 0x74, 0x24, 0x1c, 0x52, 0x6a, 0x01, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x14, 0x8b, 0x46, 0x20, 0x8b, 0x4c, 0x24, 0x10, + 0x8b, 0x14, 0x24, 0x89, 0x54, 0xe9, 0x04, 0x83, + 0xc0, 0xf8, 0x89, 0x46, 0x20, 0x8b, 0x03, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, + 0x03, 0x75, 0x09, 0x53, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x4c, 0x24, 0x14, + 0x8b, 0x01, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x0e, 0x48, 0x89, 0x01, 0x75, 0x09, 0x51, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, + 0x3c, 0x89, 0x44, 0x24, 0x38, 0x89, 0x74, 0x24, + 0x34, 0x83, 0xc4, 0x20, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x54, 0x24, + 0x04, 0x89, 0x54, 0x24, 0x3c, 0x89, 0x44, 0x24, + 0x38, 0x89, 0x4c, 0x24, 0x34, 0xe9, 0x24, 0xff, + 0xff, 0xff, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x22, (instruction->operand0 & UINT32_MAX)); + patch_32(code + 0x3c, instruction->oparg); + patch_x86_64_32rx(code + 0xa6, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)&_PyDict_SendEvent + -0x4); + patch_x86_64_32rx(code + 0x11d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x138, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x161, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__STORE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_DEREF.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 44 24 10 movl 0x10(%esp), %eax + // e: b9 00 00 00 00 movl $0x0, %ecx + // 0000000f: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 13: 0f b7 c9 movzwl %cx, %ecx + // 16: 8b 50 fc movl -0x4(%eax), %edx + // 19: 8b 4c 8e 28 movl 0x28(%esi,%ecx,4), %ecx + // 1d: 89 46 20 movl %eax, 0x20(%esi) + // 20: 8b 41 08 movl 0x8(%ecx), %eax + // 23: 89 51 08 movl %edx, 0x8(%ecx) + // 26: 85 c0 testl %eax, %eax + // 28: 74 18 je 0x42 <__JIT_ENTRY+0x42> + // 2a: 8b 08 movl (%eax), %ecx + // 2c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 32: 7f 0e jg 0x42 <__JIT_ENTRY+0x42> + // 34: 49 decl %ecx + // 35: 89 08 movl %ecx, (%eax) + // 37: 75 09 jne 0x42 <__JIT_ENTRY+0x42> + // 39: 50 pushl %eax + // 3a: e8 00 00 00 00 calll 0x3f <__JIT_ENTRY+0x3f> + // 0000003b: IMAGE_REL_I386_REL32 __Py_Dealloc + // 3f: 83 c4 04 addl $0x4, %esp + // 42: 8b 46 20 movl 0x20(%esi), %eax + // 45: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4c: 83 c0 fc addl $-0x4, %eax + // 4f: 89 7c 24 14 movl %edi, 0x14(%esp) + // 53: 89 44 24 10 movl %eax, 0x10(%esp) + // 57: 89 74 24 0c movl %esi, 0xc(%esp) + // 5b: 5e popl %esi + // 5c: 5f popl %edi + // 5d: e9 00 00 00 00 jmp 0x62 <__JIT_ENTRY+0x62> + // 0000005e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[93] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x44, 0x24, 0x10, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x8b, 0x50, + 0xfc, 0x8b, 0x4c, 0x8e, 0x28, 0x89, 0x46, 0x20, + 0x8b, 0x41, 0x08, 0x89, 0x51, 0x08, 0x85, 0xc0, + 0x74, 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, + 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc0, 0xfc, 0x89, + 0x7c, 0x24, 0x14, 0x89, 0x44, 0x24, 0x10, 0x89, + 0x74, 0x24, 0x0c, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, instruction->oparg); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 74 24 10 movl 0x10(%esp), %esi + // b: 8b 4c 24 14 movl 0x14(%esp), %ecx + // f: b8 00 00 00 00 movl $0x0, %eax + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 d0 movzwl %ax, %edx + // 17: 8b 59 fc movl -0x4(%ecx), %ebx + // 1a: 83 c1 fc addl $-0x4, %ecx + // 1d: 8b 44 96 28 movl 0x28(%esi,%edx,4), %eax + // 21: 89 5c 96 28 movl %ebx, 0x28(%esi,%edx,4) + // 25: 89 4e 20 movl %ecx, 0x20(%esi) + // 28: 85 c0 testl %eax, %eax + // 2a: 74 18 je 0x44 <__JIT_ENTRY+0x44> + // 2c: 8b 08 movl (%eax), %ecx + // 2e: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 34: 7f 0e jg 0x44 <__JIT_ENTRY+0x44> + // 36: 49 decl %ecx + // 37: 89 08 movl %ecx, (%eax) + // 39: 75 09 jne 0x44 <__JIT_ENTRY+0x44> + // 3b: 50 pushl %eax + // 3c: e8 00 00 00 00 calll 0x41 <__JIT_ENTRY+0x41> + // 0000003d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 41: 83 c4 04 addl $0x4, %esp + // 44: 8b 46 20 movl 0x20(%esi), %eax + // 47: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4e: 89 7c 24 18 movl %edi, 0x18(%esp) + // 52: 89 44 24 14 movl %eax, 0x14(%esp) + // 56: 89 74 24 10 movl %esi, 0x10(%esp) + // 5a: 5e popl %esi + // 5b: 5f popl %edi + // 5c: 5b popl %ebx + // 5d: e9 00 00 00 00 jmp 0x62 <__JIT_ENTRY+0x62> + // 0000005e: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[93] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x74, 0x24, 0x10, 0x8b, 0x4c, 0x24, 0x14, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd0, 0x8b, + 0x59, 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x44, 0x96, + 0x28, 0x89, 0x5c, 0x96, 0x28, 0x89, 0x4e, 0x20, + 0x85, 0xc0, 0x74, 0x18, 0x8b, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, + 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x18, 0x89, 0x44, 0x24, 0x14, 0x89, 0x74, + 0x24, 0x10, 0x5e, 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_0.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 28 movl 0x28(%esi), %eax + // 17: 89 56 28 movl %edx, 0x28(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x28, 0x89, + 0x56, 0x28, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_1.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 2c movl 0x2c(%esi), %eax + // 17: 89 56 2c movl %edx, 0x2c(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x2c, 0x89, + 0x56, 0x2c, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_2.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 30 movl 0x30(%esi), %eax + // 17: 89 56 30 movl %edx, 0x30(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x30, 0x89, + 0x56, 0x30, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_3.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 34 movl 0x34(%esi), %eax + // 17: 89 56 34 movl %edx, 0x34(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x34, 0x89, + 0x56, 0x34, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_4.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 38 movl 0x38(%esi), %eax + // 17: 89 56 38 movl %edx, 0x38(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x38, 0x89, + 0x56, 0x38, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_5.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 3c movl 0x3c(%esi), %eax + // 17: 89 56 3c movl %edx, 0x3c(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x3c, 0x89, + 0x56, 0x3c, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_6.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 40 movl 0x40(%esi), %eax + // 17: 89 56 40 movl %edx, 0x40(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x40, 0x89, + 0x56, 0x40, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_7.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 7c 24 14 movl 0x14(%esp), %edi + // 6: 8b 74 24 0c movl 0xc(%esp), %esi + // a: 8b 4c 24 10 movl 0x10(%esp), %ecx + // e: 8b 51 fc movl -0x4(%ecx), %edx + // 11: 83 c1 fc addl $-0x4, %ecx + // 14: 8b 46 44 movl 0x44(%esi), %eax + // 17: 89 56 44 movl %edx, 0x44(%esi) + // 1a: 89 4e 20 movl %ecx, 0x20(%esi) + // 1d: 85 c0 testl %eax, %eax + // 1f: 74 18 je 0x39 <__JIT_ENTRY+0x39> + // 21: 8b 08 movl (%eax), %ecx + // 23: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 29: 7f 0e jg 0x39 <__JIT_ENTRY+0x39> + // 2b: 49 decl %ecx + // 2c: 89 08 movl %ecx, (%eax) + // 2e: 75 09 jne 0x39 <__JIT_ENTRY+0x39> + // 30: 50 pushl %eax + // 31: e8 00 00 00 00 calll 0x36 <__JIT_ENTRY+0x36> + // 00000032: IMAGE_REL_I386_REL32 __Py_Dealloc + // 36: 83 c4 04 addl $0x4, %esp + // 39: 8b 46 20 movl 0x20(%esi), %eax + // 3c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 43: 89 7c 24 14 movl %edi, 0x14(%esp) + // 47: 89 44 24 10 movl %eax, 0x10(%esp) + // 4b: 89 74 24 0c movl %esi, 0xc(%esp) + // 4f: 5e popl %esi + // 50: 5f popl %edi + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[81] = { + 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x14, 0x8b, 0x74, + 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x51, + 0xfc, 0x83, 0xc1, 0xfc, 0x8b, 0x46, 0x44, 0x89, + 0x56, 0x44, 0x89, 0x4e, 0x20, 0x85, 0xc0, 0x74, + 0x18, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, + 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x46, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x7c, 0x24, 0x14, 0x89, + 0x44, 0x24, 0x10, 0x89, 0x74, 0x24, 0x0c, 0x5e, + 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_GLOBAL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: b9 00 00 00 00 movl $0x0, %ecx + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c9 movzwl %cx, %ecx + // 18: 8b 58 fc movl -0x4(%eax), %ebx + // 1b: 8b 16 movl (%esi), %edx + // 1d: 8b 6e 0c movl 0xc(%esi), %ebp + // 20: 8b 52 10 movl 0x10(%edx), %edx + // 23: 8b 4c 8a 0c movl 0xc(%edx,%ecx,4), %ecx + // 27: 89 46 20 movl %eax, 0x20(%esi) + // 2a: 53 pushl %ebx + // 2b: 51 pushl %ecx + // 2c: 55 pushl %ebp + // 2d: e8 00 00 00 00 calll 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 _PyDict_SetItem + // 32: 83 c4 0c addl $0xc, %esp + // 35: 8b 6e 20 movl 0x20(%esi), %ebp + // 38: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3f: 8b 0b movl (%ebx), %ecx + // 41: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 47: 7f 05 jg 0x4e <__JIT_ENTRY+0x4e> + // 49: 49 decl %ecx + // 4a: 89 0b movl %ecx, (%ebx) + // 4c: 74 1c je 0x6a <__JIT_ENTRY+0x6a> + // 4e: 83 c5 fc addl $-0x4, %ebp + // 51: 85 c0 testl %eax, %eax + // 53: 74 29 je 0x7e <__JIT_ENTRY+0x7e> + // 55: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 59: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 5d: 89 74 24 14 movl %esi, 0x14(%esp) + // 61: 5e popl %esi + // 62: 5f popl %edi + // 63: 5b popl %ebx + // 64: 5d popl %ebp + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 00000066: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 6a: 53 pushl %ebx + // 6b: 89 c3 movl %eax, %ebx + // 6d: e8 00 00 00 00 calll 0x72 <__JIT_ENTRY+0x72> + // 0000006e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 72: 89 d8 movl %ebx, %eax + // 74: 83 c4 04 addl $0x4, %esp + // 77: 83 c5 fc addl $-0x4, %ebp + // 7a: 85 c0 testl %eax, %eax + // 7c: 75 d7 jne 0x55 <__JIT_ENTRY+0x55> + // 7e: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 82: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 86: 89 74 24 14 movl %esi, 0x14(%esp) + // 8a: 5e popl %esi + // 8b: 5f popl %edi + // 8c: 5b popl %ebx + // 8d: 5d popl %ebp + // 8e: e9 00 00 00 00 jmp 0x93 <__JIT_ENTRY+0x93> + // 0000008f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[142] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, + 0x8b, 0x58, 0xfc, 0x8b, 0x16, 0x8b, 0x6e, 0x0c, + 0x8b, 0x52, 0x10, 0x8b, 0x4c, 0x8a, 0x0c, 0x89, + 0x46, 0x20, 0x53, 0x51, 0x55, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x6e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x05, 0x49, 0x89, 0x0b, 0x74, 0x1c, 0x83, 0xc5, + 0xfc, 0x85, 0xc0, 0x74, 0x29, 0x89, 0x7c, 0x24, + 0x1c, 0x89, 0x6c, 0x24, 0x18, 0x89, 0x74, 0x24, + 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x83, + 0xc5, 0xfc, 0x85, 0xc0, 0x75, 0xd7, 0x89, 0x7c, + 0x24, 0x1c, 0x89, 0x6c, 0x24, 0x18, 0x89, 0x74, + 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)&PyDict_SetItem + -0x4); + patch_x86_64_32rx(code + 0x66, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_NAME.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 54 24 18 movl 0x18(%esp), %edx + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: b8 00 00 00 00 movl $0x0, %eax + // 00000011: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 15: 0f b7 c8 movzwl %ax, %ecx + // 18: 8b 5a fc movl -0x4(%edx), %ebx + // 1b: 8b 2e movl (%esi), %ebp + // 1d: 8b 46 14 movl 0x14(%esi), %eax + // 20: 8b 6d 10 movl 0x10(%ebp), %ebp + // 23: 8b 4c 8d 0c movl 0xc(%ebp,%ecx,4), %ecx + // 27: 85 c0 testl %eax, %eax + // 29: 74 16 je 0x41 <__JIT_ENTRY+0x41> + // 2b: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 0000002e: IMAGE_REL_I386_DIR32 _PyDict_Type + // 32: 89 56 20 movl %edx, 0x20(%esi) + // 35: 74 54 je 0x8b <__JIT_ENTRY+0x8b> + // 37: 53 pushl %ebx + // 38: 51 pushl %ecx + // 39: 50 pushl %eax + // 3a: e8 00 00 00 00 calll 0x3f <__JIT_ENTRY+0x3f> + // 0000003b: IMAGE_REL_I386_REL32 _PyObject_SetItem + // 3f: eb 52 jmp 0x93 <__JIT_ENTRY+0x93> + // 41: 89 56 20 movl %edx, 0x20(%esi) + // 44: 51 pushl %ecx + // 45: 68 00 00 00 00 pushl $0x0 + // 00000046: IMAGE_REL_I386_DIR32 ??_C@_0CA@PHPKHPGD@no?5locals?5found?5when?5storing?5?$CFR?$AA@ + // 4a: ff 35 00 00 00 00 pushl 0x0 + // 0000004c: IMAGE_REL_I386_DIR32 _PyExc_SystemError + // 50: 57 pushl %edi + // 51: e8 00 00 00 00 calll 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __PyErr_Format + // 56: 83 c4 10 addl $0x10, %esp + // 59: 8b 6e 20 movl 0x20(%esi), %ebp + // 5c: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 63: 8b 03 movl (%ebx), %eax + // 65: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 6a: 7f 0e jg 0x7a <__JIT_ENTRY+0x7a> + // 6c: 48 decl %eax + // 6d: 89 03 movl %eax, (%ebx) + // 6f: 75 09 jne 0x7a <__JIT_ENTRY+0x7a> + // 71: 53 pushl %ebx + // 72: e8 00 00 00 00 calll 0x77 <__JIT_ENTRY+0x77> + // 00000073: IMAGE_REL_I386_REL32 __Py_Dealloc + // 77: 83 c4 04 addl $0x4, %esp + // 7a: 83 c5 fc addl $-0x4, %ebp + // 7d: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 81: 89 74 24 14 movl %esi, 0x14(%esp) + // 85: 89 6c 24 18 movl %ebp, 0x18(%esp) + // 89: eb 37 jmp 0xc2 <__JIT_ENTRY+0xc2> + // 8b: 53 pushl %ebx + // 8c: 51 pushl %ecx + // 8d: 50 pushl %eax + // 8e: e8 00 00 00 00 calll 0x93 <__JIT_ENTRY+0x93> + // 0000008f: IMAGE_REL_I386_REL32 _PyDict_SetItem + // 93: 83 c4 0c addl $0xc, %esp + // 96: 8b 6e 20 movl 0x20(%esi), %ebp + // 99: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // a0: 8b 0b movl (%ebx), %ecx + // a2: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a8: 7f 05 jg 0xaf <__JIT_ENTRY+0xaf> + // aa: 49 decl %ecx + // ab: 89 0b movl %ecx, (%ebx) + // ad: 74 1c je 0xcb <__JIT_ENTRY+0xcb> + // af: 83 c5 fc addl $-0x4, %ebp + // b2: 85 c0 testl %eax, %eax + // b4: 74 29 je 0xdf <__JIT_ENTRY+0xdf> + // b6: 89 7c 24 1c movl %edi, 0x1c(%esp) + // ba: 89 6c 24 18 movl %ebp, 0x18(%esp) + // be: 89 74 24 14 movl %esi, 0x14(%esp) + // c2: 5e popl %esi + // c3: 5f popl %edi + // c4: 5b popl %ebx + // c5: 5d popl %ebp + // c6: e9 00 00 00 00 jmp 0xcb <__JIT_ENTRY+0xcb> + // 000000c7: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // cb: 53 pushl %ebx + // cc: 89 c3 movl %eax, %ebx + // ce: e8 00 00 00 00 calll 0xd3 <__JIT_ENTRY+0xd3> + // 000000cf: IMAGE_REL_I386_REL32 __Py_Dealloc + // d3: 89 d8 movl %ebx, %eax + // d5: 83 c4 04 addl $0x4, %esp + // d8: 83 c5 fc addl $-0x4, %ebp + // db: 85 c0 testl %eax, %eax + // dd: 75 d7 jne 0xb6 <__JIT_ENTRY+0xb6> + // df: 89 7c 24 1c movl %edi, 0x1c(%esp) + // e3: 89 6c 24 18 movl %ebp, 0x18(%esp) + // e7: 89 74 24 14 movl %esi, 0x14(%esp) + // eb: 5e popl %esi + // ec: 5f popl %edi + // ed: 5b popl %ebx + // ee: 5d popl %ebp + // ef: e9 00 00 00 00 jmp 0xf4 <__JIT_ENTRY+0xf4> + // 000000f0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[239] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x54, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc8, + 0x8b, 0x5a, 0xfc, 0x8b, 0x2e, 0x8b, 0x46, 0x14, + 0x8b, 0x6d, 0x10, 0x8b, 0x4c, 0x8d, 0x0c, 0x85, + 0xc0, 0x74, 0x16, 0x81, 0x78, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x89, 0x56, 0x20, 0x74, 0x54, 0x53, + 0x51, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x52, 0x89, 0x56, 0x20, 0x51, 0x68, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x57, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x10, 0x8b, 0x6e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x3d, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, 0x03, 0x75, + 0x09, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x83, 0xc5, 0xfc, 0x89, 0x7c, 0x24, + 0x1c, 0x89, 0x74, 0x24, 0x14, 0x89, 0x6c, 0x24, + 0x18, 0xeb, 0x37, 0x53, 0x51, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x6e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x05, 0x49, 0x89, 0x0b, 0x74, 0x1c, 0x83, + 0xc5, 0xfc, 0x85, 0xc0, 0x74, 0x29, 0x89, 0x7c, + 0x24, 0x1c, 0x89, 0x6c, 0x24, 0x18, 0x89, 0x74, + 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x53, 0x89, 0xc3, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x83, 0xc4, 0x04, + 0x83, 0xc5, 0xfc, 0x85, 0xc0, 0x75, 0xd7, 0x89, + 0x7c, 0x24, 0x1c, 0x89, 0x6c, 0x24, 0x18, 0x89, + 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + // 0: 'no locals found when storing %R\x00' + const unsigned char data_body[32] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x52, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, instruction->oparg); + patch_32(code + 0x2e, (uintptr_t)&PyDict_Type); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)&PyObject_SetItem + -0x4); + patch_32(code + 0x46, (uintptr_t)data); + patch_32(code + 0x4c, (uintptr_t)&PyExc_SystemError); + patch_x86_64_32rx(code + 0x52, (uintptr_t)&_PyErr_Format + -0x4); + patch_x86_64_32rx(code + 0x73, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)&PyDict_SetItem + -0x4); + patch_x86_64_32rx(code + 0xc7, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xcf, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SLICE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 10 subl $0x10, %esp + // 7: 8b 44 24 2c movl 0x2c(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 74 24 24 movl 0x24(%esp), %esi + // 12: 8b 44 24 28 movl 0x28(%esp), %eax + // 16: 8b 48 fc movl -0x4(%eax), %ecx + // 19: 8b 50 f8 movl -0x8(%eax), %edx + // 1c: 8b 78 f0 movl -0x10(%eax), %edi + // 1f: 8b 58 f4 movl -0xc(%eax), %ebx + // 22: 89 46 20 movl %eax, 0x20(%esi) + // 25: 51 pushl %ecx + // 26: 52 pushl %edx + // 27: e8 00 00 00 00 calll 0x2c <__JIT_ENTRY+0x2c> + // 00000028: IMAGE_REL_I386_REL32 __PyBuildSlice_ConsumeRefs + // 2c: 89 f2 movl %esi, %edx + // 2e: 83 c4 08 addl $0x8, %esp + // 31: 8b 6e 20 movl 0x20(%esi), %ebp + // 34: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3b: 85 c0 testl %eax, %eax + // 3d: 89 5c 24 0c movl %ebx, 0xc(%esp) + // 41: 89 7c 24 08 movl %edi, 0x8(%esp) + // 45: 74 4b je 0x92 <__JIT_ENTRY+0x92> + // 47: 89 c6 movl %eax, %esi + // 49: 83 c5 f8 addl $-0x8, %ebp + // 4c: 89 54 24 04 movl %edx, 0x4(%esp) + // 50: 89 6a 20 movl %ebp, 0x20(%edx) + // 53: 57 pushl %edi + // 54: 50 pushl %eax + // 55: 53 pushl %ebx + // 56: e8 00 00 00 00 calll 0x5b <__JIT_ENTRY+0x5b> + // 00000057: IMAGE_REL_I386_REL32 _PyObject_SetItem + // 5b: 83 c4 0c addl $0xc, %esp + // 5e: 8b 0e movl (%esi), %ecx + // 60: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 66: 7f 12 jg 0x7a <__JIT_ENTRY+0x7a> + // 68: 49 decl %ecx + // 69: 89 0e movl %ecx, (%esi) + // 6b: 75 0d jne 0x7a <__JIT_ENTRY+0x7a> + // 6d: 56 pushl %esi + // 6e: 89 c6 movl %eax, %esi + // 70: e8 00 00 00 00 calll 0x75 <__JIT_ENTRY+0x75> + // 00000071: IMAGE_REL_I386_REL32 __Py_Dealloc + // 75: 89 f0 movl %esi, %eax + // 77: 83 c4 04 addl $0x4, %esp + // 7a: 8b 54 24 04 movl 0x4(%esp), %edx + // 7e: 8b 6a 20 movl 0x20(%edx), %ebp + // 81: c7 42 20 00 00 00 00 movl $0x0, 0x20(%edx) + // 88: 83 c5 08 addl $0x8, %ebp + // 8b: 85 c0 testl %eax, %eax + // 8d: 0f 94 c3 sete %bl + // 90: eb 02 jmp 0x94 <__JIT_ENTRY+0x94> + // 92: 31 db xorl %ebx, %ebx + // 94: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 98: 8b 01 movl (%ecx), %eax + // 9a: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 9f: 8b 74 24 0c movl 0xc(%esp), %esi + // a3: 7f 05 jg 0xaa <__JIT_ENTRY+0xaa> + // a5: 48 decl %eax + // a6: 89 01 movl %eax, (%ecx) + // a8: 74 1d je 0xc7 <__JIT_ENTRY+0xc7> + // aa: 8b 06 movl (%esi), %eax + // ac: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // b1: 7f 2a jg 0xdd <__JIT_ENTRY+0xdd> + // b3: 48 decl %eax + // b4: 89 06 movl %eax, (%esi) + // b6: 75 25 jne 0xdd <__JIT_ENTRY+0xdd> + // b8: 56 pushl %esi + // b9: 89 d6 movl %edx, %esi + // bb: e8 00 00 00 00 calll 0xc0 <__JIT_ENTRY+0xc0> + // 000000bc: IMAGE_REL_I386_REL32 __Py_Dealloc + // c0: 89 f2 movl %esi, %edx + // c2: 83 c4 04 addl $0x4, %esp + // c5: eb 16 jmp 0xdd <__JIT_ENTRY+0xdd> + // c7: 51 pushl %ecx + // c8: 89 d7 movl %edx, %edi + // ca: e8 00 00 00 00 calll 0xcf <__JIT_ENTRY+0xcf> + // 000000cb: IMAGE_REL_I386_REL32 __Py_Dealloc + // cf: 89 fa movl %edi, %edx + // d1: 83 c4 04 addl $0x4, %esp + // d4: 8b 06 movl (%esi), %eax + // d6: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // db: 7e d6 jle 0xb3 <__JIT_ENTRY+0xb3> + // dd: 83 c5 f0 addl $-0x10, %ebp + // e0: 84 db testb %bl, %bl + // e2: 74 1b je 0xff <__JIT_ENTRY+0xff> + // e4: 8b 04 24 movl (%esp), %eax + // e7: 89 44 24 2c movl %eax, 0x2c(%esp) + // eb: 89 6c 24 28 movl %ebp, 0x28(%esp) + // ef: 89 54 24 24 movl %edx, 0x24(%esp) + // f3: 83 c4 10 addl $0x10, %esp + // f6: 5e popl %esi + // f7: 5f popl %edi + // f8: 5b popl %ebx + // f9: 5d popl %ebp + // fa: e9 00 00 00 00 jmp 0xff <__JIT_ENTRY+0xff> + // 000000fb: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // ff: 8b 04 24 movl (%esp), %eax + // 102: 89 44 24 2c movl %eax, 0x2c(%esp) + // 106: 89 6c 24 28 movl %ebp, 0x28(%esp) + // 10a: 89 54 24 24 movl %edx, 0x24(%esp) + // 10e: 83 c4 10 addl $0x10, %esp + // 111: 5e popl %esi + // 112: 5f popl %edi + // 113: 5b popl %ebx + // 114: 5d popl %ebp + // 115: e9 00 00 00 00 jmp 0x11a <__JIT_ENTRY+0x11a> + // 00000116: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[282] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x10, 0x8b, + 0x44, 0x24, 0x2c, 0x89, 0x04, 0x24, 0x8b, 0x74, + 0x24, 0x24, 0x8b, 0x44, 0x24, 0x28, 0x8b, 0x48, + 0xfc, 0x8b, 0x50, 0xf8, 0x8b, 0x78, 0xf0, 0x8b, + 0x58, 0xf4, 0x89, 0x46, 0x20, 0x51, 0x52, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf2, 0x83, 0xc4, + 0x08, 0x8b, 0x6e, 0x20, 0xc7, 0x46, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x89, 0x5c, 0x24, + 0x0c, 0x89, 0x7c, 0x24, 0x08, 0x74, 0x4b, 0x89, + 0xc6, 0x83, 0xc5, 0xf8, 0x89, 0x54, 0x24, 0x04, + 0x89, 0x6a, 0x20, 0x57, 0x50, 0x53, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x0c, 0x8b, 0x0e, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x12, + 0x49, 0x89, 0x0e, 0x75, 0x0d, 0x56, 0x89, 0xc6, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, + 0xc4, 0x04, 0x8b, 0x54, 0x24, 0x04, 0x8b, 0x6a, + 0x20, 0xc7, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc5, 0x08, 0x85, 0xc0, 0x0f, 0x94, 0xc3, + 0xeb, 0x02, 0x31, 0xdb, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x01, 0x3d, 0xff, 0xff, 0xff, 0x3f, 0x8b, + 0x74, 0x24, 0x0c, 0x7f, 0x05, 0x48, 0x89, 0x01, + 0x74, 0x1d, 0x8b, 0x06, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x2a, 0x48, 0x89, 0x06, 0x75, 0x25, + 0x56, 0x89, 0xd6, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xf2, 0x83, 0xc4, 0x04, 0xeb, 0x16, 0x51, + 0x89, 0xd7, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xfa, 0x83, 0xc4, 0x04, 0x8b, 0x06, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7e, 0xd6, 0x83, 0xc5, 0xf0, + 0x84, 0xdb, 0x74, 0x1b, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x2c, 0x89, 0x6c, 0x24, 0x28, 0x89, + 0x54, 0x24, 0x24, 0x83, 0xc4, 0x10, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x04, 0x24, 0x89, 0x44, 0x24, 0x2c, 0x89, 0x6c, + 0x24, 0x28, 0x89, 0x54, 0x24, 0x24, 0x83, 0xc4, + 0x10, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x28, (uintptr_t)&_PyBuildSlice_ConsumeRefs + -0x4); + patch_x86_64_32rx(code + 0x57, (uintptr_t)&PyObject_SetItem + -0x4); + patch_x86_64_32rx(code + 0x71, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xbc, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x116, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__STORE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 44 24 24 movl 0x24(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 12: 8b 44 24 20 movl 0x20(%esp), %eax + // 16: 8b 48 fc movl -0x4(%eax), %ecx + // 19: 8b 58 f4 movl -0xc(%eax), %ebx + // 1c: 8b 70 f8 movl -0x8(%eax), %esi + // 1f: 89 47 20 movl %eax, 0x20(%edi) + // 22: 53 pushl %ebx + // 23: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 27: 51 pushl %ecx + // 28: 56 pushl %esi + // 29: e8 00 00 00 00 calll 0x2e <__JIT_ENTRY+0x2e> + // 0000002a: IMAGE_REL_I386_REL32 _PyObject_SetItem + // 2e: 83 c4 0c addl $0xc, %esp + // 31: 8b 6f 20 movl 0x20(%edi), %ebp + // 34: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // 3b: 8b 0b movl (%ebx), %ecx + // 3d: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 43: 7f 05 jg 0x4a <__JIT_ENTRY+0x4a> + // 45: 49 decl %ecx + // 46: 89 0b movl %ecx, (%ebx) + // 48: 74 1e je 0x68 <__JIT_ENTRY+0x68> + // 4a: 8b 0e movl (%esi), %ecx + // 4c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 52: 7f 2b jg 0x7f <__JIT_ENTRY+0x7f> + // 54: 49 decl %ecx + // 55: 89 0e movl %ecx, (%esi) + // 57: 75 26 jne 0x7f <__JIT_ENTRY+0x7f> + // 59: 56 pushl %esi + // 5a: 89 c6 movl %eax, %esi + // 5c: e8 00 00 00 00 calll 0x61 <__JIT_ENTRY+0x61> + // 0000005d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 61: 89 f0 movl %esi, %eax + // 63: 83 c4 04 addl $0x4, %esp + // 66: eb 17 jmp 0x7f <__JIT_ENTRY+0x7f> + // 68: 53 pushl %ebx + // 69: 89 c3 movl %eax, %ebx + // 6b: e8 00 00 00 00 calll 0x70 <__JIT_ENTRY+0x70> + // 0000006c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 70: 89 d8 movl %ebx, %eax + // 72: 83 c4 04 addl $0x4, %esp + // 75: 8b 0e movl (%esi), %ecx + // 77: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 7d: 7e d5 jle 0x54 <__JIT_ENTRY+0x54> + // 7f: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 83: 8b 11 movl (%ecx), %edx + // 85: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 8b: 7f 05 jg 0x92 <__JIT_ENTRY+0x92> + // 8d: 4a decl %edx + // 8e: 89 11 movl %edx, (%ecx) + // 90: 74 22 je 0xb4 <__JIT_ENTRY+0xb4> + // 92: 83 c5 f4 addl $-0xc, %ebp + // 95: 85 c0 testl %eax, %eax + // 97: 74 2f je 0xc8 <__JIT_ENTRY+0xc8> + // 99: 8b 04 24 movl (%esp), %eax + // 9c: 89 44 24 24 movl %eax, 0x24(%esp) + // a0: 89 6c 24 20 movl %ebp, 0x20(%esp) + // a4: 89 7c 24 1c movl %edi, 0x1c(%esp) + // a8: 83 c4 08 addl $0x8, %esp + // ab: 5e popl %esi + // ac: 5f popl %edi + // ad: 5b popl %ebx + // ae: 5d popl %ebp + // af: e9 00 00 00 00 jmp 0xb4 <__JIT_ENTRY+0xb4> + // 000000b0: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // b4: 51 pushl %ecx + // b5: 89 c6 movl %eax, %esi + // b7: e8 00 00 00 00 calll 0xbc <__JIT_ENTRY+0xbc> + // 000000b8: IMAGE_REL_I386_REL32 __Py_Dealloc + // bc: 89 f0 movl %esi, %eax + // be: 83 c4 04 addl $0x4, %esp + // c1: 83 c5 f4 addl $-0xc, %ebp + // c4: 85 c0 testl %eax, %eax + // c6: 75 d1 jne 0x99 <__JIT_ENTRY+0x99> + // c8: 8b 04 24 movl (%esp), %eax + // cb: 89 44 24 24 movl %eax, 0x24(%esp) + // cf: 89 6c 24 20 movl %ebp, 0x20(%esp) + // d3: 89 7c 24 1c movl %edi, 0x1c(%esp) + // d7: 83 c4 08 addl $0x8, %esp + // da: 5e popl %esi + // db: 5f popl %edi + // dc: 5b popl %ebx + // dd: 5d popl %ebp + // de: e9 00 00 00 00 jmp 0xe3 <__JIT_ENTRY+0xe3> + // 000000df: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[222] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x44, 0x24, 0x24, 0x89, 0x04, 0x24, 0x8b, 0x7c, + 0x24, 0x1c, 0x8b, 0x44, 0x24, 0x20, 0x8b, 0x48, + 0xfc, 0x8b, 0x58, 0xf4, 0x8b, 0x70, 0xf8, 0x89, + 0x47, 0x20, 0x53, 0x89, 0x4c, 0x24, 0x08, 0x51, + 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x0c, 0x8b, 0x6f, 0x20, 0xc7, 0x47, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x81, 0xf9, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x49, 0x89, 0x0b, + 0x74, 0x1e, 0x8b, 0x0e, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x2b, 0x49, 0x89, 0x0e, 0x75, + 0x26, 0x56, 0x89, 0xc6, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xf0, 0x83, 0xc4, 0x04, 0xeb, 0x17, + 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, 0x0e, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, 0xd5, 0x8b, + 0x4c, 0x24, 0x04, 0x8b, 0x11, 0x81, 0xfa, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x05, 0x4a, 0x89, 0x11, + 0x74, 0x22, 0x83, 0xc5, 0xf4, 0x85, 0xc0, 0x74, + 0x2f, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, + 0x89, 0x6c, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x1c, + 0x83, 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x89, 0xc6, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x83, 0xc4, + 0x04, 0x83, 0xc5, 0xf4, 0x85, 0xc0, 0x75, 0xd1, + 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x24, 0x89, + 0x6c, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x1c, 0x83, + 0xc4, 0x08, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)&PyObject_SetItem + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xb0, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_DICT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 7c 24 18 movl 0x18(%esp), %edi + // 7: 8b 44 24 14 movl 0x14(%esp), %eax + // b: 8b 74 24 10 movl 0x10(%esp), %esi + // f: 8b 58 f8 movl -0x8(%eax), %ebx + // 12: 81 7b 04 00 00 00 00 cmpl $0x0, 0x4(%ebx) + // 00000015: IMAGE_REL_I386_DIR32 _PyDict_Type + // 19: 74 14 je 0x2f <__JIT_ENTRY+0x2f> + // 1b: 89 7c 24 18 movl %edi, 0x18(%esp) + // 1f: 89 44 24 14 movl %eax, 0x14(%esp) + // 23: 89 74 24 10 movl %esi, 0x10(%esp) + // 27: 5e popl %esi + // 28: 5f popl %edi + // 29: 5b popl %ebx + // 2a: e9 00 00 00 00 jmp 0x2f <__JIT_ENTRY+0x2f> + // 0000002b: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2f: 8b 48 f4 movl -0xc(%eax), %ecx + // 32: 8b 50 fc movl -0x4(%eax), %edx + // 35: 89 46 20 movl %eax, 0x20(%esi) + // 38: 51 pushl %ecx + // 39: 52 pushl %edx + // 3a: 53 pushl %ebx + // 3b: e8 00 00 00 00 calll 0x40 <__JIT_ENTRY+0x40> + // 0000003c: IMAGE_REL_I386_REL32 __PyDict_SetItem_Take2 + // 40: 83 c4 0c addl $0xc, %esp + // 43: 83 46 20 f4 addl $-0xc, 0x20(%esi) + // 47: 8b 0b movl (%ebx), %ecx + // 49: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4f: 7f 05 jg 0x56 <__JIT_ENTRY+0x56> + // 51: 49 decl %ecx + // 52: 89 0b movl %ecx, (%ebx) + // 54: 74 22 je 0x78 <__JIT_ENTRY+0x78> + // 56: 8b 4e 20 movl 0x20(%esi), %ecx + // 59: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 60: 85 c0 testl %eax, %eax + // 62: 74 2f je 0x93 <__JIT_ENTRY+0x93> + // 64: 89 7c 24 18 movl %edi, 0x18(%esp) + // 68: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 6c: 89 74 24 10 movl %esi, 0x10(%esp) + // 70: 5e popl %esi + // 71: 5f popl %edi + // 72: 5b popl %ebx + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 00000074: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + // 78: 53 pushl %ebx + // 79: 89 c3 movl %eax, %ebx + // 7b: e8 00 00 00 00 calll 0x80 <__JIT_ENTRY+0x80> + // 0000007c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 80: 89 d8 movl %ebx, %eax + // 82: 83 c4 04 addl $0x4, %esp + // 85: 8b 4e 20 movl 0x20(%esi), %ecx + // 88: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 8f: 85 c0 testl %eax, %eax + // 91: 75 d1 jne 0x64 <__JIT_ENTRY+0x64> + // 93: 89 7c 24 18 movl %edi, 0x18(%esp) + // 97: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 9b: 89 74 24 10 movl %esi, 0x10(%esp) + // 9f: 5e popl %esi + // a0: 5f popl %edi + // a1: 5b popl %ebx + // a2: e9 00 00 00 00 jmp 0xa7 <__JIT_ENTRY+0xa7> + // 000000a3: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[162] = { + 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x18, 0x8b, + 0x44, 0x24, 0x14, 0x8b, 0x74, 0x24, 0x10, 0x8b, + 0x58, 0xf8, 0x81, 0x7b, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x14, 0x89, 0x7c, 0x24, 0x18, 0x89, + 0x44, 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, + 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x48, 0xf4, 0x8b, 0x50, 0xfc, 0x89, 0x46, 0x20, + 0x51, 0x52, 0x53, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x0c, 0x83, 0x46, 0x20, 0xf4, 0x8b, + 0x0b, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x05, 0x49, 0x89, 0x0b, 0x74, 0x22, 0x8b, 0x4e, + 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x2f, 0x89, 0x7c, 0x24, 0x18, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, + 0x5e, 0x5f, 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, 0x4e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x75, 0xd1, 0x89, 0x7c, 0x24, 0x18, 0x89, + 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, 0x10, 0x5e, + 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x15, (uintptr_t)&PyDict_Type); + patch_x86_64_32rx(code + 0x2b, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)&_PyDict_SetItem_Take2 + -0x4); + patch_x86_64_32rx(code + 0x74, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__STORE_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_LIST_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 7c 24 28 movl 0x28(%esp), %edi + // b: 8b 5c 24 24 movl 0x24(%esp), %ebx + // f: 8b 74 24 20 movl 0x20(%esp), %esi + // 13: 8b 6b fc movl -0x4(%ebx), %ebp + // 16: 81 7d 04 00 00 00 00 cmpl $0x0, 0x4(%ebp) + // 00000019: IMAGE_REL_I386_DIR32 _PyLong_Type + // 1d: 0f 85 d3 00 00 00 jne 0xf6 <__JIT_ENTRY+0xf6> + // 23: 8b 53 f8 movl -0x8(%ebx), %edx + // 26: 81 7a 04 00 00 00 00 cmpl $0x0, 0x4(%edx) + // 00000029: IMAGE_REL_I386_DIR32 _PyList_Type + // 2d: 0f 85 c3 00 00 00 jne 0xf6 <__JIT_ENTRY+0xf6> + // 33: 8b 45 08 movl 0x8(%ebp), %eax + // 36: 83 e0 fb andl $-0x5, %eax + // 39: 83 f8 09 cmpl $0x9, %eax + // 3c: 0f 83 b4 00 00 00 jae 0xf6 <__JIT_ENTRY+0xf6> + // 42: 8b 45 0c movl 0xc(%ebp), %eax + // 45: 3b 42 08 cmpl 0x8(%edx), %eax + // 48: 0f 8d a8 00 00 00 jge 0xf6 <__JIT_ENTRY+0xf6> + // 4e: 8b 4b f4 movl -0xc(%ebx), %ecx + // 51: 89 0c 24 movl %ecx, (%esp) + // 54: 83 c3 f4 addl $-0xc, %ebx + // 57: 89 54 24 08 movl %edx, 0x8(%esp) + // 5b: 8b 52 0c movl 0xc(%edx), %edx + // 5e: 8b 0c 82 movl (%edx,%eax,4), %ecx + // 61: 89 4c 24 04 movl %ecx, 0x4(%esp) + // 65: 8b 0c 24 movl (%esp), %ecx + // 68: 89 0c 82 movl %ecx, (%edx,%eax,4) + // 6b: 8b 45 00 movl (%ebp), %eax + // 6e: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // 73: 7f 26 jg 0x9b <__JIT_ENTRY+0x9b> + // 75: 48 decl %eax + // 76: 89 45 00 movl %eax, (%ebp) + // 79: 75 20 jne 0x9b <__JIT_ENTRY+0x9b> + // 7b: a1 50 14 00 00 movl 0x1450, %eax + // 0000007c: IMAGE_REL_I386_DIR32 __PyRuntime + // 80: 85 c0 testl %eax, %eax + // 82: 74 0e je 0x92 <__JIT_ENTRY+0x92> + // 84: ff 35 54 14 00 00 pushl 0x1454 + // 00000086: IMAGE_REL_I386_DIR32 __PyRuntime + // 8a: 6a 01 pushl $0x1 + // 8c: 55 pushl %ebp + // 8d: ff d0 calll *%eax + // 8f: 83 c4 0c addl $0xc, %esp + // 92: 55 pushl %ebp + // 93: e8 00 00 00 00 calll 0x98 <__JIT_ENTRY+0x98> + // 00000094: IMAGE_REL_I386_REL32 __PyLong_ExactDealloc + // 98: 83 c4 04 addl $0x4, %esp + // 9b: 89 5e 20 movl %ebx, 0x20(%esi) + // 9e: 8b 4c 24 08 movl 0x8(%esp), %ecx + // a2: 8b 01 movl (%ecx), %eax + // a4: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // a9: 7f 0e jg 0xb9 <__JIT_ENTRY+0xb9> + // ab: 48 decl %eax + // ac: 89 01 movl %eax, (%ecx) + // ae: 75 09 jne 0xb9 <__JIT_ENTRY+0xb9> + // b0: 51 pushl %ecx + // b1: e8 00 00 00 00 calll 0xb6 <__JIT_ENTRY+0xb6> + // 000000b2: IMAGE_REL_I386_REL32 __Py_Dealloc + // b6: 83 c4 04 addl $0x4, %esp + // b9: 8b 4c 24 04 movl 0x4(%esp), %ecx + // bd: 8b 01 movl (%ecx), %eax + // bf: 3d ff ff ff 3f cmpl $0x3fffffff, %eax # imm = 0x3FFFFFFF + // c4: 7f 0e jg 0xd4 <__JIT_ENTRY+0xd4> + // c6: 48 decl %eax + // c7: 89 01 movl %eax, (%ecx) + // c9: 75 09 jne 0xd4 <__JIT_ENTRY+0xd4> + // cb: 51 pushl %ecx + // cc: e8 00 00 00 00 calll 0xd1 <__JIT_ENTRY+0xd1> + // 000000cd: IMAGE_REL_I386_REL32 __Py_Dealloc + // d1: 83 c4 04 addl $0x4, %esp + // d4: 8b 46 20 movl 0x20(%esi), %eax + // d7: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // de: 89 7c 24 28 movl %edi, 0x28(%esp) + // e2: 89 44 24 24 movl %eax, 0x24(%esp) + // e6: 89 74 24 20 movl %esi, 0x20(%esp) + // ea: 83 c4 0c addl $0xc, %esp + // ed: 5e popl %esi + // ee: 5f popl %edi + // ef: 5b popl %ebx + // f0: 5d popl %ebp + // f1: e9 00 00 00 00 jmp 0xf6 <__JIT_ENTRY+0xf6> + // 000000f2: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // f6: 89 7c 24 28 movl %edi, 0x28(%esp) + // fa: 89 5c 24 24 movl %ebx, 0x24(%esp) + // fe: 89 74 24 20 movl %esi, 0x20(%esp) + // 102: 83 c4 0c addl $0xc, %esp + // 105: 5e popl %esi + // 106: 5f popl %edi + // 107: 5b popl %ebx + // 108: 5d popl %ebp + // 109: e9 00 00 00 00 jmp 0x10e <__JIT_ENTRY+0x10e> + // 0000010a: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + const unsigned char code_body[270] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x7c, 0x24, 0x28, 0x8b, 0x5c, 0x24, 0x24, 0x8b, + 0x74, 0x24, 0x20, 0x8b, 0x6b, 0xfc, 0x81, 0x7d, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xd3, + 0x00, 0x00, 0x00, 0x8b, 0x53, 0xf8, 0x81, 0x7a, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xc3, + 0x00, 0x00, 0x00, 0x8b, 0x45, 0x08, 0x83, 0xe0, + 0xfb, 0x83, 0xf8, 0x09, 0x0f, 0x83, 0xb4, 0x00, + 0x00, 0x00, 0x8b, 0x45, 0x0c, 0x3b, 0x42, 0x08, + 0x0f, 0x8d, 0xa8, 0x00, 0x00, 0x00, 0x8b, 0x4b, + 0xf4, 0x89, 0x0c, 0x24, 0x83, 0xc3, 0xf4, 0x89, + 0x54, 0x24, 0x08, 0x8b, 0x52, 0x0c, 0x8b, 0x0c, + 0x82, 0x89, 0x4c, 0x24, 0x04, 0x8b, 0x0c, 0x24, + 0x89, 0x0c, 0x82, 0x8b, 0x45, 0x00, 0x3d, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x26, 0x48, 0x89, 0x45, + 0x00, 0x75, 0x20, 0xa1, 0x50, 0x14, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x0e, 0xff, 0x35, 0x54, 0x14, + 0x00, 0x00, 0x6a, 0x01, 0x55, 0xff, 0xd0, 0x83, + 0xc4, 0x0c, 0x55, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x89, 0x5e, 0x20, 0x8b, 0x4c, + 0x24, 0x08, 0x8b, 0x01, 0x3d, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x0e, 0x48, 0x89, 0x01, 0x75, 0x09, + 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, + 0x04, 0x8b, 0x4c, 0x24, 0x04, 0x8b, 0x01, 0x3d, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x48, 0x89, + 0x01, 0x75, 0x09, 0x51, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x8b, 0x46, 0x20, 0xc7, + 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x28, 0x89, 0x44, 0x24, 0x24, 0x89, 0x74, + 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x7c, + 0x24, 0x28, 0x89, 0x5c, 0x24, 0x24, 0x89, 0x74, + 0x24, 0x20, 0x83, 0xc4, 0x0c, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyLong_Type); + patch_32(code + 0x29, (uintptr_t)&PyList_Type); + patch_32(code + 0x7c, (uintptr_t)&_PyRuntime + 0x1450); + patch_32(code + 0x86, (uintptr_t)&_PyRuntime + 0x1454); + patch_x86_64_32rx(code + 0x94, (uintptr_t)&_PyLong_ExactDealloc + -0x4); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xcd, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x10a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__SWAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SWAP.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 57 pushl %edi + // 2: 56 pushl %esi + // 3: 8b 44 24 18 movl 0x18(%esp), %eax + // 7: 8b 4c 24 10 movl 0x10(%esp), %ecx + // b: 8b 54 24 14 movl 0x14(%esp), %edx + // f: be 00 00 00 00 movl $0x0, %esi + // 00000010: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 14: 0f b7 f6 movzwl %si, %esi + // 17: c1 e6 02 shll $0x2, %esi + // 1a: 89 d7 movl %edx, %edi + // 1c: 29 f7 subl %esi, %edi + // 1e: f7 de negl %esi + // 20: 8b 3f movl (%edi), %edi + // 22: 8b 5a fc movl -0x4(%edx), %ebx + // 25: 89 1c 32 movl %ebx, (%edx,%esi) + // 28: 89 7a fc movl %edi, -0x4(%edx) + // 2b: 89 4c 24 10 movl %ecx, 0x10(%esp) + // 2f: 89 54 24 14 movl %edx, 0x14(%esp) + // 33: 89 44 24 18 movl %eax, 0x18(%esp) + // 37: 5e popl %esi + // 38: 5f popl %edi + // 39: 5b popl %ebx + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 0000003b: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[58] = { + 0x53, 0x57, 0x56, 0x8b, 0x44, 0x24, 0x18, 0x8b, + 0x4c, 0x24, 0x10, 0x8b, 0x54, 0x24, 0x14, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf6, 0xc1, + 0xe6, 0x02, 0x89, 0xd7, 0x29, 0xf7, 0xf7, 0xde, + 0x8b, 0x3f, 0x8b, 0x5a, 0xfc, 0x89, 0x1c, 0x32, + 0x89, 0x7a, 0xfc, 0x89, 0x4c, 0x24, 0x10, 0x89, + 0x54, 0x24, 0x14, 0x89, 0x44, 0x24, 0x18, 0x5e, + 0x5f, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x10, instruction->oparg); +} + +void +emit__TIER2_RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TIER2_RESUME_CHECK.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 5a 0c movl 0xc(%edx), %ebx + // 10: 84 db testb %bl, %bl + // 12: 74 12 je 0x26 <__JIT_ENTRY+0x26> + // 14: 89 54 24 10 movl %edx, 0x10(%esp) + // 18: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 1c: 89 44 24 08 movl %eax, 0x8(%esp) + // 20: 5b popl %ebx + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 26: 89 54 24 10 movl %edx, 0x10(%esp) + // 2a: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 2e: 89 44 24 08 movl %eax, 0x8(%esp) + // 32: 5b popl %ebx + // 33: e9 00 00 00 00 jmp 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[51] = { + 0x53, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x5a, 0x0c, + 0x84, 0xdb, 0x74, 0x12, 0x89, 0x54, 0x24, 0x10, + 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, + 0x5b, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x4c, 0x24, 0x0c, 0x89, 0x44, + 0x24, 0x08, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__TO_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: 8b 68 fc movl -0x4(%eax), %ebp + // 13: 89 46 20 movl %eax, 0x20(%esi) + // 16: 55 pushl %ebp + // 17: e8 00 00 00 00 calll 0x1c <__JIT_ENTRY+0x1c> + // 00000018: IMAGE_REL_I386_REL32 _PyObject_IsTrue + // 1c: 83 c4 04 addl $0x4, %esp + // 1f: 8b 5e 20 movl 0x20(%esi), %ebx + // 22: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 29: 8b 4d 00 movl (%ebp), %ecx + // 2c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 32: 7f 06 jg 0x3a <__JIT_ENTRY+0x3a> + // 34: 49 decl %ecx + // 35: 89 4d 00 movl %ecx, (%ebp) + // 38: 74 29 je 0x63 <__JIT_ENTRY+0x63> + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 36 js 0x74 <__JIT_ENTRY+0x74> + // 3e: b8 00 00 00 00 movl $0x0, %eax + // 0000003f: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 43: b9 00 00 00 00 movl $0x0, %ecx + // 00000044: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 48: 0f 44 c8 cmovel %eax, %ecx + // 4b: 89 4b fc movl %ecx, -0x4(%ebx) + // 4e: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 52: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 56: 89 74 24 14 movl %esi, 0x14(%esp) + // 5a: 5e popl %esi + // 5b: 5f popl %edi + // 5c: 5b popl %ebx + // 5d: 5d popl %ebp + // 5e: e9 00 00 00 00 jmp 0x63 <__JIT_ENTRY+0x63> + // 0000005f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 63: 55 pushl %ebp + // 64: 89 c5 movl %eax, %ebp + // 66: e8 00 00 00 00 calll 0x6b <__JIT_ENTRY+0x6b> + // 00000067: IMAGE_REL_I386_REL32 __Py_Dealloc + // 6b: 89 e8 movl %ebp, %eax + // 6d: 83 c4 04 addl $0x4, %esp + // 70: 85 c0 testl %eax, %eax + // 72: 79 ca jns 0x3e <__JIT_ENTRY+0x3e> + // 74: 83 c3 fc addl $-0x4, %ebx + // 77: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 7b: 89 74 24 14 movl %esi, 0x14(%esp) + // 7f: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 83: 5e popl %esi + // 84: 5f popl %edi + // 85: 5b popl %ebx + // 86: 5d popl %ebp + // 87: e9 00 00 00 00 jmp 0x8c <__JIT_ENTRY+0x8c> + // 00000088: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[140] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0x8b, 0x68, 0xfc, 0x89, 0x46, 0x20, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, 0x4d, 0x00, + 0x74, 0x29, 0x85, 0xc0, 0x78, 0x36, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x44, 0xc8, 0x89, 0x4b, 0xfc, 0x89, 0x7c, + 0x24, 0x1c, 0x89, 0x5c, 0x24, 0x18, 0x89, 0x74, + 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x89, 0xc5, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xe8, 0x83, 0xc4, 0x04, + 0x85, 0xc0, 0x79, 0xca, 0x83, 0xc3, 0xfc, 0x89, + 0x7c, 0x24, 0x1c, 0x89, 0x74, 0x24, 0x14, 0x89, + 0x5c, 0x24, 0x18, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)&PyObject_IsTrue + -0x4); + patch_32(code + 0x3f, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x44, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x88, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__TO_BOOL_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_BOOL.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 56 pushl %esi + // 1: 8b 54 24 10 movl 0x10(%esp), %edx + // 5: 8b 4c 24 0c movl 0xc(%esp), %ecx + // 9: 8b 44 24 08 movl 0x8(%esp), %eax + // d: 8b 71 fc movl -0x4(%ecx), %esi + // 10: 81 7e 04 00 00 00 00 cmpl $0x0, 0x4(%esi) + // 00000013: IMAGE_REL_I386_DIR32 _PyBool_Type + // 17: 74 12 je 0x2b <__JIT_ENTRY+0x2b> + // 19: 89 54 24 10 movl %edx, 0x10(%esp) + // 1d: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 21: 89 44 24 08 movl %eax, 0x8(%esp) + // 25: 5e popl %esi + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 00000027: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 2b: 89 54 24 10 movl %edx, 0x10(%esp) + // 2f: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 33: 89 44 24 08 movl %eax, 0x8(%esp) + // 37: 5e popl %esi + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 00000039: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x56, 0x8b, 0x54, 0x24, 0x10, 0x8b, 0x4c, 0x24, + 0x0c, 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x71, 0xfc, + 0x81, 0x7e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x12, 0x89, 0x54, 0x24, 0x10, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, 0x10, 0x89, + 0x4c, 0x24, 0x0c, 0x89, 0x44, 0x24, 0x08, 0x5e, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x13, (uintptr_t)&PyBool_Type); + patch_x86_64_32rx(code + 0x27, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__TO_BOOL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_INT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 7c 24 18 movl 0x18(%esp), %edi + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 47 fc movl -0x4(%edi), %eax + // 13: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 00000016: IMAGE_REL_I386_DIR32 _PyLong_Type + // 1a: 74 15 je 0x31 <__JIT_ENTRY+0x31> + // 1c: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 20: 89 7c 24 18 movl %edi, 0x18(%esp) + // 24: 89 74 24 14 movl %esi, 0x14(%esp) + // 28: 5e popl %esi + // 29: 5f popl %edi + // 2a: 5b popl %ebx + // 2b: 5d popl %ebp + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 31: 8b 48 08 movl 0x8(%eax), %ecx + // 34: 83 e1 03 andl $0x3, %ecx + // 37: bd 00 00 00 00 movl $0x0, %ebp + // 00000038: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 3c: 83 f9 01 cmpl $0x1, %ecx + // 3f: 74 1d je 0x5e <__JIT_ENTRY+0x5e> + // 41: 8b 08 movl (%eax), %ecx + // 43: bd 00 00 00 00 movl $0x0, %ebp + // 00000044: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 48: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 4e: 7f 0e jg 0x5e <__JIT_ENTRY+0x5e> + // 50: 49 decl %ecx + // 51: 89 08 movl %ecx, (%eax) + // 53: 75 09 jne 0x5e <__JIT_ENTRY+0x5e> + // 55: 50 pushl %eax + // 56: e8 00 00 00 00 calll 0x5b <__JIT_ENTRY+0x5b> + // 00000057: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5b: 83 c4 04 addl $0x4, %esp + // 5e: 89 6f fc movl %ebp, -0x4(%edi) + // 61: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 65: 89 7c 24 18 movl %edi, 0x18(%esp) + // 69: 89 74 24 14 movl %esi, 0x14(%esp) + // 6d: 5e popl %esi + // 6e: 5f popl %edi + // 6f: 5b popl %ebx + // 70: 5d popl %ebp + // 71: e9 00 00 00 00 jmp 0x76 <__JIT_ENTRY+0x76> + // 00000072: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[113] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x47, 0xfc, 0x81, 0x78, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x15, 0x89, 0x5c, 0x24, 0x1c, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x48, 0x08, 0x83, 0xe1, 0x03, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xf9, 0x01, 0x74, + 0x1d, 0x8b, 0x08, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, + 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x89, 0x6f, + 0xfc, 0x89, 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&PyLong_Type); + patch_x86_64_32rx(code + 0x2d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x38, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x44, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x57, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__TO_BOOL_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_LIST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 7c 24 18 movl 0x18(%esp), %edi + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 47 fc movl -0x4(%edi), %eax + // 13: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 00000016: IMAGE_REL_I386_DIR32 _PyList_Type + // 1a: 74 15 je 0x31 <__JIT_ENTRY+0x31> + // 1c: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 20: 89 7c 24 18 movl %edi, 0x18(%esp) + // 24: 89 74 24 14 movl %esi, 0x14(%esp) + // 28: 5e popl %esi + // 29: 5f popl %edi + // 2a: 5b popl %ebx + // 2b: 5d popl %ebp + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 31: 8b 08 movl (%eax), %ecx + // 33: 8b 68 08 movl 0x8(%eax), %ebp + // 36: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3c: 7f 0e jg 0x4c <__JIT_ENTRY+0x4c> + // 3e: 49 decl %ecx + // 3f: 89 08 movl %ecx, (%eax) + // 41: 75 09 jne 0x4c <__JIT_ENTRY+0x4c> + // 43: 50 pushl %eax + // 44: e8 00 00 00 00 calll 0x49 <__JIT_ENTRY+0x49> + // 00000045: IMAGE_REL_I386_REL32 __Py_Dealloc + // 49: 83 c4 04 addl $0x4, %esp + // 4c: 85 ed testl %ebp, %ebp + // 4e: b8 00 00 00 00 movl $0x0, %eax + // 0000004f: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 53: b9 00 00 00 00 movl $0x0, %ecx + // 00000054: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 58: 0f 44 c8 cmovel %eax, %ecx + // 5b: 89 4f fc movl %ecx, -0x4(%edi) + // 5e: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 62: 89 7c 24 18 movl %edi, 0x18(%esp) + // 66: 89 74 24 14 movl %esi, 0x14(%esp) + // 6a: 5e popl %esi + // 6b: 5f popl %edi + // 6c: 5b popl %ebx + // 6d: 5d popl %ebp + // 6e: e9 00 00 00 00 jmp 0x73 <__JIT_ENTRY+0x73> + // 0000006f: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[110] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x47, 0xfc, 0x81, 0x78, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x15, 0x89, 0x5c, 0x24, 0x1c, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x08, 0x8b, 0x68, 0x08, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, + 0x08, 0x75, 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc4, 0x04, 0x85, 0xed, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x44, 0xc8, 0x89, 0x4f, 0xfc, 0x89, 0x5c, + 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, + 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&PyList_Type); + patch_x86_64_32rx(code + 0x2d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x4f, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x54, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__TO_BOOL_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_NONE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 8b 54 24 0c movl 0xc(%esp), %edx + // 4: 8b 4c 24 08 movl 0x8(%esp), %ecx + // 8: 8b 44 24 04 movl 0x4(%esp), %eax + // c: 81 79 fc 00 00 00 00 cmpl $0x0, -0x4(%ecx) + // 0000000f: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 13: 74 11 je 0x26 <__JIT_ENTRY+0x26> + // 15: 89 54 24 0c movl %edx, 0xc(%esp) + // 19: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 1d: 89 44 24 04 movl %eax, 0x4(%esp) + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 00000022: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 26: c7 41 fc 00 00 00 00 movl $0x0, -0x4(%ecx) + // 00000029: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 2d: 89 54 24 0c movl %edx, 0xc(%esp) + // 31: 89 4c 24 08 movl %ecx, 0x8(%esp) + // 35: 89 44 24 04 movl %eax, 0x4(%esp) + // 39: e9 00 00 00 00 jmp 0x3e <__JIT_ENTRY+0x3e> + // 0000003a: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[57] = { + 0x8b, 0x54, 0x24, 0x0c, 0x8b, 0x4c, 0x24, 0x08, + 0x8b, 0x44, 0x24, 0x04, 0x81, 0x79, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x11, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x41, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x24, + 0x0c, 0x89, 0x4c, 0x24, 0x08, 0x89, 0x44, 0x24, + 0x04, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0xf, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x29, (uintptr_t)&_Py_FalseStruct); +} + +void +emit__TO_BOOL_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_STR.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 5c 24 1c movl 0x1c(%esp), %ebx + // 8: 8b 7c 24 18 movl 0x18(%esp), %edi + // c: 8b 74 24 14 movl 0x14(%esp), %esi + // 10: 8b 47 fc movl -0x4(%edi), %eax + // 13: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 00000016: IMAGE_REL_I386_DIR32 _PyUnicode_Type + // 1a: 74 15 je 0x31 <__JIT_ENTRY+0x31> + // 1c: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 20: 89 7c 24 18 movl %edi, 0x18(%esp) + // 24: 89 74 24 14 movl %esi, 0x14(%esp) + // 28: 5e popl %esi + // 29: 5f popl %edi + // 2a: 5b popl %ebx + // 2b: 5d popl %ebp + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 0000002d: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 31: 3d 04 4c 00 00 cmpl $0x4c04, %eax # imm = 0x4C04 + // 00000032: IMAGE_REL_I386_DIR32 __PyRuntime + // 36: 74 1f je 0x57 <__JIT_ENTRY+0x57> + // 38: 8b 08 movl (%eax), %ecx + // 3a: bd 00 00 00 00 movl $0x0, %ebp + // 0000003b: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 3f: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 45: 7f 15 jg 0x5c <__JIT_ENTRY+0x5c> + // 47: 49 decl %ecx + // 48: 89 08 movl %ecx, (%eax) + // 4a: 75 10 jne 0x5c <__JIT_ENTRY+0x5c> + // 4c: 50 pushl %eax + // 4d: e8 00 00 00 00 calll 0x52 <__JIT_ENTRY+0x52> + // 0000004e: IMAGE_REL_I386_REL32 __Py_Dealloc + // 52: 83 c4 04 addl $0x4, %esp + // 55: eb 05 jmp 0x5c <__JIT_ENTRY+0x5c> + // 57: bd 00 00 00 00 movl $0x0, %ebp + // 00000058: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 5c: 89 6f fc movl %ebp, -0x4(%edi) + // 5f: 89 5c 24 1c movl %ebx, 0x1c(%esp) + // 63: 89 7c 24 18 movl %edi, 0x18(%esp) + // 67: 89 74 24 14 movl %esi, 0x14(%esp) + // 6b: 5e popl %esi + // 6c: 5f popl %edi + // 6d: 5b popl %ebx + // 6e: 5d popl %ebp + // 6f: e9 00 00 00 00 jmp 0x74 <__JIT_ENTRY+0x74> + // 00000070: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[111] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x5c, 0x24, 0x1c, + 0x8b, 0x7c, 0x24, 0x18, 0x8b, 0x74, 0x24, 0x14, + 0x8b, 0x47, 0xfc, 0x81, 0x78, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x15, 0x89, 0x5c, 0x24, 0x1c, + 0x89, 0x7c, 0x24, 0x18, 0x89, 0x74, 0x24, 0x14, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x3d, 0x04, 0x4c, 0x00, 0x00, 0x74, 0x1f, + 0x8b, 0x08, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x15, 0x49, + 0x89, 0x08, 0x75, 0x10, 0x50, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x04, 0xeb, 0x05, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x89, 0x6f, 0xfc, 0x89, + 0x5c, 0x24, 0x1c, 0x89, 0x7c, 0x24, 0x18, 0x89, + 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x16, (uintptr_t)&PyUnicode_Type); + patch_x86_64_32rx(code + 0x2d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x32, (uintptr_t)&_PyRuntime + 0x4c04); + patch_32(code + 0x3b, (uintptr_t)&_Py_TrueStruct); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x58, (uintptr_t)&_Py_FalseStruct); +} + +void +emit__UNARY_INVERT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_INVERT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: 8b 68 fc movl -0x4(%eax), %ebp + // 13: 89 46 20 movl %eax, 0x20(%esi) + // 16: 55 pushl %ebp + // 17: e8 00 00 00 00 calll 0x1c <__JIT_ENTRY+0x1c> + // 00000018: IMAGE_REL_I386_REL32 _PyNumber_Invert + // 1c: 83 c4 04 addl $0x4, %esp + // 1f: 8b 5e 20 movl 0x20(%esi), %ebx + // 22: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 29: 8b 4d 00 movl (%ebp), %ecx + // 2c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 32: 7f 06 jg 0x3a <__JIT_ENTRY+0x3a> + // 34: 49 decl %ecx + // 35: 89 4d 00 movl %ecx, (%ebp) + // 38: 74 1c je 0x56 <__JIT_ENTRY+0x56> + // 3a: 85 c0 testl %eax, %eax + // 3c: 74 29 je 0x67 <__JIT_ENTRY+0x67> + // 3e: 89 43 fc movl %eax, -0x4(%ebx) + // 41: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 45: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 49: 89 74 24 14 movl %esi, 0x14(%esp) + // 4d: 5e popl %esi + // 4e: 5f popl %edi + // 4f: 5b popl %ebx + // 50: 5d popl %ebp + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 56: 55 pushl %ebp + // 57: 89 c5 movl %eax, %ebp + // 59: e8 00 00 00 00 calll 0x5e <__JIT_ENTRY+0x5e> + // 0000005a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5e: 89 e8 movl %ebp, %eax + // 60: 83 c4 04 addl $0x4, %esp + // 63: 85 c0 testl %eax, %eax + // 65: 75 d7 jne 0x3e <__JIT_ENTRY+0x3e> + // 67: 83 c3 fc addl $-0x4, %ebx + // 6a: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 6e: 89 74 24 14 movl %esi, 0x14(%esp) + // 72: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 76: 5e popl %esi + // 77: 5f popl %edi + // 78: 5b popl %ebx + // 79: 5d popl %ebp + // 7a: e9 00 00 00 00 jmp 0x7f <__JIT_ENTRY+0x7f> + // 0000007b: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[127] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0x8b, 0x68, 0xfc, 0x89, 0x46, 0x20, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, 0x4d, 0x00, + 0x74, 0x1c, 0x85, 0xc0, 0x74, 0x29, 0x89, 0x43, + 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x5c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x89, + 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xe8, + 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x75, 0xd7, 0x83, + 0xc3, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x74, + 0x24, 0x14, 0x89, 0x5c, 0x24, 0x18, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)&PyNumber_Invert + -0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x7b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNARY_NEGATIVE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NEGATIVE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 8b 7c 24 1c movl 0x1c(%esp), %edi + // 8: 8b 74 24 14 movl 0x14(%esp), %esi + // c: 8b 44 24 18 movl 0x18(%esp), %eax + // 10: 8b 68 fc movl -0x4(%eax), %ebp + // 13: 89 46 20 movl %eax, 0x20(%esi) + // 16: 55 pushl %ebp + // 17: e8 00 00 00 00 calll 0x1c <__JIT_ENTRY+0x1c> + // 00000018: IMAGE_REL_I386_REL32 _PyNumber_Negative + // 1c: 83 c4 04 addl $0x4, %esp + // 1f: 8b 5e 20 movl 0x20(%esi), %ebx + // 22: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 29: 8b 4d 00 movl (%ebp), %ecx + // 2c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 32: 7f 06 jg 0x3a <__JIT_ENTRY+0x3a> + // 34: 49 decl %ecx + // 35: 89 4d 00 movl %ecx, (%ebp) + // 38: 74 1c je 0x56 <__JIT_ENTRY+0x56> + // 3a: 85 c0 testl %eax, %eax + // 3c: 74 29 je 0x67 <__JIT_ENTRY+0x67> + // 3e: 89 43 fc movl %eax, -0x4(%ebx) + // 41: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 45: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 49: 89 74 24 14 movl %esi, 0x14(%esp) + // 4d: 5e popl %esi + // 4e: 5f popl %edi + // 4f: 5b popl %ebx + // 50: 5d popl %ebp + // 51: e9 00 00 00 00 jmp 0x56 <__JIT_ENTRY+0x56> + // 00000052: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 56: 55 pushl %ebp + // 57: 89 c5 movl %eax, %ebp + // 59: e8 00 00 00 00 calll 0x5e <__JIT_ENTRY+0x5e> + // 0000005a: IMAGE_REL_I386_REL32 __Py_Dealloc + // 5e: 89 e8 movl %ebp, %eax + // 60: 83 c4 04 addl $0x4, %esp + // 63: 85 c0 testl %eax, %eax + // 65: 75 d7 jne 0x3e <__JIT_ENTRY+0x3e> + // 67: 83 c3 fc addl $-0x4, %ebx + // 6a: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 6e: 89 74 24 14 movl %esi, 0x14(%esp) + // 72: 89 5c 24 18 movl %ebx, 0x18(%esp) + // 76: 5e popl %esi + // 77: 5f popl %edi + // 78: 5b popl %ebx + // 79: 5d popl %ebp + // 7a: e9 00 00 00 00 jmp 0x7f <__JIT_ENTRY+0x7f> + // 0000007b: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[127] = { + 0x55, 0x53, 0x57, 0x56, 0x8b, 0x7c, 0x24, 0x1c, + 0x8b, 0x74, 0x24, 0x14, 0x8b, 0x44, 0x24, 0x18, + 0x8b, 0x68, 0xfc, 0x89, 0x46, 0x20, 0x55, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, 0x8b, + 0x5e, 0x20, 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x06, 0x49, 0x89, 0x4d, 0x00, + 0x74, 0x1c, 0x85, 0xc0, 0x74, 0x29, 0x89, 0x43, + 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x5c, 0x24, + 0x18, 0x89, 0x74, 0x24, 0x14, 0x5e, 0x5f, 0x5b, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x89, + 0xc5, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xe8, + 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x75, 0xd7, 0x83, + 0xc3, 0xfc, 0x89, 0x7c, 0x24, 0x1c, 0x89, 0x74, + 0x24, 0x14, 0x89, 0x5c, 0x24, 0x18, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)&PyNumber_Negative + -0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0x7b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNARY_NOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NOT.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 57 pushl %edi + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 4c 24 0c movl 0xc(%esp), %ecx + // a: 8b 54 24 10 movl 0x10(%esp), %edx + // e: 81 7a fc 00 00 00 00 cmpl $0x0, -0x4(%edx) + // 00000011: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 15: be 00 00 00 00 movl $0x0, %esi + // 00000016: IMAGE_REL_I386_DIR32 __Py_FalseStruct + // 1a: bf 00 00 00 00 movl $0x0, %edi + // 0000001b: IMAGE_REL_I386_DIR32 __Py_TrueStruct + // 1f: 0f 45 fe cmovnel %esi, %edi + // 22: 89 7a fc movl %edi, -0x4(%edx) + // 25: 89 4c 24 0c movl %ecx, 0xc(%esp) + // 29: 89 54 24 10 movl %edx, 0x10(%esp) + // 2d: 89 44 24 14 movl %eax, 0x14(%esp) + // 31: 5e popl %esi + // 32: 5f popl %edi + // 33: e9 00 00 00 00 jmp 0x38 <__JIT_ENTRY+0x38> + // 00000034: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[51] = { + 0x57, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x4c, + 0x24, 0x0c, 0x8b, 0x54, 0x24, 0x10, 0x81, 0x7a, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x45, 0xfe, 0x89, 0x7a, 0xfc, 0x89, 0x4c, 0x24, + 0x0c, 0x89, 0x54, 0x24, 0x10, 0x89, 0x44, 0x24, + 0x14, 0x5e, 0x5f, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x11, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x16, (uintptr_t)&_Py_FalseStruct); + patch_32(code + 0x1b, (uintptr_t)&_Py_TrueStruct); +} + +void +emit__UNPACK_EX( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_EX.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 44 24 28 movl 0x28(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 5c 24 20 movl 0x20(%esp), %ebx + // 12: 8b 44 24 24 movl 0x24(%esp), %eax + // 16: b9 00 00 00 00 movl $0x0, %ecx + // 00000017: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1b: 8b 70 fc movl -0x4(%eax), %esi + // 1e: 0f b6 e9 movzbl %cl, %ebp + // 21: 8d 14 a8 leal (%eax,%ebp,4), %edx + // 24: 0f b6 fd movzbl %ch, %edi + // 27: 8d 0c ba leal (%edx,%edi,4), %ecx + // 2a: 89 43 20 movl %eax, 0x20(%ebx) + // 2d: 51 pushl %ecx + // 2e: 89 7c 24 08 movl %edi, 0x8(%esp) + // 32: 57 pushl %edi + // 33: 89 6c 24 10 movl %ebp, 0x10(%esp) + // 37: 55 pushl %ebp + // 38: 56 pushl %esi + // 39: ff 74 24 10 pushl 0x10(%esp) + // 3d: e8 00 00 00 00 calll 0x42 <__JIT_ENTRY+0x42> + // 0000003e: IMAGE_REL_I386_REL32 __PyEval_UnpackIterableStackRef + // 42: 83 c4 14 addl $0x14, %esp + // 45: 8b 6b 20 movl 0x20(%ebx), %ebp + // 48: c7 43 20 00 00 00 00 movl $0x0, 0x20(%ebx) + // 4f: 8b 0e movl (%esi), %ecx + // 51: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 57: 7f 05 jg 0x5e <__JIT_ENTRY+0x5e> + // 59: 49 decl %ecx + // 5a: 89 0e movl %ecx, (%esi) + // 5c: 74 33 je 0x91 <__JIT_ENTRY+0x91> + // 5e: 85 c0 testl %eax, %eax + // 60: 74 40 je 0xa2 <__JIT_ENTRY+0xa2> + // 62: 8b 44 24 08 movl 0x8(%esp), %eax + // 66: 8d 04 85 00 00 00 00 leal (,%eax,4), %eax + // 6d: 01 e8 addl %ebp, %eax + // 6f: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 73: 8d 04 88 leal (%eax,%ecx,4), %eax + // 76: 8b 0c 24 movl (%esp), %ecx + // 79: 89 4c 24 28 movl %ecx, 0x28(%esp) + // 7d: 89 5c 24 20 movl %ebx, 0x20(%esp) + // 81: 89 44 24 24 movl %eax, 0x24(%esp) + // 85: 83 c4 0c addl $0xc, %esp + // 88: 5e popl %esi + // 89: 5f popl %edi + // 8a: 5b popl %ebx + // 8b: 5d popl %ebp + // 8c: e9 00 00 00 00 jmp 0x91 <__JIT_ENTRY+0x91> + // 0000008d: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 91: 56 pushl %esi + // 92: 89 c7 movl %eax, %edi + // 94: e8 00 00 00 00 calll 0x99 <__JIT_ENTRY+0x99> + // 00000095: IMAGE_REL_I386_REL32 __Py_Dealloc + // 99: 89 f8 movl %edi, %eax + // 9b: 83 c4 04 addl $0x4, %esp + // 9e: 85 c0 testl %eax, %eax + // a0: 75 c0 jne 0x62 <__JIT_ENTRY+0x62> + // a2: 83 c5 fc addl $-0x4, %ebp + // a5: 8b 04 24 movl (%esp), %eax + // a8: 89 44 24 28 movl %eax, 0x28(%esp) + // ac: 89 5c 24 20 movl %ebx, 0x20(%esp) + // b0: 89 6c 24 24 movl %ebp, 0x24(%esp) + // b4: 83 c4 0c addl $0xc, %esp + // b7: 5e popl %esi + // b8: 5f popl %edi + // b9: 5b popl %ebx + // ba: 5d popl %ebp + // bb: e9 00 00 00 00 jmp 0xc0 <__JIT_ENTRY+0xc0> + // 000000bc: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[192] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x44, 0x24, 0x28, 0x89, 0x04, 0x24, 0x8b, 0x5c, + 0x24, 0x20, 0x8b, 0x44, 0x24, 0x24, 0xb9, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x70, 0xfc, 0x0f, 0xb6, + 0xe9, 0x8d, 0x14, 0xa8, 0x0f, 0xb6, 0xfd, 0x8d, + 0x0c, 0xba, 0x89, 0x43, 0x20, 0x51, 0x89, 0x7c, + 0x24, 0x08, 0x57, 0x89, 0x6c, 0x24, 0x10, 0x55, + 0x56, 0xff, 0x74, 0x24, 0x10, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x14, 0x8b, 0x6b, 0x20, + 0xc7, 0x43, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0e, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x05, 0x49, 0x89, 0x0e, 0x74, 0x33, 0x85, 0xc0, + 0x74, 0x40, 0x8b, 0x44, 0x24, 0x08, 0x8d, 0x04, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe8, 0x8b, + 0x4c, 0x24, 0x04, 0x8d, 0x04, 0x88, 0x8b, 0x0c, + 0x24, 0x89, 0x4c, 0x24, 0x28, 0x89, 0x5c, 0x24, + 0x20, 0x89, 0x44, 0x24, 0x24, 0x83, 0xc4, 0x0c, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x89, 0xc7, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xf8, 0x83, 0xc4, 0x04, 0x85, 0xc0, + 0x75, 0xc0, 0x83, 0xc5, 0xfc, 0x8b, 0x04, 0x24, + 0x89, 0x44, 0x24, 0x28, 0x89, 0x5c, 0x24, 0x20, + 0x89, 0x6c, 0x24, 0x24, 0x83, 0xc4, 0x0c, 0x5e, + 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, instruction->oparg); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)&_PyEval_UnpackIterableStackRef + -0x4); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x95, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xbc, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNPACK_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 54 24 20 movl 0x20(%esp), %edx + // 9: 8b 74 24 18 movl 0x18(%esp), %esi + // d: 8b 44 24 1c movl 0x1c(%esp), %eax + // 11: b9 00 00 00 00 movl $0x0, %ecx + // 00000012: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 16: 0f b7 d9 movzwl %cx, %ebx + // 19: 8b 68 fc movl -0x4(%eax), %ebp + // 1c: 8d 4c 98 fc leal -0x4(%eax,%ebx,4), %ecx + // 20: 89 46 20 movl %eax, 0x20(%esi) + // 23: 51 pushl %ecx + // 24: 6a ff pushl $-0x1 + // 26: 53 pushl %ebx + // 27: 55 pushl %ebp + // 28: 89 54 24 10 movl %edx, 0x10(%esp) + // 2c: 52 pushl %edx + // 2d: e8 00 00 00 00 calll 0x32 <__JIT_ENTRY+0x32> + // 0000002e: IMAGE_REL_I386_REL32 __PyEval_UnpackIterableStackRef + // 32: 83 c4 14 addl $0x14, %esp + // 35: 8b 7e 20 movl 0x20(%esi), %edi + // 38: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 3f: 8b 4d 00 movl (%ebp), %ecx + // 42: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 48: 7f 06 jg 0x50 <__JIT_ENTRY+0x50> + // 4a: 49 decl %ecx + // 4b: 89 4d 00 movl %ecx, (%ebp) + // 4e: 74 25 je 0x75 <__JIT_ENTRY+0x75> + // 50: 85 c0 testl %eax, %eax + // 52: 74 32 je 0x86 <__JIT_ENTRY+0x86> + // 54: 8d 04 9f leal (%edi,%ebx,4), %eax + // 57: 83 c0 fc addl $-0x4, %eax + // 5a: 8b 0c 24 movl (%esp), %ecx + // 5d: 89 4c 24 20 movl %ecx, 0x20(%esp) + // 61: 89 74 24 18 movl %esi, 0x18(%esp) + // 65: 89 44 24 1c movl %eax, 0x1c(%esp) + // 69: 83 c4 04 addl $0x4, %esp + // 6c: 5e popl %esi + // 6d: 5f popl %edi + // 6e: 5b popl %ebx + // 6f: 5d popl %ebp + // 70: e9 00 00 00 00 jmp 0x75 <__JIT_ENTRY+0x75> + // 00000071: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // 75: 55 pushl %ebp + // 76: 89 c5 movl %eax, %ebp + // 78: e8 00 00 00 00 calll 0x7d <__JIT_ENTRY+0x7d> + // 00000079: IMAGE_REL_I386_REL32 __Py_Dealloc + // 7d: 89 e8 movl %ebp, %eax + // 7f: 83 c4 04 addl $0x4, %esp + // 82: 85 c0 testl %eax, %eax + // 84: 75 ce jne 0x54 <__JIT_ENTRY+0x54> + // 86: 83 c7 fc addl $-0x4, %edi + // 89: 8b 04 24 movl (%esp), %eax + // 8c: 89 44 24 20 movl %eax, 0x20(%esp) + // 90: 89 74 24 18 movl %esi, 0x18(%esp) + // 94: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 98: 83 c4 04 addl $0x4, %esp + // 9b: 5e popl %esi + // 9c: 5f popl %edi + // 9d: 5b popl %ebx + // 9e: 5d popl %ebp + // 9f: e9 00 00 00 00 jmp 0xa4 <__JIT_ENTRY+0xa4> + // 000000a0: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[164] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x54, 0x24, + 0x20, 0x8b, 0x74, 0x24, 0x18, 0x8b, 0x44, 0x24, + 0x1c, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xd9, 0x8b, 0x68, 0xfc, 0x8d, 0x4c, 0x98, 0xfc, + 0x89, 0x46, 0x20, 0x51, 0x6a, 0xff, 0x53, 0x55, + 0x89, 0x54, 0x24, 0x10, 0x52, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x83, 0xc4, 0x14, 0x8b, 0x7e, 0x20, + 0xc7, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x06, 0x49, 0x89, 0x4d, 0x00, 0x74, 0x25, + 0x85, 0xc0, 0x74, 0x32, 0x8d, 0x04, 0x9f, 0x83, + 0xc0, 0xfc, 0x8b, 0x0c, 0x24, 0x89, 0x4c, 0x24, + 0x20, 0x89, 0x74, 0x24, 0x18, 0x89, 0x44, 0x24, + 0x1c, 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x89, 0xc5, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xe8, 0x83, + 0xc4, 0x04, 0x85, 0xc0, 0x75, 0xce, 0x83, 0xc7, + 0xfc, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x20, + 0x89, 0x74, 0x24, 0x18, 0x89, 0x7c, 0x24, 0x1c, + 0x83, 0xc4, 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x12, instruction->oparg); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)&_PyEval_UnpackIterableStackRef + -0x4); + patch_x86_64_32rx(code + 0x71, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xa0, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNPACK_SEQUENCE_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_LIST.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 0c subl $0xc, %esp + // 7: 8b 74 24 28 movl 0x28(%esp), %esi + // b: 8b 7c 24 24 movl 0x24(%esp), %edi + // f: 8b 54 24 20 movl 0x20(%esp), %edx + // 13: 8b 47 fc movl -0x4(%edi), %eax + // 16: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 00000019: IMAGE_REL_I386_DIR32 _PyList_Type + // 1d: 75 42 jne 0x61 <__JIT_ENTRY+0x61> + // 1f: b9 00 00 00 00 movl $0x0, %ecx + // 00000020: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 24: 0f b7 c9 movzwl %cx, %ecx + // 27: 39 48 08 cmpl %ecx, 0x8(%eax) + // 2a: 75 35 jne 0x61 <__JIT_ENTRY+0x61> + // 2c: 89 0c 24 movl %ecx, (%esp) + // 2f: 89 74 24 04 movl %esi, 0x4(%esp) + // 33: 89 54 24 08 movl %edx, 0x8(%esp) + // 37: b9 00 00 00 00 movl $0x0, %ecx + // 00000038: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 3c: 66 85 c9 testw %cx, %cx + // 3f: 74 5f je 0xa0 <__JIT_ENTRY+0xa0> + // 41: 8d 57 fc leal -0x4(%edi), %edx + // 44: 8b 48 0c movl 0xc(%eax), %ecx + // 47: 8b 1c 24 movl (%esp), %ebx + // 4a: f6 c3 01 testb $0x1, %bl + // 4d: 75 2a jne 0x79 <__JIT_ENTRY+0x79> + // 4f: 89 dd movl %ebx, %ebp + // 51: be 00 00 00 00 movl $0x0, %esi + // 00000052: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 56: 66 83 fe 01 cmpw $0x1, %si + // 5a: 74 44 je 0xa0 <__JIT_ENTRY+0xa0> + // 5c: e9 80 00 00 00 jmp 0xe1 <__JIT_ENTRY+0xe1> + // 61: 89 74 24 28 movl %esi, 0x28(%esp) + // 65: 89 7c 24 24 movl %edi, 0x24(%esp) + // 69: 89 54 24 20 movl %edx, 0x20(%esp) + // 6d: 83 c4 0c addl $0xc, %esp + // 70: 5e popl %esi + // 71: 5f popl %edi + // 72: 5b popl %ebx + // 73: 5d popl %ebp + // 74: e9 00 00 00 00 jmp 0x79 <__JIT_ENTRY+0x79> + // 00000075: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 79: 8b 6c 99 fc movl -0x4(%ecx,%ebx,4), %ebp + // 7d: 8b 75 00 movl (%ebp), %esi + // 80: 81 fe ff ff ff 3f cmpl $0x3fffffff, %esi # imm = 0x3FFFFFFF + // 86: 7f 04 jg 0x8c <__JIT_ENTRY+0x8c> + // 88: 46 incl %esi + // 89: 89 75 00 movl %esi, (%ebp) + // 8c: 89 ee movl %ebp, %esi + // 8e: 8d 6b ff leal -0x1(%ebx), %ebp + // 91: 89 32 movl %esi, (%edx) + // 93: 89 fa movl %edi, %edx + // 95: be 00 00 00 00 movl $0x0, %esi + // 00000096: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 9a: 66 83 fe 01 cmpw $0x1, %si + // 9e: 75 41 jne 0xe1 <__JIT_ENTRY+0xe1> + // a0: 8b 08 movl (%eax), %ecx + // a2: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // a8: 7f 0e jg 0xb8 <__JIT_ENTRY+0xb8> + // aa: 49 decl %ecx + // ab: 89 08 movl %ecx, (%eax) + // ad: 75 09 jne 0xb8 <__JIT_ENTRY+0xb8> + // af: 50 pushl %eax + // b0: e8 00 00 00 00 calll 0xb5 <__JIT_ENTRY+0xb5> + // 000000b1: IMAGE_REL_I386_REL32 __Py_Dealloc + // b5: 83 c4 04 addl $0x4, %esp + // b8: 8b 04 24 movl (%esp), %eax + // bb: 8d 04 87 leal (%edi,%eax,4), %eax + // be: 83 c0 fc addl $-0x4, %eax + // c1: 8b 4c 24 04 movl 0x4(%esp), %ecx + // c5: 89 4c 24 28 movl %ecx, 0x28(%esp) + // c9: 8b 4c 24 08 movl 0x8(%esp), %ecx + // cd: 89 4c 24 20 movl %ecx, 0x20(%esp) + // d1: 89 44 24 24 movl %eax, 0x24(%esp) + // d5: 83 c4 0c addl $0xc, %esp + // d8: 5e popl %esi + // d9: 5f popl %edi + // da: 5b popl %ebx + // db: 5d popl %ebp + // dc: e9 00 00 00 00 jmp 0xe1 <__JIT_ENTRY+0xe1> + // 000000dd: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // e1: 45 incl %ebp + // e2: eb 1a jmp 0xfe <__JIT_ENTRY+0xfe> + // e4: 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%eax,%eax) + // f0: 89 72 04 movl %esi, 0x4(%edx) + // f3: 83 c5 fe addl $-0x2, %ebp + // f6: 83 c2 08 addl $0x8, %edx + // f9: 83 fd 01 cmpl $0x1, %ebp + // fc: 76 a2 jbe 0xa0 <__JIT_ENTRY+0xa0> + // fe: 8b 74 a9 f8 movl -0x8(%ecx,%ebp,4), %esi + // 102: 8b 1e movl (%esi), %ebx + // 104: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 10a: 7f 03 jg 0x10f <__JIT_ENTRY+0x10f> + // 10c: 43 incl %ebx + // 10d: 89 1e movl %ebx, (%esi) + // 10f: 89 32 movl %esi, (%edx) + // 111: 8b 74 a9 f4 movl -0xc(%ecx,%ebp,4), %esi + // 115: 8b 1e movl (%esi), %ebx + // 117: 81 fb ff ff ff 3f cmpl $0x3fffffff, %ebx # imm = 0x3FFFFFFF + // 11d: 7f d1 jg 0xf0 <__JIT_ENTRY+0xf0> + // 11f: 43 incl %ebx + // 120: 89 1e movl %ebx, (%esi) + // 122: eb cc jmp 0xf0 <__JIT_ENTRY+0xf0> + const unsigned char code_body[292] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x0c, 0x8b, + 0x74, 0x24, 0x28, 0x8b, 0x7c, 0x24, 0x24, 0x8b, + 0x54, 0x24, 0x20, 0x8b, 0x47, 0xfc, 0x81, 0x78, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x75, 0x42, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc9, 0x39, + 0x48, 0x08, 0x75, 0x35, 0x89, 0x0c, 0x24, 0x89, + 0x74, 0x24, 0x04, 0x89, 0x54, 0x24, 0x08, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc9, 0x74, + 0x5f, 0x8d, 0x57, 0xfc, 0x8b, 0x48, 0x0c, 0x8b, + 0x1c, 0x24, 0xf6, 0xc3, 0x01, 0x75, 0x2a, 0x89, + 0xdd, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x66, 0x83, + 0xfe, 0x01, 0x74, 0x44, 0xe9, 0x80, 0x00, 0x00, + 0x00, 0x89, 0x74, 0x24, 0x28, 0x89, 0x7c, 0x24, + 0x24, 0x89, 0x54, 0x24, 0x20, 0x83, 0xc4, 0x0c, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x6c, 0x99, 0xfc, 0x8b, 0x75, 0x00, + 0x81, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x04, + 0x46, 0x89, 0x75, 0x00, 0x89, 0xee, 0x8d, 0x6b, + 0xff, 0x89, 0x32, 0x89, 0xfa, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x83, 0xfe, 0x01, 0x75, 0x41, + 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, + 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, 0x09, 0x50, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc4, 0x04, + 0x8b, 0x04, 0x24, 0x8d, 0x04, 0x87, 0x83, 0xc0, + 0xfc, 0x8b, 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, + 0x28, 0x8b, 0x4c, 0x24, 0x08, 0x89, 0x4c, 0x24, + 0x20, 0x89, 0x44, 0x24, 0x24, 0x83, 0xc4, 0x0c, + 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x45, 0xeb, 0x1a, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x72, 0x04, 0x83, 0xc5, 0xfe, 0x83, 0xc2, + 0x08, 0x83, 0xfd, 0x01, 0x76, 0xa2, 0x8b, 0x74, + 0xa9, 0xf8, 0x8b, 0x1e, 0x81, 0xfb, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x03, 0x43, 0x89, 0x1e, 0x89, + 0x32, 0x8b, 0x74, 0xa9, 0xf4, 0x8b, 0x1e, 0x81, + 0xfb, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0xd1, 0x43, + 0x89, 0x1e, 0xeb, 0xcc, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyList_Type); + patch_32(code + 0x20, instruction->oparg); + patch_32(code + 0x38, instruction->oparg); + patch_32(code + 0x52, instruction->oparg); + patch_x86_64_32rx(code + 0x75, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32(code + 0x96, instruction->oparg); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xdd, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__UNPACK_SEQUENCE_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 08 subl $0x8, %esp + // 7: 8b 5c 24 24 movl 0x24(%esp), %ebx + // b: 8b 7c 24 20 movl 0x20(%esp), %edi + // f: 8b 54 24 1c movl 0x1c(%esp), %edx + // 13: 8b 47 fc movl -0x4(%edi), %eax + // 16: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 00000019: IMAGE_REL_I386_DIR32 _PyTuple_Type + // 1d: 0f 85 8c 00 00 00 jne 0xaf <__JIT_ENTRY+0xaf> + // 23: b9 00 00 00 00 movl $0x0, %ecx + // 00000024: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 28: 0f b7 c9 movzwl %cx, %ecx + // 2b: 89 0c 24 movl %ecx, (%esp) + // 2e: 39 48 08 cmpl %ecx, 0x8(%eax) + // 31: 75 7c jne 0xaf <__JIT_ENTRY+0xaf> + // 33: 89 54 24 04 movl %edx, 0x4(%esp) + // 37: b9 00 00 00 00 movl $0x0, %ecx + // 00000038: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 3c: 66 85 c9 testw %cx, %cx + // 3f: 74 31 je 0x72 <__JIT_ENTRY+0x72> + // 41: 8d 4f fc leal -0x4(%edi), %ecx + // 44: 8b 14 24 movl (%esp), %edx + // 47: f6 c2 01 testb $0x1, %dl + // 4a: 74 1b je 0x67 <__JIT_ENTRY+0x67> + // 4c: 8b 6c 90 08 movl 0x8(%eax,%edx,4), %ebp + // 50: 8b 55 00 movl (%ebp), %edx + // 53: 81 fa ff ff ff 3f cmpl $0x3fffffff, %edx # imm = 0x3FFFFFFF + // 59: 7f 04 jg 0x5f <__JIT_ENTRY+0x5f> + // 5b: 42 incl %edx + // 5c: 89 55 00 movl %edx, (%ebp) + // 5f: 8b 14 24 movl (%esp), %edx + // 62: 4a decl %edx + // 63: 89 29 movl %ebp, (%ecx) + // 65: 89 f9 movl %edi, %ecx + // 67: be 00 00 00 00 movl $0x0, %esi + // 00000068: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 6c: 66 83 fe 01 cmpw $0x1, %si + // 70: 75 55 jne 0xc7 <__JIT_ENTRY+0xc7> + // 72: 8b 08 movl (%eax), %ecx + // 74: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 7a: 7f 0e jg 0x8a <__JIT_ENTRY+0x8a> + // 7c: 49 decl %ecx + // 7d: 89 08 movl %ecx, (%eax) + // 7f: 75 09 jne 0x8a <__JIT_ENTRY+0x8a> + // 81: 50 pushl %eax + // 82: e8 00 00 00 00 calll 0x87 <__JIT_ENTRY+0x87> + // 00000083: IMAGE_REL_I386_REL32 __Py_Dealloc + // 87: 83 c4 04 addl $0x4, %esp + // 8a: 8b 04 24 movl (%esp), %eax + // 8d: 8d 04 87 leal (%edi,%eax,4), %eax + // 90: 83 c0 fc addl $-0x4, %eax + // 93: 89 5c 24 24 movl %ebx, 0x24(%esp) + // 97: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 9b: 89 4c 24 1c movl %ecx, 0x1c(%esp) + // 9f: 89 44 24 20 movl %eax, 0x20(%esp) + // a3: 83 c4 08 addl $0x8, %esp + // a6: 5e popl %esi + // a7: 5f popl %edi + // a8: 5b popl %ebx + // a9: 5d popl %ebp + // aa: e9 00 00 00 00 jmp 0xaf <__JIT_ENTRY+0xaf> + // 000000ab: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // af: 89 5c 24 24 movl %ebx, 0x24(%esp) + // b3: 89 7c 24 20 movl %edi, 0x20(%esp) + // b7: 89 54 24 1c movl %edx, 0x1c(%esp) + // bb: 83 c4 08 addl $0x8, %esp + // be: 5e popl %esi + // bf: 5f popl %edi + // c0: 5b popl %ebx + // c1: 5d popl %ebp + // c2: e9 00 00 00 00 jmp 0xc7 <__JIT_ENTRY+0xc7> + // 000000c3: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // c7: 42 incl %edx + // c8: eb 14 jmp 0xde <__JIT_ENTRY+0xde> + // ca: 66 0f 1f 44 00 00 nopw (%eax,%eax) + // d0: 89 69 04 movl %ebp, 0x4(%ecx) + // d3: 83 c2 fe addl $-0x2, %edx + // d6: 83 c1 08 addl $0x8, %ecx + // d9: 83 fa 01 cmpl $0x1, %edx + // dc: 76 94 jbe 0x72 <__JIT_ENTRY+0x72> + // de: 8b 6c 90 04 movl 0x4(%eax,%edx,4), %ebp + // e2: 8b 75 00 movl (%ebp), %esi + // e5: 81 fe ff ff ff 3f cmpl $0x3fffffff, %esi # imm = 0x3FFFFFFF + // eb: 7f 04 jg 0xf1 <__JIT_ENTRY+0xf1> + // ed: 46 incl %esi + // ee: 89 75 00 movl %esi, (%ebp) + // f1: 89 29 movl %ebp, (%ecx) + // f3: 8b 2c 90 movl (%eax,%edx,4), %ebp + // f6: 8b 75 00 movl (%ebp), %esi + // f9: 81 fe ff ff ff 3f cmpl $0x3fffffff, %esi # imm = 0x3FFFFFFF + // ff: 7f cf jg 0xd0 <__JIT_ENTRY+0xd0> + // 101: 46 incl %esi + // 102: 89 75 00 movl %esi, (%ebp) + // 105: eb c9 jmp 0xd0 <__JIT_ENTRY+0xd0> + const unsigned char code_body[263] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x08, 0x8b, + 0x5c, 0x24, 0x24, 0x8b, 0x7c, 0x24, 0x20, 0x8b, + 0x54, 0x24, 0x1c, 0x8b, 0x47, 0xfc, 0x81, 0x78, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0x8c, + 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc9, 0x89, 0x0c, 0x24, 0x39, 0x48, + 0x08, 0x75, 0x7c, 0x89, 0x54, 0x24, 0x04, 0xb9, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc9, 0x74, + 0x31, 0x8d, 0x4f, 0xfc, 0x8b, 0x14, 0x24, 0xf6, + 0xc2, 0x01, 0x74, 0x1b, 0x8b, 0x6c, 0x90, 0x08, + 0x8b, 0x55, 0x00, 0x81, 0xfa, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0x04, 0x42, 0x89, 0x55, 0x00, 0x8b, + 0x14, 0x24, 0x4a, 0x89, 0x29, 0x89, 0xf9, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x83, 0xfe, 0x01, + 0x75, 0x55, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x0e, 0x49, 0x89, 0x08, 0x75, + 0x09, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc4, 0x04, 0x8b, 0x04, 0x24, 0x8d, 0x04, 0x87, + 0x83, 0xc0, 0xfc, 0x89, 0x5c, 0x24, 0x24, 0x8b, + 0x4c, 0x24, 0x04, 0x89, 0x4c, 0x24, 0x1c, 0x89, + 0x44, 0x24, 0x20, 0x83, 0xc4, 0x08, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x89, + 0x5c, 0x24, 0x24, 0x89, 0x7c, 0x24, 0x20, 0x89, + 0x54, 0x24, 0x1c, 0x83, 0xc4, 0x08, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x42, + 0xeb, 0x14, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x89, 0x69, 0x04, 0x83, 0xc2, 0xfe, 0x83, 0xc1, + 0x08, 0x83, 0xfa, 0x01, 0x76, 0x94, 0x8b, 0x6c, + 0x90, 0x04, 0x8b, 0x75, 0x00, 0x81, 0xfe, 0xff, + 0xff, 0xff, 0x3f, 0x7f, 0x04, 0x46, 0x89, 0x75, + 0x00, 0x89, 0x29, 0x8b, 0x2c, 0x90, 0x8b, 0x75, + 0x00, 0x81, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0xcf, 0x46, 0x89, 0x75, 0x00, 0xeb, 0xc9, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, (uintptr_t)&PyTuple_Type); + patch_32(code + 0x24, instruction->oparg); + patch_32(code + 0x38, instruction->oparg); + patch_32(code + 0x68, instruction->oparg); + patch_x86_64_32rx(code + 0x83, (uintptr_t)&_Py_Dealloc + -0x4); + patch_x86_64_32rx(code + 0xab, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc3, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__UNPACK_SEQUENCE_TWO_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TWO_TUPLE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 50 pushl %eax + // 5: 8b 5c 24 20 movl 0x20(%esp), %ebx + // 9: 8b 7c 24 1c movl 0x1c(%esp), %edi + // d: 8b 74 24 18 movl 0x18(%esp), %esi + // 11: 8b 47 fc movl -0x4(%edi), %eax + // 14: 81 78 04 00 00 00 00 cmpl $0x0, 0x4(%eax) + // 00000017: IMAGE_REL_I386_DIR32 _PyTuple_Type + // 1b: 75 2d jne 0x4a <__JIT_ENTRY+0x4a> + // 1d: 83 78 08 02 cmpl $0x2, 0x8(%eax) + // 21: 75 27 jne 0x4a <__JIT_ENTRY+0x4a> + // 23: 8b 50 0c movl 0xc(%eax), %edx + // 26: 8b 0a movl (%edx), %ecx + // 28: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 2e: 7e 32 jle 0x62 <__JIT_ENTRY+0x62> + // 30: 8b 68 10 movl 0x10(%eax), %ebp + // 33: 8b 4d 00 movl (%ebp), %ecx + // 36: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 3c: 7e 35 jle 0x73 <__JIT_ENTRY+0x73> + // 3e: 8b 08 movl (%eax), %ecx + // 40: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 46: 7e 39 jle 0x81 <__JIT_ENTRY+0x81> + // 48: eb 4d jmp 0x97 <__JIT_ENTRY+0x97> + // 4a: 89 5c 24 20 movl %ebx, 0x20(%esp) + // 4e: 89 7c 24 1c movl %edi, 0x1c(%esp) + // 52: 89 74 24 18 movl %esi, 0x18(%esp) + // 56: 83 c4 04 addl $0x4, %esp + // 59: 5e popl %esi + // 5a: 5f popl %edi + // 5b: 5b popl %ebx + // 5c: 5d popl %ebp + // 5d: e9 00 00 00 00 jmp 0x62 <__JIT_ENTRY+0x62> + // 0000005e: IMAGE_REL_I386_REL32 __JIT_JUMP_TARGET + // 62: 41 incl %ecx + // 63: 89 0a movl %ecx, (%edx) + // 65: 8b 68 10 movl 0x10(%eax), %ebp + // 68: 8b 4d 00 movl (%ebp), %ecx + // 6b: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 71: 7f cb jg 0x3e <__JIT_ENTRY+0x3e> + // 73: 41 incl %ecx + // 74: 89 4d 00 movl %ecx, (%ebp) + // 77: 8b 08 movl (%eax), %ecx + // 79: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 7f: 7f 16 jg 0x97 <__JIT_ENTRY+0x97> + // 81: 49 decl %ecx + // 82: 89 08 movl %ecx, (%eax) + // 84: 75 11 jne 0x97 <__JIT_ENTRY+0x97> + // 86: 50 pushl %eax + // 87: 89 54 24 04 movl %edx, 0x4(%esp) + // 8b: e8 00 00 00 00 calll 0x90 <__JIT_ENTRY+0x90> + // 0000008c: IMAGE_REL_I386_REL32 __Py_Dealloc + // 90: 8b 54 24 04 movl 0x4(%esp), %edx + // 94: 83 c4 04 addl $0x4, %esp + // 97: 89 6f fc movl %ebp, -0x4(%edi) + // 9a: 89 17 movl %edx, (%edi) + // 9c: 83 c7 04 addl $0x4, %edi + // 9f: 89 5c 24 20 movl %ebx, 0x20(%esp) + // a3: 89 7c 24 1c movl %edi, 0x1c(%esp) + // a7: 89 74 24 18 movl %esi, 0x18(%esp) + // ab: 83 c4 04 addl $0x4, %esp + // ae: 5e popl %esi + // af: 5f popl %edi + // b0: 5b popl %ebx + // b1: 5d popl %ebp + // b2: e9 00 00 00 00 jmp 0xb7 <__JIT_ENTRY+0xb7> + // 000000b3: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[178] = { + 0x55, 0x53, 0x57, 0x56, 0x50, 0x8b, 0x5c, 0x24, + 0x20, 0x8b, 0x7c, 0x24, 0x1c, 0x8b, 0x74, 0x24, + 0x18, 0x8b, 0x47, 0xfc, 0x81, 0x78, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x2d, 0x83, 0x78, 0x08, + 0x02, 0x75, 0x27, 0x8b, 0x50, 0x0c, 0x8b, 0x0a, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, 0x32, + 0x8b, 0x68, 0x10, 0x8b, 0x4d, 0x00, 0x81, 0xf9, + 0xff, 0xff, 0xff, 0x3f, 0x7e, 0x35, 0x8b, 0x08, + 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7e, 0x39, + 0xeb, 0x4d, 0x89, 0x5c, 0x24, 0x20, 0x89, 0x7c, + 0x24, 0x1c, 0x89, 0x74, 0x24, 0x18, 0x83, 0xc4, + 0x04, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x89, 0x0a, 0x8b, 0x68, 0x10, + 0x8b, 0x4d, 0x00, 0x81, 0xf9, 0xff, 0xff, 0xff, + 0x3f, 0x7f, 0xcb, 0x41, 0x89, 0x4d, 0x00, 0x8b, + 0x08, 0x81, 0xf9, 0xff, 0xff, 0xff, 0x3f, 0x7f, + 0x16, 0x49, 0x89, 0x08, 0x75, 0x11, 0x50, 0x89, + 0x54, 0x24, 0x04, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x54, 0x24, 0x04, 0x83, 0xc4, 0x04, 0x89, + 0x6f, 0xfc, 0x89, 0x17, 0x83, 0xc7, 0x04, 0x89, + 0x5c, 0x24, 0x20, 0x89, 0x7c, 0x24, 0x1c, 0x89, + 0x74, 0x24, 0x18, 0x83, 0xc4, 0x04, 0x5e, 0x5f, + 0x5b, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x17, (uintptr_t)&PyTuple_Type); + patch_x86_64_32rx(code + 0x5e, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)&_Py_Dealloc + -0x4); +} + +void +emit__WITH_EXCEPT_START( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _WITH_EXCEPT_START.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 55 pushl %ebp + // 1: 53 pushl %ebx + // 2: 57 pushl %edi + // 3: 56 pushl %esi + // 4: 83 ec 20 subl $0x20, %esp + // 7: 8b 44 24 3c movl 0x3c(%esp), %eax + // b: 89 04 24 movl %eax, (%esp) + // e: 8b 5c 24 38 movl 0x38(%esp), %ebx + // 12: 8b 7c 24 34 movl 0x34(%esp), %edi + // 16: 8b 73 fc movl -0x4(%ebx), %esi + // 19: 8b 43 ec movl -0x14(%ebx), %eax + // 1c: 89 44 24 08 movl %eax, 0x8(%esp) + // 20: 8b 6b f0 movl -0x10(%ebx), %ebp + // 23: 8b 46 04 movl 0x4(%esi), %eax + // 26: 89 44 24 04 movl %eax, 0x4(%esp) + // 2a: 56 pushl %esi + // 2b: e8 00 00 00 00 calll 0x30 <__JIT_ENTRY+0x30> + // 0000002c: IMAGE_REL_I386_REL32 _PyException_GetTraceback + // 30: 83 c4 04 addl $0x4, %esp + // 33: 85 c0 testl %eax, %eax + // 35: 74 24 je 0x5b <__JIT_ENTRY+0x5b> + // 37: 89 5f 20 movl %ebx, 0x20(%edi) + // 3a: 8b 08 movl (%eax), %ecx + // 3c: 81 f9 ff ff ff 3f cmpl $0x3fffffff, %ecx # imm = 0x3FFFFFFF + // 42: 7f 12 jg 0x56 <__JIT_ENTRY+0x56> + // 44: 49 decl %ecx + // 45: 89 08 movl %ecx, (%eax) + // 47: 75 0d jne 0x56 <__JIT_ENTRY+0x56> + // 49: 50 pushl %eax + // 4a: 89 c3 movl %eax, %ebx + // 4c: e8 00 00 00 00 calll 0x51 <__JIT_ENTRY+0x51> + // 0000004d: IMAGE_REL_I386_REL32 __Py_Dealloc + // 51: 89 d8 movl %ebx, %eax + // 53: 83 c4 04 addl $0x4, %esp + // 56: 8b 5f 20 movl 0x20(%edi), %ebx + // 59: eb 05 jmp 0x60 <__JIT_ENTRY+0x60> + // 5b: b8 00 00 00 00 movl $0x0, %eax + // 0000005c: IMAGE_REL_I386_DIR32 __Py_NoneStruct + // 60: c7 44 24 0c 00 00 00 00 movl $0x0, 0xc(%esp) + // 68: 89 6c 24 10 movl %ebp, 0x10(%esp) + // 6c: 8b 4c 24 04 movl 0x4(%esp), %ecx + // 70: 89 4c 24 14 movl %ecx, 0x14(%esp) + // 74: 89 74 24 18 movl %esi, 0x18(%esp) + // 78: 89 44 24 1c movl %eax, 0x1c(%esp) + // 7c: 31 c0 xorl %eax, %eax + // 7e: 85 ed testl %ebp, %ebp + // 80: 0f 95 c0 setne %al + // 83: 89 5f 20 movl %ebx, 0x20(%edi) + // 86: 8d 88 03 00 00 80 leal -0x7ffffffd(%eax), %ecx + // 8c: c1 e0 02 shll $0x2, %eax + // 8f: f7 d8 negl %eax + // 91: 01 e0 addl %esp, %eax + // 93: 83 c0 14 addl $0x14, %eax + // 96: 6a 00 pushl $0x0 + // 98: 51 pushl %ecx + // 99: 50 pushl %eax + // 9a: ff 74 24 14 pushl 0x14(%esp) + // 9e: e8 00 00 00 00 calll 0xa3 <__JIT_ENTRY+0xa3> + // 0000009f: IMAGE_REL_I386_REL32 _PyObject_Vectorcall + // a3: 83 c4 10 addl $0x10, %esp + // a6: 8b 4f 20 movl 0x20(%edi), %ecx + // a9: c7 47 20 00 00 00 00 movl $0x0, 0x20(%edi) + // b0: 85 c0 testl %eax, %eax + // b2: 74 20 je 0xd4 <__JIT_ENTRY+0xd4> + // b4: 89 01 movl %eax, (%ecx) + // b6: 83 c1 04 addl $0x4, %ecx + // b9: 89 7c 24 34 movl %edi, 0x34(%esp) + // bd: 89 4c 24 38 movl %ecx, 0x38(%esp) + // c1: 8b 04 24 movl (%esp), %eax + // c4: 89 44 24 3c movl %eax, 0x3c(%esp) + // c8: 83 c4 20 addl $0x20, %esp + // cb: 5e popl %esi + // cc: 5f popl %edi + // cd: 5b popl %ebx + // ce: 5d popl %ebp + // cf: e9 00 00 00 00 jmp 0xd4 <__JIT_ENTRY+0xd4> + // 000000d0: IMAGE_REL_I386_REL32 __JIT_CONTINUE + // d4: 8b 04 24 movl (%esp), %eax + // d7: 89 44 24 3c movl %eax, 0x3c(%esp) + // db: 89 4c 24 38 movl %ecx, 0x38(%esp) + // df: 89 7c 24 34 movl %edi, 0x34(%esp) + // e3: 83 c4 20 addl $0x20, %esp + // e6: 5e popl %esi + // e7: 5f popl %edi + // e8: 5b popl %ebx + // e9: 5d popl %ebp + // ea: e9 00 00 00 00 jmp 0xef <__JIT_ENTRY+0xef> + // 000000eb: IMAGE_REL_I386_REL32 __JIT_ERROR_TARGET + const unsigned char code_body[239] = { + 0x55, 0x53, 0x57, 0x56, 0x83, 0xec, 0x20, 0x8b, + 0x44, 0x24, 0x3c, 0x89, 0x04, 0x24, 0x8b, 0x5c, + 0x24, 0x38, 0x8b, 0x7c, 0x24, 0x34, 0x8b, 0x73, + 0xfc, 0x8b, 0x43, 0xec, 0x89, 0x44, 0x24, 0x08, + 0x8b, 0x6b, 0xf0, 0x8b, 0x46, 0x04, 0x89, 0x44, + 0x24, 0x04, 0x56, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc4, 0x04, 0x85, 0xc0, 0x74, 0x24, 0x89, + 0x5f, 0x20, 0x8b, 0x08, 0x81, 0xf9, 0xff, 0xff, + 0xff, 0x3f, 0x7f, 0x12, 0x49, 0x89, 0x08, 0x75, + 0x0d, 0x50, 0x89, 0xc3, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xd8, 0x83, 0xc4, 0x04, 0x8b, 0x5f, + 0x20, 0xeb, 0x05, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0xc7, 0x44, 0x24, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x6c, 0x24, 0x10, 0x8b, 0x4c, 0x24, 0x04, + 0x89, 0x4c, 0x24, 0x14, 0x89, 0x74, 0x24, 0x18, + 0x89, 0x44, 0x24, 0x1c, 0x31, 0xc0, 0x85, 0xed, + 0x0f, 0x95, 0xc0, 0x89, 0x5f, 0x20, 0x8d, 0x88, + 0x03, 0x00, 0x00, 0x80, 0xc1, 0xe0, 0x02, 0xf7, + 0xd8, 0x01, 0xe0, 0x83, 0xc0, 0x14, 0x6a, 0x00, + 0x51, 0x50, 0xff, 0x74, 0x24, 0x14, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xc4, 0x10, 0x8b, 0x4f, + 0x20, 0xc7, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x20, 0x89, 0x01, 0x83, 0xc1, + 0x04, 0x89, 0x7c, 0x24, 0x34, 0x89, 0x4c, 0x24, + 0x38, 0x8b, 0x04, 0x24, 0x89, 0x44, 0x24, 0x3c, + 0x83, 0xc4, 0x20, 0x5e, 0x5f, 0x5b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x04, 0x24, 0x89, + 0x44, 0x24, 0x3c, 0x89, 0x4c, 0x24, 0x38, 0x89, + 0x7c, 0x24, 0x34, 0x83, 0xc4, 0x20, 0x5e, 0x5f, + 0x5b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)&PyException_GetTraceback + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)&_Py_Dealloc + -0x4); + patch_32(code + 0x5c, (uintptr_t)&_Py_NoneStruct); + patch_x86_64_32rx(code + 0x9f, (uintptr_t)&PyObject_Vectorcall + -0x4); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xeb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__YIELD_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _YIELD_VALUE.o: file format coff-i386 + // + // Disassembly of section .text: + // + // 00000000 <__JIT_ENTRY>: + // 0: 53 pushl %ebx + // 1: 56 pushl %esi + // 2: 8b 44 24 14 movl 0x14(%esp), %eax + // 6: 8b 54 24 0c movl 0xc(%esp), %edx + // a: 8b 74 24 10 movl 0x10(%esp), %esi + // e: 8b 4e fc movl -0x4(%esi), %ecx + // 11: 83 42 1c 02 addl $0x2, 0x1c(%edx) + // 15: 83 c6 fc addl $-0x4, %esi + // 18: bb 00 00 00 00 movl $0x0, %ebx + // 00000019: IMAGE_REL_I386_DIR32 __JIT_OPARG + // 1d: 80 c3 fe addb $-0x2, %bl + // 20: 88 5a ff movb %bl, -0x1(%edx) + // 23: 89 72 20 movl %esi, 0x20(%edx) + // 26: 8b 72 f4 movl -0xc(%edx), %esi + // 29: 89 70 4c movl %esi, 0x4c(%eax) + // 2c: c7 42 f4 00 00 00 00 movl $0x0, -0xc(%edx) + // 33: ff 40 1c incl 0x1c(%eax) + // 36: 8b 72 04 movl 0x4(%edx), %esi + // 39: 89 70 34 movl %esi, 0x34(%eax) + // 3c: c7 42 04 00 00 00 00 movl $0x0, 0x4(%edx) + // 43: 8b 56 20 movl 0x20(%esi), %edx + // 46: c7 46 20 00 00 00 00 movl $0x0, 0x20(%esi) + // 4d: 89 0a movl %ecx, (%edx) + // 4f: 83 c2 04 addl $0x4, %edx + // 52: 89 74 24 0c movl %esi, 0xc(%esp) + // 56: 89 54 24 10 movl %edx, 0x10(%esp) + // 5a: 89 44 24 14 movl %eax, 0x14(%esp) + // 5e: 5e popl %esi + // 5f: 5b popl %ebx + // 60: e9 00 00 00 00 jmp 0x65 <__JIT_ENTRY+0x65> + // 00000061: IMAGE_REL_I386_REL32 __JIT_CONTINUE + const unsigned char code_body[96] = { + 0x53, 0x56, 0x8b, 0x44, 0x24, 0x14, 0x8b, 0x54, + 0x24, 0x0c, 0x8b, 0x74, 0x24, 0x10, 0x8b, 0x4e, + 0xfc, 0x83, 0x42, 0x1c, 0x02, 0x83, 0xc6, 0xfc, + 0xbb, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xfe, + 0x88, 0x5a, 0xff, 0x89, 0x72, 0x20, 0x8b, 0x72, + 0xf4, 0x89, 0x70, 0x4c, 0xc7, 0x42, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x40, 0x1c, 0x8b, 0x72, + 0x04, 0x89, 0x70, 0x34, 0xc7, 0x42, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x56, 0x20, 0xc7, 0x46, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x89, 0x0a, 0x83, + 0xc2, 0x04, 0x89, 0x74, 0x24, 0x0c, 0x89, 0x54, + 0x24, 0x10, 0x89, 0x44, 0x24, 0x14, 0x5e, 0x5b, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32(code + 0x19, instruction->oparg); +} + +static_assert(SYMBOL_MASK_WORDS >= 1, "SYMBOL_MASK_WORDS too small"); + +typedef struct { + void (*emit)( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state); + size_t code_size; + size_t data_size; + symbol_mask trampoline_mask; +} StencilGroup; + +static const StencilGroup shim = {emit_shim, 0, 0, {0}}; + +static const StencilGroup stencil_groups[MAX_UOP_ID + 1] = { + [_BINARY_OP] = {emit__BINARY_OP, 194, 0, {0}}, + [_BINARY_OP_ADD_FLOAT] = {emit__BINARY_OP_ADD_FLOAT, 114, 0, {0}}, + [_BINARY_OP_ADD_INT] = {emit__BINARY_OP_ADD_INT, 221, 0, {0}}, + [_BINARY_OP_ADD_UNICODE] = {emit__BINARY_OP_ADD_UNICODE, 221, 0, {0}}, + [_BINARY_OP_EXTEND] = {emit__BINARY_OP_EXTEND, 149, 0, {0}}, + [_BINARY_OP_INPLACE_ADD_UNICODE] = {emit__BINARY_OP_INPLACE_ADD_UNICODE, 268, 0, {0}}, + [_BINARY_OP_MULTIPLY_FLOAT] = {emit__BINARY_OP_MULTIPLY_FLOAT, 114, 0, {0}}, + [_BINARY_OP_MULTIPLY_INT] = {emit__BINARY_OP_MULTIPLY_INT, 221, 0, {0}}, + [_BINARY_OP_SUBSCR_CHECK_FUNC] = {emit__BINARY_OP_SUBSCR_CHECK_FUNC, 138, 0, {0}}, + [_BINARY_OP_SUBSCR_DICT] = {emit__BINARY_OP_SUBSCR_DICT, 262, 0, {0}}, + [_BINARY_OP_SUBSCR_INIT_CALL] = {emit__BINARY_OP_SUBSCR_INIT_CALL, 196, 0, {0}}, + [_BINARY_OP_SUBSCR_LIST_INT] = {emit__BINARY_OP_SUBSCR_LIST_INT, 254, 0, {0}}, + [_BINARY_OP_SUBSCR_STR_INT] = {emit__BINARY_OP_SUBSCR_STR_INT, 390, 0, {0}}, + [_BINARY_OP_SUBSCR_TUPLE_INT] = {emit__BINARY_OP_SUBSCR_TUPLE_INT, 252, 0, {0}}, + [_BINARY_OP_SUBTRACT_FLOAT] = {emit__BINARY_OP_SUBTRACT_FLOAT, 114, 0, {0}}, + [_BINARY_OP_SUBTRACT_INT] = {emit__BINARY_OP_SUBTRACT_INT, 221, 0, {0}}, + [_BINARY_SLICE] = {emit__BINARY_SLICE, 220, 0, {0}}, + [_BUILD_LIST] = {emit__BUILD_LIST, 119, 0, {0}}, + [_BUILD_MAP] = {emit__BUILD_MAP, 239, 0, {0}}, + [_BUILD_SET] = {emit__BUILD_SET, 438, 0, {0}}, + [_BUILD_SLICE] = {emit__BUILD_SLICE, 236, 0, {0}}, + [_BUILD_STRING] = {emit__BUILD_STRING, 220, 0, {0}}, + [_BUILD_TUPLE] = {emit__BUILD_TUPLE, 119, 0, {0}}, + [_CALL_BUILTIN_CLASS] = {emit__CALL_BUILTIN_CLASS, 377, 0, {0}}, + [_CALL_BUILTIN_FAST] = {emit__CALL_BUILTIN_FAST, 472, 0, {0}}, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = {emit__CALL_BUILTIN_FAST_WITH_KEYWORDS, 457, 0, {0}}, + [_CALL_BUILTIN_O] = {emit__CALL_BUILTIN_O, 401, 0, {0}}, + [_CALL_INTRINSIC_1] = {emit__CALL_INTRINSIC_1, 138, 0, {0}}, + [_CALL_INTRINSIC_2] = {emit__CALL_INTRINSIC_2, 196, 0, {0}}, + [_CALL_ISINSTANCE] = {emit__CALL_ISINSTANCE, 413, 0, {0}}, + [_CALL_KW_NON_PY] = {emit__CALL_KW_NON_PY, 396, 0, {0}}, + [_CALL_LEN] = {emit__CALL_LEN, 330, 0, {0}}, + [_CALL_LIST_APPEND] = {emit__CALL_LIST_APPEND, 272, 0, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST] = {emit__CALL_METHOD_DESCRIPTOR_FAST, 462, 0, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 446, 0, {0}}, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = {emit__CALL_METHOD_DESCRIPTOR_NOARGS, 387, 0, {0}}, + [_CALL_METHOD_DESCRIPTOR_O] = {emit__CALL_METHOD_DESCRIPTOR_O, 507, 0, {0}}, + [_CALL_NON_PY_GENERAL] = {emit__CALL_NON_PY_GENERAL, 332, 0, {0}}, + [_CALL_STR_1] = {emit__CALL_STR_1, 156, 0, {0}}, + [_CALL_TUPLE_1] = {emit__CALL_TUPLE_1, 156, 0, {0}}, + [_CALL_TYPE_1] = {emit__CALL_TYPE_1, 129, 0, {0}}, + [_CHECK_AND_ALLOCATE_OBJECT] = {emit__CHECK_AND_ALLOCATE_OBJECT, 344, 0, {0}}, + [_CHECK_ATTR_CLASS] = {emit__CHECK_ATTR_CLASS, 76, 0, {0}}, + [_CHECK_ATTR_METHOD_LAZY_DICT] = {emit__CHECK_ATTR_METHOD_LAZY_DICT, 65, 0, {0}}, + [_CHECK_ATTR_MODULE_PUSH_KEYS] = {emit__CHECK_ATTR_MODULE_PUSH_KEYS, 89, 0, {0}}, + [_CHECK_ATTR_WITH_HINT] = {emit__CHECK_ATTR_WITH_HINT, 64, 0, {0}}, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 84, 0, {0}}, + [_CHECK_EG_MATCH] = {emit__CHECK_EG_MATCH, 346, 0, {0}}, + [_CHECK_EXC_MATCH] = {emit__CHECK_EXC_MATCH, 203, 0, {0}}, + [_CHECK_FUNCTION] = {emit__CHECK_FUNCTION, 61, 0, {0}}, + [_CHECK_FUNCTION_EXACT_ARGS] = {emit__CHECK_FUNCTION_EXACT_ARGS, 92, 0, {0}}, + [_CHECK_FUNCTION_VERSION] = {emit__CHECK_FUNCTION_VERSION, 88, 0, {0}}, + [_CHECK_FUNCTION_VERSION_INLINE] = {emit__CHECK_FUNCTION_VERSION_INLINE, 58, 0, {0}}, + [_CHECK_FUNCTION_VERSION_KW] = {emit__CHECK_FUNCTION_VERSION_KW, 88, 0, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE] = {emit__CHECK_IS_NOT_PY_CALLABLE, 89, 0, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = {emit__CHECK_IS_NOT_PY_CALLABLE_KW, 89, 0, {0}}, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = {emit__CHECK_MANAGED_OBJECT_HAS_VALUES, 68, 0, {0}}, + [_CHECK_METHOD_VERSION] = {emit__CHECK_METHOD_VERSION, 103, 0, {0}}, + [_CHECK_METHOD_VERSION_KW] = {emit__CHECK_METHOD_VERSION_KW, 108, 0, {0}}, + [_CHECK_PEP_523] = {emit__CHECK_PEP_523, 56, 0, {0}}, + [_CHECK_PERIODIC] = {emit__CHECK_PERIODIC, 80, 0, {0}}, + [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = {emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM, 89, 0, {0}}, + [_CHECK_STACK_SPACE] = {emit__CHECK_STACK_SPACE, 103, 0, {0}}, + [_CHECK_STACK_SPACE_OPERAND] = {emit__CHECK_STACK_SPACE_OPERAND, 82, 0, {0}}, + [_CHECK_VALIDITY] = {emit__CHECK_VALIDITY, 50, 0, {0}}, + [_CHECK_VALIDITY_AND_SET_IP] = {emit__CHECK_VALIDITY_AND_SET_IP, 57, 0, {0}}, + [_COMPARE_OP] = {emit__COMPARE_OP, 324, 0, {0}}, + [_COMPARE_OP_FLOAT] = {emit__COMPARE_OP_FLOAT, 284, 0, {0}}, + [_COMPARE_OP_INT] = {emit__COMPARE_OP_INT, 309, 0, {0}}, + [_COMPARE_OP_STR] = {emit__COMPARE_OP_STR, 206, 0, {0}}, + [_CONTAINS_OP] = {emit__CONTAINS_OP, 207, 0, {0}}, + [_CONTAINS_OP_DICT] = {emit__CONTAINS_OP_DICT, 232, 0, {0}}, + [_CONTAINS_OP_SET] = {emit__CONTAINS_OP_SET, 252, 0, {0}}, + [_CONVERT_VALUE] = {emit__CONVERT_VALUE, 145, 0, {0}}, + [_COPY] = {emit__COPY, 62, 0, {0}}, + [_COPY_FREE_VARS] = {emit__COPY_FREE_VARS, 246, 0, {0}}, + [_CREATE_INIT_FRAME] = {emit__CREATE_INIT_FRAME, 309, 0, {0}}, + [_DELETE_ATTR] = {emit__DELETE_ATTR, 140, 0, {0}}, + [_DELETE_DEREF] = {emit__DELETE_DEREF, 140, 0, {0}}, + [_DELETE_FAST] = {emit__DELETE_FAST, 161, 80, {0}}, + [_DELETE_GLOBAL] = {emit__DELETE_GLOBAL, 153, 32, {0}}, + [_DELETE_NAME] = {emit__DELETE_NAME, 176, 56, {0}}, + [_DELETE_SUBSCR] = {emit__DELETE_SUBSCR, 173, 0, {0}}, + [_DEOPT] = {emit__DEOPT, 41, 0, {0}}, + [_DICT_MERGE] = {emit__DICT_MERGE, 202, 0, {0}}, + [_DICT_UPDATE] = {emit__DICT_UPDATE, 230, 40, {0}}, + [_END_FOR] = {emit__END_FOR, 71, 0, {0}}, + [_END_SEND] = {emit__END_SEND, 80, 0, {0}}, + [_ERROR_POP_N] = {emit__ERROR_POP_N, 49, 0, {0}}, + [_EXIT_INIT_CHECK] = {emit__EXIT_INIT_CHECK, 99, 48, {0}}, + [_EXIT_TRACE] = {emit__EXIT_TRACE, 440, 0, {0}}, + [_EXPAND_METHOD] = {emit__EXPAND_METHOD, 141, 0, {0}}, + [_EXPAND_METHOD_KW] = {emit__EXPAND_METHOD_KW, 144, 0, {0}}, + [_FATAL_ERROR] = {emit__FATAL_ERROR, 15, 40, {0}}, + [_FORMAT_SIMPLE] = {emit__FORMAT_SIMPLE, 153, 0, {0}}, + [_FORMAT_WITH_SPEC] = {emit__FORMAT_WITH_SPEC, 184, 0, {0}}, + [_FOR_ITER_GEN_FRAME] = {emit__FOR_ITER_GEN_FRAME, 121, 0, {0}}, + [_FOR_ITER_TIER_TWO] = {emit__FOR_ITER_TIER_TWO, 186, 0, {0}}, + [_GET_AITER] = {emit__GET_AITER, 314, 160, {0}}, + [_GET_ANEXT] = {emit__GET_ANEXT, 86, 0, {0}}, + [_GET_AWAITABLE] = {emit__GET_AWAITABLE, 136, 0, {0}}, + [_GET_ITER] = {emit__GET_ITER, 127, 0, {0}}, + [_GET_LEN] = {emit__GET_LEN, 102, 0, {0}}, + [_GET_YIELD_FROM_ITER] = {emit__GET_YIELD_FROM_ITER, 197, 72, {0}}, + [_GUARD_BINARY_OP_EXTEND] = {emit__GUARD_BINARY_OP_EXTEND, 86, 0, {0}}, + [_GUARD_BOTH_FLOAT] = {emit__GUARD_BOTH_FLOAT, 68, 0, {0}}, + [_GUARD_BOTH_INT] = {emit__GUARD_BOTH_INT, 68, 0, {0}}, + [_GUARD_BOTH_UNICODE] = {emit__GUARD_BOTH_UNICODE, 68, 0, {0}}, + [_GUARD_BUILTINS_VERSION_PUSH_KEYS] = {emit__GUARD_BUILTINS_VERSION_PUSH_KEYS, 85, 0, {0}}, + [_GUARD_DORV_NO_DICT] = {emit__GUARD_DORV_NO_DICT, 69, 0, {0}}, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = {emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 68, 0, {0}}, + [_GUARD_GLOBALS_VERSION] = {emit__GUARD_GLOBALS_VERSION, 80, 0, {0}}, + [_GUARD_GLOBALS_VERSION_PUSH_KEYS] = {emit__GUARD_GLOBALS_VERSION_PUSH_KEYS, 85, 0, {0}}, + [_GUARD_IS_FALSE_POP] = {emit__GUARD_IS_FALSE_POP, 56, 0, {0}}, + [_GUARD_IS_NONE_POP] = {emit__GUARD_IS_NONE_POP, 97, 0, {0}}, + [_GUARD_IS_NOT_NONE_POP] = {emit__GUARD_IS_NOT_NONE_POP, 123, 0, {0}}, + [_GUARD_IS_TRUE_POP] = {emit__GUARD_IS_TRUE_POP, 56, 0, {0}}, + [_GUARD_KEYS_VERSION] = {emit__GUARD_KEYS_VERSION, 70, 0, {0}}, + [_GUARD_NOS_FLOAT] = {emit__GUARD_NOS_FLOAT, 56, 0, {0}}, + [_GUARD_NOS_INT] = {emit__GUARD_NOS_INT, 56, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_LIST] = {emit__GUARD_NOT_EXHAUSTED_LIST, 80, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_RANGE] = {emit__GUARD_NOT_EXHAUSTED_RANGE, 58, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_TUPLE] = {emit__GUARD_NOT_EXHAUSTED_TUPLE, 70, 0, {0}}, + [_GUARD_TOS_FLOAT] = {emit__GUARD_TOS_FLOAT, 56, 0, {0}}, + [_GUARD_TOS_INT] = {emit__GUARD_TOS_INT, 56, 0, {0}}, + [_GUARD_TYPE_VERSION] = {emit__GUARD_TYPE_VERSION, 67, 0, {0}}, + [_GUARD_TYPE_VERSION_AND_LOCK] = {emit__GUARD_TYPE_VERSION_AND_LOCK, 67, 0, {0}}, + [_IMPORT_FROM] = {emit__IMPORT_FROM, 108, 0, {0}}, + [_IMPORT_NAME] = {emit__IMPORT_NAME, 205, 0, {0}}, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS, 141, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS] = {emit__INIT_CALL_PY_EXACT_ARGS, 523, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_0] = {emit__INIT_CALL_PY_EXACT_ARGS_0, 210, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_1] = {emit__INIT_CALL_PY_EXACT_ARGS_1, 225, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_2] = {emit__INIT_CALL_PY_EXACT_ARGS_2, 232, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_3] = {emit__INIT_CALL_PY_EXACT_ARGS_3, 243, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_4] = {emit__INIT_CALL_PY_EXACT_ARGS_4, 250, 0, {0}}, + [_IS_NONE] = {emit__IS_NONE, 81, 0, {0}}, + [_IS_OP] = {emit__IS_OP, 160, 0, {0}}, + [_ITER_CHECK_LIST] = {emit__ITER_CHECK_LIST, 56, 0, {0}}, + [_ITER_CHECK_RANGE] = {emit__ITER_CHECK_RANGE, 56, 0, {0}}, + [_ITER_CHECK_TUPLE] = {emit__ITER_CHECK_TUPLE, 56, 0, {0}}, + [_ITER_NEXT_LIST] = {emit__ITER_NEXT_LIST, 71, 0, {0}}, + [_ITER_NEXT_RANGE] = {emit__ITER_NEXT_RANGE, 90, 0, {0}}, + [_ITER_NEXT_TUPLE] = {emit__ITER_NEXT_TUPLE, 69, 0, {0}}, + [_JUMP_TO_TOP] = {emit__JUMP_TO_TOP, 29, 0, {0}}, + [_LIST_APPEND] = {emit__LIST_APPEND, 118, 0, {0}}, + [_LIST_EXTEND] = {emit__LIST_EXTEND, 261, 48, {0}}, + [_LOAD_ATTR] = {emit__LOAD_ATTR, 281, 0, {0}}, + [_LOAD_ATTR_CLASS] = {emit__LOAD_ATTR_CLASS, 85, 0, {0}}, + [_LOAD_ATTR_INSTANCE_VALUE] = {emit__LOAD_ATTR_INSTANCE_VALUE, 126, 0, {0}}, + [_LOAD_ATTR_METHOD_LAZY_DICT] = {emit__LOAD_ATTR_METHOD_LAZY_DICT, 64, 0, {0}}, + [_LOAD_ATTR_METHOD_NO_DICT] = {emit__LOAD_ATTR_METHOD_NO_DICT, 64, 0, {0}}, + [_LOAD_ATTR_METHOD_WITH_VALUES] = {emit__LOAD_ATTR_METHOD_WITH_VALUES, 64, 0, {0}}, + [_LOAD_ATTR_MODULE] = {emit__LOAD_ATTR_MODULE, 138, 0, {0}}, + [_LOAD_ATTR_MODULE_FROM_KEYS] = {emit__LOAD_ATTR_MODULE_FROM_KEYS, 148, 0, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 101, 0, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 101, 0, {0}}, + [_LOAD_ATTR_PROPERTY_FRAME] = {emit__LOAD_ATTR_PROPERTY_FRAME, 301, 0, {0}}, + [_LOAD_ATTR_SLOT] = {emit__LOAD_ATTR_SLOT, 118, 0, {0}}, + [_LOAD_ATTR_WITH_HINT] = {emit__LOAD_ATTR_WITH_HINT, 273, 0, {0}}, + [_LOAD_BUILD_CLASS] = {emit__LOAD_BUILD_CLASS, 150, 32, {0}}, + [_LOAD_COMMON_CONSTANT] = {emit__LOAD_COMMON_CONSTANT, 56, 0, {0}}, + [_LOAD_CONST_IMMORTAL] = {emit__LOAD_CONST_IMMORTAL, 50, 0, {0}}, + [_LOAD_CONST_INLINE] = {emit__LOAD_CONST_INLINE, 56, 0, {0}}, + [_LOAD_CONST_INLINE_BORROW] = {emit__LOAD_CONST_INLINE_BORROW, 33, 0, {0}}, + [_LOAD_CONST_MORTAL] = {emit__LOAD_CONST_MORTAL, 63, 0, {0}}, + [_LOAD_DEREF] = {emit__LOAD_DEREF, 114, 0, {0}}, + [_LOAD_FAST] = {emit__LOAD_FAST, 58, 0, {0}}, + [_LOAD_FAST_0] = {emit__LOAD_FAST_0, 49, 0, {0}}, + [_LOAD_FAST_1] = {emit__LOAD_FAST_1, 49, 0, {0}}, + [_LOAD_FAST_2] = {emit__LOAD_FAST_2, 49, 0, {0}}, + [_LOAD_FAST_3] = {emit__LOAD_FAST_3, 49, 0, {0}}, + [_LOAD_FAST_4] = {emit__LOAD_FAST_4, 49, 0, {0}}, + [_LOAD_FAST_5] = {emit__LOAD_FAST_5, 49, 0, {0}}, + [_LOAD_FAST_6] = {emit__LOAD_FAST_6, 49, 0, {0}}, + [_LOAD_FAST_7] = {emit__LOAD_FAST_7, 49, 0, {0}}, + [_LOAD_FAST_AND_CLEAR] = {emit__LOAD_FAST_AND_CLEAR, 53, 0, {0}}, + [_LOAD_FAST_CHECK] = {emit__LOAD_FAST_CHECK, 134, 80, {0}}, + [_LOAD_FROM_DICT_OR_DEREF] = {emit__LOAD_FROM_DICT_OR_DEREF, 239, 0, {0}}, + [_LOAD_GLOBAL] = {emit__LOAD_GLOBAL, 113, 0, {0}}, + [_LOAD_GLOBAL_BUILTINS] = {emit__LOAD_GLOBAL_BUILTINS, 108, 0, {0}}, + [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = {emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS, 106, 0, {0}}, + [_LOAD_GLOBAL_MODULE] = {emit__LOAD_GLOBAL_MODULE, 108, 0, {0}}, + [_LOAD_GLOBAL_MODULE_FROM_KEYS] = {emit__LOAD_GLOBAL_MODULE_FROM_KEYS, 106, 0, {0}}, + [_LOAD_LOCALS] = {emit__LOAD_LOCALS, 110, 16, {0}}, + [_LOAD_NAME] = {emit__LOAD_NAME, 102, 0, {0}}, + [_LOAD_SMALL_INT] = {emit__LOAD_SMALL_INT, 48, 0, {0}}, + [_LOAD_SMALL_INT_0] = {emit__LOAD_SMALL_INT_0, 33, 0, {0}}, + [_LOAD_SMALL_INT_1] = {emit__LOAD_SMALL_INT_1, 33, 0, {0}}, + [_LOAD_SMALL_INT_2] = {emit__LOAD_SMALL_INT_2, 33, 0, {0}}, + [_LOAD_SMALL_INT_3] = {emit__LOAD_SMALL_INT_3, 33, 0, {0}}, + [_LOAD_SPECIAL] = {emit__LOAD_SPECIAL, 181, 0, {0}}, + [_LOAD_SUPER_ATTR_ATTR] = {emit__LOAD_SUPER_ATTR_ATTR, 284, 0, {0}}, + [_LOAD_SUPER_ATTR_METHOD] = {emit__LOAD_SUPER_ATTR_METHOD, 368, 0, {0}}, + [_MAKE_CALLARGS_A_TUPLE] = {emit__MAKE_CALLARGS_A_TUPLE, 187, 0, {0}}, + [_MAKE_CELL] = {emit__MAKE_CELL, 130, 0, {0}}, + [_MAKE_FUNCTION] = {emit__MAKE_FUNCTION, 168, 0, {0}}, + [_MAKE_WARM] = {emit__MAKE_WARM, 52, 0, {0}}, + [_MAP_ADD] = {emit__MAP_ADD, 108, 0, {0}}, + [_MATCH_CLASS] = {emit__MATCH_CLASS, 270, 0, {0}}, + [_MATCH_KEYS] = {emit__MATCH_KEYS, 91, 0, {0}}, + [_MATCH_MAPPING] = {emit__MATCH_MAPPING, 56, 0, {0}}, + [_MATCH_SEQUENCE] = {emit__MATCH_SEQUENCE, 56, 0, {0}}, + [_MAYBE_EXPAND_METHOD] = {emit__MAYBE_EXPAND_METHOD, 177, 0, {0}}, + [_MAYBE_EXPAND_METHOD_KW] = {emit__MAYBE_EXPAND_METHOD_KW, 208, 0, {0}}, + [_NOP] = {emit__NOP, 24, 0, {0}}, + [_POP_EXCEPT] = {emit__POP_EXCEPT, 95, 0, {0}}, + [_POP_TOP] = {emit__POP_TOP, 60, 0, {0}}, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = {emit__POP_TOP_LOAD_CONST_INLINE_BORROW, 80, 0, {0}}, + [_PUSH_EXC_INFO] = {emit__PUSH_EXC_INFO, 73, 0, {0}}, + [_PUSH_FRAME] = {emit__PUSH_FRAME, 51, 0, {0}}, + [_PUSH_NULL] = {emit__PUSH_NULL, 33, 0, {0}}, + [_PUSH_NULL_CONDITIONAL] = {emit__PUSH_NULL_CONDITIONAL, 49, 0, {0}}, + [_PY_FRAME_GENERAL] = {emit__PY_FRAME_GENERAL, 204, 0, {0}}, + [_PY_FRAME_KW] = {emit__PY_FRAME_KW, 252, 0, {0}}, + [_REPLACE_WITH_TRUE] = {emit__REPLACE_WITH_TRUE, 64, 0, {0}}, + [_RESUME_CHECK] = {emit__RESUME_CHECK, 62, 0, {0}}, + [_RETURN_GENERATOR] = {emit__RETURN_GENERATOR, 398, 0, {0}}, + [_RETURN_VALUE] = {emit__RETURN_VALUE, 73, 0, {0}}, + [_SAVE_RETURN_OFFSET] = {emit__SAVE_RETURN_OFFSET, 35, 0, {0}}, + [_SEND_GEN_FRAME] = {emit__SEND_GEN_FRAME, 135, 0, {0}}, + [_SETUP_ANNOTATIONS] = {emit__SETUP_ANNOTATIONS, 282, 48, {0}}, + [_SET_ADD] = {emit__SET_ADD, 140, 0, {0}}, + [_SET_FUNCTION_ATTRIBUTE] = {emit__SET_FUNCTION_ATTRIBUTE, 63, 0, {0}}, + [_SET_IP] = {emit__SET_IP, 31, 0, {0}}, + [_SET_UPDATE] = {emit__SET_UPDATE, 145, 0, {0}}, + [_START_EXECUTOR] = {emit__START_EXECUTOR, 85, 0, {0}}, + [_STORE_ATTR] = {emit__STORE_ATTR, 194, 0, {0}}, + [_STORE_ATTR_INSTANCE_VALUE] = {emit__STORE_ATTR_INSTANCE_VALUE, 220, 0, {0}}, + [_STORE_ATTR_SLOT] = {emit__STORE_ATTR_SLOT, 119, 0, {0}}, + [_STORE_ATTR_WITH_HINT] = {emit__STORE_ATTR_WITH_HINT, 378, 0, {0}}, + [_STORE_DEREF] = {emit__STORE_DEREF, 93, 0, {0}}, + [_STORE_FAST] = {emit__STORE_FAST, 93, 0, {0}}, + [_STORE_FAST_0] = {emit__STORE_FAST_0, 81, 0, {0}}, + [_STORE_FAST_1] = {emit__STORE_FAST_1, 81, 0, {0}}, + [_STORE_FAST_2] = {emit__STORE_FAST_2, 81, 0, {0}}, + [_STORE_FAST_3] = {emit__STORE_FAST_3, 81, 0, {0}}, + [_STORE_FAST_4] = {emit__STORE_FAST_4, 81, 0, {0}}, + [_STORE_FAST_5] = {emit__STORE_FAST_5, 81, 0, {0}}, + [_STORE_FAST_6] = {emit__STORE_FAST_6, 81, 0, {0}}, + [_STORE_FAST_7] = {emit__STORE_FAST_7, 81, 0, {0}}, + [_STORE_GLOBAL] = {emit__STORE_GLOBAL, 142, 0, {0}}, + [_STORE_NAME] = {emit__STORE_NAME, 239, 32, {0}}, + [_STORE_SLICE] = {emit__STORE_SLICE, 282, 0, {0}}, + [_STORE_SUBSCR] = {emit__STORE_SUBSCR, 222, 0, {0}}, + [_STORE_SUBSCR_DICT] = {emit__STORE_SUBSCR_DICT, 162, 0, {0}}, + [_STORE_SUBSCR_LIST_INT] = {emit__STORE_SUBSCR_LIST_INT, 270, 0, {0}}, + [_SWAP] = {emit__SWAP, 58, 0, {0}}, + [_TIER2_RESUME_CHECK] = {emit__TIER2_RESUME_CHECK, 51, 0, {0}}, + [_TO_BOOL] = {emit__TO_BOOL, 140, 0, {0}}, + [_TO_BOOL_BOOL] = {emit__TO_BOOL_BOOL, 56, 0, {0}}, + [_TO_BOOL_INT] = {emit__TO_BOOL_INT, 113, 0, {0}}, + [_TO_BOOL_LIST] = {emit__TO_BOOL_LIST, 110, 0, {0}}, + [_TO_BOOL_NONE] = {emit__TO_BOOL_NONE, 57, 0, {0}}, + [_TO_BOOL_STR] = {emit__TO_BOOL_STR, 111, 0, {0}}, + [_UNARY_INVERT] = {emit__UNARY_INVERT, 127, 0, {0}}, + [_UNARY_NEGATIVE] = {emit__UNARY_NEGATIVE, 127, 0, {0}}, + [_UNARY_NOT] = {emit__UNARY_NOT, 51, 0, {0}}, + [_UNPACK_EX] = {emit__UNPACK_EX, 192, 0, {0}}, + [_UNPACK_SEQUENCE] = {emit__UNPACK_SEQUENCE, 164, 0, {0}}, + [_UNPACK_SEQUENCE_LIST] = {emit__UNPACK_SEQUENCE_LIST, 292, 0, {0}}, + [_UNPACK_SEQUENCE_TUPLE] = {emit__UNPACK_SEQUENCE_TUPLE, 263, 0, {0}}, + [_UNPACK_SEQUENCE_TWO_TUPLE] = {emit__UNPACK_SEQUENCE_TWO_TUPLE, 178, 0, {0}}, + [_WITH_EXCEPT_START] = {emit__WITH_EXCEPT_START, 239, 0, {0}}, + [_YIELD_VALUE] = {emit__YIELD_VALUE, 96, 0, {0}}, +}; + +static const void * const symbols_map[1] = { + 0 +}; diff --git a/Tools/jit/stencils/x86_64-apple-darwin.h b/Tools/jit/stencils/x86_64-apple-darwin.h new file mode 100644 index 00000000000000..81776ab1ed7c12 --- /dev/null +++ b/Tools/jit/stencils/x86_64-apple-darwin.h @@ -0,0 +1,22976 @@ +void +emit_shim( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // shim.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 41 57 pushq %r15 + // 6: 41 56 pushq %r14 + // 8: 41 55 pushq %r13 + // a: 41 54 pushq %r12 + // c: 53 pushq %rbx + // d: 50 pushq %rax + // e: 49 89 fc movq %rdi, %r12 + // 11: 49 89 f5 movq %rsi, %r13 + // 14: 49 89 d6 movq %rdx, %r14 + // 17: e8 00 00 00 00 callq 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1c: 48 83 c4 08 addq $0x8, %rsp + // 20: 5b popq %rbx + // 21: 41 5c popq %r12 + // 23: 41 5d popq %r13 + // 25: 41 5e popq %r14 + // 27: 41 5f popq %r15 + // 29: 5d popq %rbp + // 2a: c3 retq + const unsigned char code_body[43] = { + 0x55, 0x48, 0x89, 0xe5, 0x41, 0x57, 0x41, 0x56, + 0x41, 0x55, 0x41, 0x54, 0x53, 0x50, 0x49, 0x89, + 0xfc, 0x49, 0x89, 0xf5, 0x49, 0x89, 0xd6, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x08, + 0x5b, 0x41, 0x5c, 0x41, 0x5d, 0x41, 0x5e, 0x41, + 0x5f, 0x5d, 0xc3, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x18, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__BINARY_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 20: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_GOT_LOAD __PyEval_BinaryOps@GOTPCREL + // 27: 4c 89 ff movq %r15, %rdi + // 2a: 48 89 de movq %rbx, %rsi + // 2d: ff 14 c1 callq *(%rcx,%rax,8) + // 30: 49 89 c6 movq %rax, %r14 + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 41 8b 07 movl (%r15), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 10 js 0x58 <__JIT_ENTRY+0x58> + // 48: ff c8 decl %eax + // 4a: 41 89 07 movl %eax, (%r15) + // 4d: 75 09 jne 0x58 <__JIT_ENTRY+0x58> + // 4f: 4c 89 ff movq %r15, %rdi + // 52: ff 15 00 00 00 00 callq *(%rip) ## 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 58: 8b 03 movl (%rbx), %eax + // 5a: 85 c0 testl %eax, %eax + // 5c: 78 06 js 0x64 <__JIT_ENTRY+0x64> + // 5e: ff c8 decl %eax + // 60: 89 03 movl %eax, (%rbx) + // 62: 74 1b je 0x7f <__JIT_ENTRY+0x7f> + // 64: 4d 85 f6 testq %r14, %r14 + // 67: 74 24 je 0x8d <__JIT_ENTRY+0x8d> + // 69: 4d 89 75 f0 movq %r14, -0x10(%r13) + // 6d: 49 83 c5 f8 addq $-0x8, %r13 + // 71: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 75: 48 83 c4 10 addq $0x10, %rsp + // 79: 5d popq %rbp + // 7a: e9 00 00 00 00 jmp 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 7f: 48 89 df movq %rbx, %rdi + // 82: ff 15 00 00 00 00 callq *(%rip) ## 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 88: 4d 85 f6 testq %r14, %r14 + // 8b: 75 dc jne 0x69 <__JIT_ENTRY+0x69> + // 8d: 49 83 c5 f0 addq $-0x10, %r13 + // 91: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 95: 48 83 c4 10 addq $0x10, %rsp + // 99: 5d popq %rbp + // 9a: e9 00 00 00 00 jmp 0x9f <__JIT_ENTRY+0x9f> + // 000000000000009b: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[159] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xff, 0x48, 0x89, 0xde, 0xff, 0x14, 0xc1, + 0x49, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, + 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x03, 0x74, 0x1b, 0x4d, 0x85, 0xf6, 0x74, + 0x24, 0x4d, 0x89, 0x75, 0xf0, 0x49, 0x83, 0xc5, + 0xf8, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x85, 0xf6, 0x75, 0xdc, 0x49, 0x83, 0xc5, + 0xf0, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_BinaryOps+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_BinaryOps); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + -0x4); + patch_32r(code + 0x7b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + -0x4); + patch_32r(code + 0x9b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_ADD_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 49 8d 5d f0 leaq -0x10(%r13), %rbx + // 10: f2 0f 10 47 10 movsd 0x10(%rdi), %xmm0 + // 15: f2 0f 58 46 10 addsd 0x10(%rsi), %xmm0 + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyFloat_FromDouble_ConsumeInputs@GOTPCREL + // 20: 48 85 c0 testq %rax, %rax + // 23: 74 0d je 0x32 <__JIT_ENTRY+0x32> + // 25: 49 83 c5 f8 addq $-0x8, %r13 + // 29: 48 89 03 movq %rax, (%rbx) + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 32: 49 89 dd movq %rbx, %r13 + // 35: 5d popq %rbp + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[59] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8d, 0x5d, 0xf0, + 0xf2, 0x0f, 0x10, 0x47, 0x10, 0xf2, 0x0f, 0x58, + 0x46, 0x10, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x0d, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x89, 0x03, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0xdd, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_32r(code + 0x2e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x37, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_ADD_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4c 89 ff movq %r15, %rdi + // 17: 48 89 de movq %rbx, %rsi + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyLong_Add@GOTPCREL + // 20: 49 89 c6 movq %rax, %r14 + // 23: 8b 03 movl (%rbx), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 33 js 0x5c <__JIT_ENTRY+0x5c> + // 29: ff c8 decl %eax + // 2b: 89 03 movl %eax, (%rbx) + // 2d: 75 2d jne 0x5c <__JIT_ENTRY+0x5c> + // 2f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 36: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 3d: 48 85 c0 testq %rax, %rax + // 40: 74 11 je 0x53 <__JIT_ENTRY+0x53> + // 42: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 49: 48 89 df movq %rbx, %rdi + // 4c: be 01 00 00 00 movl $0x1, %esi + // 51: ff d0 callq *%rax + // 53: 48 89 df movq %rbx, %rdi + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // 5c: 41 8b 07 movl (%r15), %eax + // 5f: 85 c0 testl %eax, %eax + // 61: 78 07 js 0x6a <__JIT_ENTRY+0x6a> + // 63: ff c8 decl %eax + // 65: 41 89 07 movl %eax, (%r15) + // 68: 74 1e je 0x88 <__JIT_ENTRY+0x88> + // 6a: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 6e: 4d 85 f6 testq %r14, %r14 + // 71: 74 4b je 0xbe <__JIT_ENTRY+0xbe> + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 4c 89 30 movq %r14, (%rax) + // 7a: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 7e: 48 83 c4 10 addq $0x10, %rsp + // 82: 5d popq %rbp + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 88: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x8f <__JIT_ENTRY+0x8f> + // 000000000000008b: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 8f: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 96: 48 85 c0 testq %rax, %rax + // 99: 74 11 je 0xac <__JIT_ENTRY+0xac> + // 9b: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // a2: 4c 89 ff movq %r15, %rdi + // a5: be 01 00 00 00 movl $0x1, %esi + // aa: ff d0 callq *%rax + // ac: 4c 89 ff movq %r15, %rdi + // af: ff 15 00 00 00 00 callq *(%rip) ## 0xb5 <__JIT_ENTRY+0xb5> + // 00000000000000b1: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // b5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // b9: 4d 85 f6 testq %r14, %r14 + // bc: 75 b5 jne 0x73 <__JIT_ENTRY+0x73> + // be: 49 89 c5 movq %rax, %r13 + // c1: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // c5: 48 83 c4 10 addq $0x10, %rsp + // c9: 5d popq %rbp + // ca: e9 00 00 00 00 jmp 0xcf <__JIT_ENTRY+0xcf> + // 00000000000000cb: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[207] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4c, 0x89, 0xff, 0x48, + 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x74, 0x1e, 0x49, 0x8d, 0x45, 0xf0, 0x4d, 0x85, + 0xf6, 0x74, 0x4b, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x89, 0x30, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x4d, 0x85, 0xf6, 0x75, 0xb5, 0x49, 0x89, + 0xc5, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_ExactDealloc+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_Add+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_Add); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_32r(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + -0x4); + patch_32r(code + 0xcb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_UNICODE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4c 89 ff movq %r15, %rdi + // 17: 48 89 de movq %rbx, %rsi + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT _PyUnicode_Concat@GOTPCREL + // 20: 49 89 c6 movq %rax, %r14 + // 23: 8b 03 movl (%rbx), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 33 js 0x5c <__JIT_ENTRY+0x5c> + // 29: ff c8 decl %eax + // 2b: 89 03 movl %eax, (%rbx) + // 2d: 75 2d jne 0x5c <__JIT_ENTRY+0x5c> + // 2f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 36: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 3d: 48 85 c0 testq %rax, %rax + // 40: 74 11 je 0x53 <__JIT_ENTRY+0x53> + // 42: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 49: 48 89 df movq %rbx, %rdi + // 4c: be 01 00 00 00 movl $0x1, %esi + // 51: ff d0 callq *%rax + // 53: 48 89 df movq %rbx, %rdi + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __PyUnicode_ExactDealloc@GOTPCREL + // 5c: 41 8b 07 movl (%r15), %eax + // 5f: 85 c0 testl %eax, %eax + // 61: 78 07 js 0x6a <__JIT_ENTRY+0x6a> + // 63: ff c8 decl %eax + // 65: 41 89 07 movl %eax, (%r15) + // 68: 74 1e je 0x88 <__JIT_ENTRY+0x88> + // 6a: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 6e: 4d 85 f6 testq %r14, %r14 + // 71: 74 4b je 0xbe <__JIT_ENTRY+0xbe> + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 4c 89 30 movq %r14, (%rax) + // 7a: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 7e: 48 83 c4 10 addq $0x10, %rsp + // 82: 5d popq %rbp + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 88: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x8f <__JIT_ENTRY+0x8f> + // 000000000000008b: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 8f: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 96: 48 85 c0 testq %rax, %rax + // 99: 74 11 je 0xac <__JIT_ENTRY+0xac> + // 9b: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // a2: 4c 89 ff movq %r15, %rdi + // a5: be 01 00 00 00 movl $0x1, %esi + // aa: ff d0 callq *%rax + // ac: 4c 89 ff movq %r15, %rdi + // af: ff 15 00 00 00 00 callq *(%rip) ## 0xb5 <__JIT_ENTRY+0xb5> + // 00000000000000b1: X86_64_RELOC_GOT __PyUnicode_ExactDealloc@GOTPCREL + // b5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // b9: 4d 85 f6 testq %r14, %r14 + // bc: 75 b5 jne 0x73 <__JIT_ENTRY+0x73> + // be: 49 89 c5 movq %rax, %r13 + // c1: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // c5: 48 83 c4 10 addq $0x10, %rsp + // c9: 5d popq %rbp + // ca: e9 00 00 00 00 jmp 0xcf <__JIT_ENTRY+0xcf> + // 00000000000000cb: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[207] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4c, 0x89, 0xff, 0x48, + 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x74, 0x1e, 0x49, 0x8d, 0x45, 0xf0, 0x4d, 0x85, + 0xf6, 0x74, 0x4b, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x89, 0x30, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x4d, 0x85, 0xf6, 0x75, 0xb5, 0x49, 0x89, + 0xc5, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyUnicode_ExactDealloc+0x0 + // 8: &_PyRuntime+0x0 + // 10: &PyUnicode_Concat+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&PyUnicode_Concat); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_32r(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + -0x4); + patch_32r(code + 0xcb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_EXTEND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 20: 4c 89 ff movq %r15, %rdi + // 23: 48 89 de movq %rbx, %rsi + // 26: ff 50 10 callq *0x10(%rax) + // 29: 49 89 c6 movq %rax, %r14 + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 41 8b 07 movl (%r15), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 10 js 0x51 <__JIT_ENTRY+0x51> + // 41: ff c8 decl %eax + // 43: 41 89 07 movl %eax, (%r15) + // 46: 75 09 jne 0x51 <__JIT_ENTRY+0x51> + // 48: 4c 89 ff movq %r15, %rdi + // 4b: ff 15 00 00 00 00 callq *(%rip) ## 0x51 <__JIT_ENTRY+0x51> + // 000000000000004d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 51: 8b 03 movl (%rbx), %eax + // 53: 85 c0 testl %eax, %eax + // 55: 78 0f js 0x66 <__JIT_ENTRY+0x66> + // 57: ff c8 decl %eax + // 59: 89 03 movl %eax, (%rbx) + // 5b: 75 09 jne 0x66 <__JIT_ENTRY+0x66> + // 5d: 48 89 df movq %rbx, %rdi + // 60: ff 15 00 00 00 00 callq *(%rip) ## 0x66 <__JIT_ENTRY+0x66> + // 0000000000000062: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 66: 4d 89 75 f0 movq %r14, -0x10(%r13) + // 6a: 49 83 c5 f8 addq $-0x8, %r13 + // 6e: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 72: 48 83 c4 10 addq $0x10, %rsp + // 76: 5d popq %rbp + // 77: e9 00 00 00 00 jmp 0x7c <__JIT_ENTRY+0x7c> + // 0000000000000078: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[119] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xff, 0x48, 0x89, 0xde, 0xff, 0x50, + 0x10, 0x49, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x75, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x4c, 0x8b, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)data + -0x4); +} + +void +emit__BINARY_OP_INPLACE_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_INPLACE_ADD_UNICODE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // c: 48 63 1d 00 00 00 00 movslq (%rip), %rbx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 13: 4d 39 7c dc 50 cmpq %r15, 0x50(%r12,%rbx,8) + // 18: 74 0a je 0x24 <__JIT_ENTRY+0x24> + // 1a: 48 83 c4 10 addq $0x10, %rsp + // 1e: 5d popq %rbp + // 1f: e9 00 00 00 00 jmp 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 24: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // 28: 4d 8b 75 f8 movq -0x8(%r13), %r14 + // 2c: 41 8b 07 movl (%r15), %eax + // 2f: 85 c0 testl %eax, %eax + // 31: 78 34 js 0x67 <__JIT_ENTRY+0x67> + // 33: ff c8 decl %eax + // 35: 41 89 07 movl %eax, (%r15) + // 38: 75 2d jne 0x67 <__JIT_ENTRY+0x67> + // 3a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 41: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 48: 48 85 c0 testq %rax, %rax + // 4b: 74 11 je 0x5e <__JIT_ENTRY+0x5e> + // 4d: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 54: 4c 89 ff movq %r15, %rdi + // 57: be 01 00 00 00 movl $0x1, %esi + // 5c: ff d0 callq *%rax + // 5e: 4c 89 ff movq %r15, %rdi + // 61: ff 15 00 00 00 00 callq *(%rip) ## 0x67 <__JIT_ENTRY+0x67> + // 0000000000000063: X86_64_RELOC_GOT __PyUnicode_ExactDealloc@GOTPCREL + // 67: 49 8b 44 dc 50 movq 0x50(%r12,%rbx,8), %rax + // 6c: 48 89 45 f0 movq %rax, -0x10(%rbp) + // 70: 48 8d 7d f0 leaq -0x10(%rbp), %rdi + // 74: 4c 89 f6 movq %r14, %rsi + // 77: ff 15 00 00 00 00 callq *(%rip) ## 0x7d <__JIT_ENTRY+0x7d> + // 0000000000000079: X86_64_RELOC_GOT _PyUnicode_Append@GOTPCREL + // 7d: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 81: 49 89 44 dc 50 movq %rax, 0x50(%r12,%rbx,8) + // 86: 41 8b 0e movl (%r14), %ecx + // 89: 85 c9 testl %ecx, %ecx + // 8b: 78 39 js 0xc6 <__JIT_ENTRY+0xc6> + // 8d: ff c9 decl %ecx + // 8f: 41 89 0e movl %ecx, (%r14) + // 92: 75 2d jne 0xc1 <__JIT_ENTRY+0xc1> + // 94: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x9b <__JIT_ENTRY+0x9b> + // 0000000000000097: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 9b: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // a2: 48 85 c0 testq %rax, %rax + // a5: 74 11 je 0xb8 <__JIT_ENTRY+0xb8> + // a7: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // ae: 4c 89 f7 movq %r14, %rdi + // b1: be 01 00 00 00 movl $0x1, %esi + // b6: ff d0 callq *%rax + // b8: 4c 89 f7 movq %r14, %rdi + // bb: ff 15 00 00 00 00 callq *(%rip) ## 0xc1 <__JIT_ENTRY+0xc1> + // 00000000000000bd: X86_64_RELOC_GOT __PyUnicode_ExactDealloc@GOTPCREL + // c1: 49 8b 44 dc 50 movq 0x50(%r12,%rbx,8), %rax + // c6: 49 83 c5 f0 addq $-0x10, %r13 + // ca: 48 85 c0 testq %rax, %rax + // cd: 74 0e je 0xdd <__JIT_ENTRY+0xdd> + // cf: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // d3: 48 83 c4 10 addq $0x10, %rsp + // d7: 5d popq %rbp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 00000000000000d9: X86_64_RELOC_BRANCH __JIT_CONTINUE + // dd: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // e1: 48 83 c4 10 addq $0x10, %rsp + // e5: 5d popq %rbp + // e6: e9 00 00 00 00 jmp 0xeb <__JIT_ENTRY+0xeb> + // 00000000000000e7: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[235] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4d, 0x8b, 0x7d, 0xf0, 0x48, 0x63, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x39, 0x7c, 0xdc, 0x50, + 0x74, 0x0a, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x75, 0xf8, + 0x4d, 0x8b, 0x75, 0xf8, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x34, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, + 0x48, 0x26, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x44, 0xdc, 0x50, 0x48, 0x89, 0x45, 0xf0, + 0x48, 0x8d, 0x7d, 0xf0, 0x4c, 0x89, 0xf6, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, + 0xf0, 0x49, 0x89, 0x44, 0xdc, 0x50, 0x41, 0x8b, + 0x0e, 0x85, 0xc9, 0x78, 0x39, 0xff, 0xc9, 0x41, + 0x89, 0x0e, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x40, 0x26, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, + 0x8b, 0x91, 0x48, 0x26, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0xbe, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, + 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x44, 0xdc, 0x50, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x85, 0xc0, 0x74, 0x0e, 0x4c, + 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x75, + 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyUnicode_ExactDealloc+0x0 + // 8: &_PyRuntime+0x0 + // 10: &PyUnicode_Append+0x0 + // 18: OPERAND0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&PyUnicode_Append); + patch_64(data + 0x18, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x14); + patch_32r(code + 0x20, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + -0x4); + patch_32r(code + 0xd9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xe7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_MULTIPLY_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 49 8d 5d f0 leaq -0x10(%r13), %rbx + // 10: f2 0f 10 47 10 movsd 0x10(%rdi), %xmm0 + // 15: f2 0f 59 46 10 mulsd 0x10(%rsi), %xmm0 + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyFloat_FromDouble_ConsumeInputs@GOTPCREL + // 20: 48 85 c0 testq %rax, %rax + // 23: 74 0d je 0x32 <__JIT_ENTRY+0x32> + // 25: 49 83 c5 f8 addq $-0x8, %r13 + // 29: 48 89 03 movq %rax, (%rbx) + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 32: 49 89 dd movq %rbx, %r13 + // 35: 5d popq %rbp + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[59] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8d, 0x5d, 0xf0, + 0xf2, 0x0f, 0x10, 0x47, 0x10, 0xf2, 0x0f, 0x59, + 0x46, 0x10, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x0d, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x89, 0x03, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0xdd, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_32r(code + 0x2e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x37, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_MULTIPLY_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4c 89 ff movq %r15, %rdi + // 17: 48 89 de movq %rbx, %rsi + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyLong_Multiply@GOTPCREL + // 20: 49 89 c6 movq %rax, %r14 + // 23: 8b 03 movl (%rbx), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 33 js 0x5c <__JIT_ENTRY+0x5c> + // 29: ff c8 decl %eax + // 2b: 89 03 movl %eax, (%rbx) + // 2d: 75 2d jne 0x5c <__JIT_ENTRY+0x5c> + // 2f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 36: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 3d: 48 85 c0 testq %rax, %rax + // 40: 74 11 je 0x53 <__JIT_ENTRY+0x53> + // 42: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 49: 48 89 df movq %rbx, %rdi + // 4c: be 01 00 00 00 movl $0x1, %esi + // 51: ff d0 callq *%rax + // 53: 48 89 df movq %rbx, %rdi + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // 5c: 41 8b 07 movl (%r15), %eax + // 5f: 85 c0 testl %eax, %eax + // 61: 78 07 js 0x6a <__JIT_ENTRY+0x6a> + // 63: ff c8 decl %eax + // 65: 41 89 07 movl %eax, (%r15) + // 68: 74 1e je 0x88 <__JIT_ENTRY+0x88> + // 6a: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 6e: 4d 85 f6 testq %r14, %r14 + // 71: 74 4b je 0xbe <__JIT_ENTRY+0xbe> + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 4c 89 30 movq %r14, (%rax) + // 7a: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 7e: 48 83 c4 10 addq $0x10, %rsp + // 82: 5d popq %rbp + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 88: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x8f <__JIT_ENTRY+0x8f> + // 000000000000008b: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 8f: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 96: 48 85 c0 testq %rax, %rax + // 99: 74 11 je 0xac <__JIT_ENTRY+0xac> + // 9b: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // a2: 4c 89 ff movq %r15, %rdi + // a5: be 01 00 00 00 movl $0x1, %esi + // aa: ff d0 callq *%rax + // ac: 4c 89 ff movq %r15, %rdi + // af: ff 15 00 00 00 00 callq *(%rip) ## 0xb5 <__JIT_ENTRY+0xb5> + // 00000000000000b1: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // b5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // b9: 4d 85 f6 testq %r14, %r14 + // bc: 75 b5 jne 0x73 <__JIT_ENTRY+0x73> + // be: 49 89 c5 movq %rax, %r13 + // c1: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // c5: 48 83 c4 10 addq $0x10, %rsp + // c9: 5d popq %rbp + // ca: e9 00 00 00 00 jmp 0xcf <__JIT_ENTRY+0xcf> + // 00000000000000cb: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[207] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4c, 0x89, 0xff, 0x48, + 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x74, 0x1e, 0x49, 0x8d, 0x45, 0xf0, 0x4d, 0x85, + 0xf6, 0x74, 0x4b, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x89, 0x30, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x4d, 0x85, 0xf6, 0x75, 0xb5, 0x49, 0x89, + 0xc5, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_ExactDealloc+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_Multiply+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_Multiply); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_32r(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + -0x4); + patch_32r(code + 0xcb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_CHECK_FUNC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_CHECK_FUNC.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: f6 81 a9 00 00 00 02 testb $0x2, 0xa9(%rcx) + // 13: 74 59 je 0x6e <__JIT_ENTRY+0x6e> + // 15: 48 8b 81 90 03 00 00 movq 0x390(%rcx), %rax + // 1c: 48 85 c0 testq %rax, %rax + // 1f: 74 4d je 0x6e <__JIT_ENTRY+0x6e> + // 21: 8b 90 90 00 00 00 movl 0x90(%rax), %edx + // 27: 3b 91 98 03 00 00 cmpl 0x398(%rcx), %edx + // 2d: 75 3f jne 0x6e <__JIT_ENTRY+0x6e> + // 2f: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 36: 48 85 c9 testq %rcx, %rcx + // 39: 74 33 je 0x6e <__JIT_ENTRY+0x6e> + // 3b: 48 8b 50 30 movq 0x30(%rax), %rdx + // 3f: 48 63 52 4c movslq 0x4c(%rdx), %rdx + // 43: 49 8b b6 f8 00 00 00 movq 0xf8(%r14), %rsi + // 4a: 48 29 ce subq %rcx, %rsi + // 4d: 48 c1 fe 03 sarq $0x3, %rsi + // 51: 48 39 d6 cmpq %rdx, %rsi + // 54: 7e 18 jle 0x6e <__JIT_ENTRY+0x6e> + // 56: 8b 08 movl (%rax), %ecx + // 58: 85 c9 testl %ecx, %ecx + // 5a: 78 04 js 0x60 <__JIT_ENTRY+0x60> + // 5c: ff c1 incl %ecx + // 5e: 89 08 movl %ecx, (%rax) + // 60: 49 89 45 00 movq %rax, (%r13) + // 64: 49 83 c5 08 addq $0x8, %r13 + // 68: 5d popq %rbp + // 69: e9 00 00 00 00 jmp 0x6e <__JIT_ENTRY+0x6e> + // 000000000000006a: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6e: 5d popq %rbp + // 6f: e9 00 00 00 00 jmp 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[116] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x48, 0x08, 0xf6, 0x81, 0xa9, 0x00, + 0x00, 0x00, 0x02, 0x74, 0x59, 0x48, 0x8b, 0x81, + 0x90, 0x03, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x4d, 0x8b, 0x90, 0x90, 0x00, 0x00, 0x00, 0x3b, + 0x91, 0x98, 0x03, 0x00, 0x00, 0x75, 0x3f, 0x49, + 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc9, 0x74, 0x33, 0x48, 0x8b, 0x50, 0x30, 0x48, + 0x63, 0x52, 0x4c, 0x49, 0x8b, 0xb6, 0xf8, 0x00, + 0x00, 0x00, 0x48, 0x29, 0xce, 0x48, 0xc1, 0xfe, + 0x03, 0x48, 0x39, 0xd6, 0x7e, 0x18, 0x8b, 0x08, + 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x6a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x70, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // c: 49 8b 47 08 movq 0x8(%r15), %rax + // 10: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // 17: 74 0a je 0x23 <__JIT_ENTRY+0x23> + // 19: 48 83 c4 10 addq $0x10, %rsp + // 1d: 5d popq %rbp + // 1e: e9 00 00 00 00 jmp 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 23: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 48 8d 55 f8 leaq -0x8(%rbp), %rdx + // 30: 4c 89 ff movq %r15, %rdi + // 33: 48 89 de movq %rbx, %rsi + // 36: ff 15 00 00 00 00 callq *(%rip) ## 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_GOT _PyDict_GetItemRef@GOTPCREL + // 3c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 41: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4a: 85 c0 testl %eax, %eax + // 4c: 75 22 jne 0x70 <__JIT_ENTRY+0x70> + // 4e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 53: 48 89 df movq %rbx, %rdi + // 56: 41 89 c5 movl %eax, %r13d + // 59: ff 15 00 00 00 00 callq *(%rip) ## 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_GOT __PyErr_SetKeyError@GOTPCREL + // 5f: 44 89 e8 movl %r13d, %eax + // 62: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 67: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 70: 41 8b 0f movl (%r15), %ecx + // 73: 85 c9 testl %ecx, %ecx + // 75: 78 16 js 0x8d <__JIT_ENTRY+0x8d> + // 77: ff c9 decl %ecx + // 79: 41 89 0f movl %ecx, (%r15) + // 7c: 75 0f jne 0x8d <__JIT_ENTRY+0x8d> + // 7e: 4c 89 ff movq %r15, %rdi + // 81: 41 89 c7 movl %eax, %r15d + // 84: ff 15 00 00 00 00 callq *(%rip) ## 0x8a <__JIT_ENTRY+0x8a> + // 0000000000000086: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8a: 44 89 f8 movl %r15d, %eax + // 8d: 8b 0b movl (%rbx), %ecx + // 8f: 85 c9 testl %ecx, %ecx + // 91: 78 06 js 0x99 <__JIT_ENTRY+0x99> + // 93: ff c9 decl %ecx + // 95: 89 0b movl %ecx, (%rbx) + // 97: 74 1a je 0xb3 <__JIT_ENTRY+0xb3> + // 99: 85 c0 testl %eax, %eax + // 9b: 7e 27 jle 0xc4 <__JIT_ENTRY+0xc4> + // 9d: 48 8b 45 f8 movq -0x8(%rbp), %rax + // a1: 49 89 45 f0 movq %rax, -0x10(%r13) + // a5: 49 83 c5 f8 addq $-0x8, %r13 + // a9: 48 83 c4 10 addq $0x10, %rsp + // ad: 5d popq %rbp + // ae: e9 00 00 00 00 jmp 0xb3 <__JIT_ENTRY+0xb3> + // 00000000000000af: X86_64_RELOC_BRANCH __JIT_CONTINUE + // b3: 48 89 df movq %rbx, %rdi + // b6: 89 c3 movl %eax, %ebx + // b8: ff 15 00 00 00 00 callq *(%rip) ## 0xbe <__JIT_ENTRY+0xbe> + // 00000000000000ba: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // be: 89 d8 movl %ebx, %eax + // c0: 85 c0 testl %eax, %eax + // c2: 7f d9 jg 0x9d <__JIT_ENTRY+0x9d> + // c4: 49 83 c5 f0 addq $-0x10, %r13 + // c8: 48 83 c4 10 addq $0x10, %rsp + // cc: 5d popq %rbp + // cd: e9 00 00 00 00 jmp 0xd2 <__JIT_ENTRY+0xd2> + // 00000000000000ce: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[210] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x0a, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8d, 0x55, 0xf8, + 0x4c, 0x89, 0xff, 0x48, 0x89, 0xde, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x75, 0x22, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0x41, 0x89, + 0xc5, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x89, 0xe8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x8b, 0x0f, 0x85, 0xc9, 0x78, 0x16, 0xff, + 0xc9, 0x41, 0x89, 0x0f, 0x75, 0x0f, 0x4c, 0x89, + 0xff, 0x41, 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x89, 0xf8, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, + 0x1a, 0x85, 0xc0, 0x7e, 0x27, 0x48, 0x8b, 0x45, + 0xf8, 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, + 0x85, 0xc0, 0x7f, 0xd9, 0x49, 0x83, 0xc5, 0xf0, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyErr_SetKeyError+0x0 + // 10: &PyDict_GetItemRef+0x0 + // 18: &PyDict_Type+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyErr_SetKeyError); + patch_64(data + 0x10, (uintptr_t)&PyDict_GetItemRef); + patch_64(data + 0x18, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x14); + patch_32r(code + 0x1f, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x86, (uintptr_t)data + -0x4); + patch_32r(code + 0xaf, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xba, (uintptr_t)data + -0x4); + patch_32r(code + 0xce, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_INIT_CALL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_INIT_CALL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 4: 41 0f 10 45 e8 movups -0x18(%r13), %xmm0 + // 9: 48 8b 4a 30 movq 0x30(%rdx), %rcx + // d: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // 14: 48 63 71 4c movslq 0x4c(%rcx), %rsi + // 18: 48 8d 34 f0 leaq (%rax,%rsi,8), %rsi + // 1c: 49 89 b6 f0 00 00 00 movq %rsi, 0xf0(%r14) + // 23: 4c 89 60 08 movq %r12, 0x8(%rax) + // 27: 48 89 50 10 movq %rdx, 0x10(%rax) + // 2b: 8b 31 movl (%rcx), %esi + // 2d: 85 f6 testl %esi, %esi + // 2f: 78 04 js 0x35 <__JIT_ENTRY+0x35> + // 31: ff c6 incl %esi + // 33: 89 31 movl %esi, (%rcx) + // 35: 55 pushq %rbp + // 36: 48 89 e5 movq %rsp, %rbp + // 39: 48 89 08 movq %rcx, (%rax) + // 3c: 0f 10 4a 10 movups 0x10(%rdx), %xmm1 + // 40: 0f 11 48 18 movups %xmm1, 0x18(%rax) + // 44: 48 c7 40 28 00 00 00 00 movq $0x0, 0x28(%rax) + // 4c: 48 63 51 48 movslq 0x48(%rcx), %rdx + // 50: 48 8d 74 d0 50 leaq 0x50(%rax,%rdx,8), %rsi + // 55: 48 89 70 40 movq %rsi, 0x40(%rax) + // 59: 48 8d b1 d0 00 00 00 leaq 0xd0(%rcx), %rsi + // 60: 48 c7 40 30 00 00 00 00 movq $0x0, 0x30(%rax) + // 68: 48 89 70 38 movq %rsi, 0x38(%rax) + // 6c: c7 40 48 00 00 00 00 movl $0x0, 0x48(%rax) + // 73: 48 83 fa 03 cmpq $0x3, %rdx + // 77: 7c 23 jl 0x9c <__JIT_ENTRY+0x9c> + // 79: ba 0c 00 00 00 movl $0xc, %edx + // 7e: 66 90 nop + // 80: 48 c7 04 d0 00 00 00 00 movq $0x0, (%rax,%rdx,8) + // 88: 48 63 71 48 movslq 0x48(%rcx), %rsi + // 8c: 48 8d 7a 01 leaq 0x1(%rdx), %rdi + // 90: 48 83 c2 f7 addq $-0x9, %rdx + // 94: 48 39 f2 cmpq %rsi, %rdx + // 97: 48 89 fa movq %rdi, %rdx + // 9a: 7c e4 jl 0x80 <__JIT_ENTRY+0x80> + // 9c: 0f 11 40 50 movups %xmm0, 0x50(%rax) + // a0: 66 41 c7 44 24 48 06 00 movw $0x6, 0x48(%r12) + // a8: 49 89 45 e8 movq %rax, -0x18(%r13) + // ac: 49 83 c5 f0 addq $-0x10, %r13 + // b0: 5d popq %rbp + // b1: e9 00 00 00 00 jmp 0xb6 <__JIT_ENTRY+0xb6> + // 00000000000000b2: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[177] = { + 0x49, 0x8b, 0x55, 0xf8, 0x41, 0x0f, 0x10, 0x45, + 0xe8, 0x48, 0x8b, 0x4a, 0x30, 0x49, 0x8b, 0x86, + 0xf0, 0x00, 0x00, 0x00, 0x48, 0x63, 0x71, 0x4c, + 0x48, 0x8d, 0x34, 0xf0, 0x49, 0x89, 0xb6, 0xf0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x60, 0x08, 0x48, + 0x89, 0x50, 0x10, 0x8b, 0x31, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x31, 0x55, 0x48, 0x89, + 0xe5, 0x48, 0x89, 0x08, 0x0f, 0x10, 0x4a, 0x10, + 0x0f, 0x11, 0x48, 0x18, 0x48, 0xc7, 0x40, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x63, 0x51, 0x48, + 0x48, 0x8d, 0x74, 0xd0, 0x50, 0x48, 0x89, 0x70, + 0x40, 0x48, 0x8d, 0xb1, 0xd0, 0x00, 0x00, 0x00, + 0x48, 0xc7, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0x70, 0x38, 0xc7, 0x40, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xfa, 0x03, 0x7c, + 0x23, 0xba, 0x0c, 0x00, 0x00, 0x00, 0x66, 0x90, + 0x48, 0xc7, 0x04, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x71, 0x48, 0x48, 0x8d, 0x7a, 0x01, + 0x48, 0x83, 0xc2, 0xf7, 0x48, 0x39, 0xf2, 0x48, + 0x89, 0xfa, 0x7c, 0xe4, 0x0f, 0x11, 0x40, 0x50, + 0x66, 0x41, 0xc7, 0x44, 0x24, 0x48, 0x06, 0x00, + 0x49, 0x89, 0x45, 0xe8, 0x49, 0x83, 0xc5, 0xf0, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_LIST_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 4: 49 8b 47 08 movq 0x8(%r15), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 19: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyList_Type@GOTPCREL + // 24: 0f 85 00 00 00 00 jne 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2a: 49 8b 47 10 movq 0x10(%r15), %rax + // 2e: 48 83 e0 fb andq $-0x5, %rax + // 32: 48 83 f8 09 cmpq $0x9, %rax + // 36: 0f 83 00 00 00 00 jae 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 3c: 41 8b 47 18 movl 0x18(%r15), %eax + // 40: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 44: 0f 8e 00 00 00 00 jle 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 4a: 48 8b 4b 18 movq 0x18(%rbx), %rcx + // 4e: 48 8b 0c c1 movq (%rcx,%rax,8), %rcx + // 52: 8b 01 movl (%rcx), %eax + // 54: 85 c0 testl %eax, %eax + // 56: 78 04 js 0x5c <__JIT_ENTRY+0x5c> + // 58: ff c0 incl %eax + // 5a: 89 01 movl %eax, (%rcx) + // 5c: 55 pushq %rbp + // 5d: 48 89 e5 movq %rsp, %rbp + // 60: 48 83 ec 10 subq $0x10, %rsp + // 64: 49 83 c5 f0 addq $-0x10, %r13 + // 68: 41 8b 07 movl (%r15), %eax + // 6b: 85 c0 testl %eax, %eax + // 6d: 78 3c js 0xab <__JIT_ENTRY+0xab> + // 6f: ff c8 decl %eax + // 71: 41 89 07 movl %eax, (%r15) + // 74: 75 35 jne 0xab <__JIT_ENTRY+0xab> + // 76: 48 89 4d f8 movq %rcx, -0x8(%rbp) + // 7a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x81 <__JIT_ENTRY+0x81> + // 000000000000007d: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 81: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 88: 48 85 c0 testq %rax, %rax + // 8b: 74 11 je 0x9e <__JIT_ENTRY+0x9e> + // 8d: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 94: 4c 89 ff movq %r15, %rdi + // 97: be 01 00 00 00 movl $0x1, %esi + // 9c: ff d0 callq *%rax + // 9e: 4c 89 ff movq %r15, %rdi + // a1: ff 15 00 00 00 00 callq *(%rip) ## 0xa7 <__JIT_ENTRY+0xa7> + // 00000000000000a3: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // a7: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // ab: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // b0: 8b 03 movl (%rbx), %eax + // b2: 85 c0 testl %eax, %eax + // b4: 78 15 js 0xcb <__JIT_ENTRY+0xcb> + // b6: ff c8 decl %eax + // b8: 89 03 movl %eax, (%rbx) + // ba: 75 0f jne 0xcb <__JIT_ENTRY+0xcb> + // bc: 48 89 df movq %rbx, %rdi + // bf: 48 89 cb movq %rcx, %rbx + // c2: ff 15 00 00 00 00 callq *(%rip) ## 0xc8 <__JIT_ENTRY+0xc8> + // 00000000000000c4: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c8: 48 89 d9 movq %rbx, %rcx + // cb: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d0: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d9: 49 89 4d 00 movq %rcx, (%r13) + // dd: 49 83 c5 08 addq $0x8, %r13 + // e1: 48 83 c4 10 addq $0x10, %rsp + // e5: 5d popq %rbp + // e6: e9 00 00 00 00 jmp 0xeb <__JIT_ENTRY+0xeb> + // 00000000000000e7: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[230] = { + 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, + 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, 0x83, + 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, 0x18, + 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x4b, 0x18, 0x48, 0x8b, + 0x0c, 0xc1, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x04, + 0xff, 0xc0, 0x89, 0x01, 0x55, 0x48, 0x89, 0xe5, + 0x48, 0x83, 0xec, 0x10, 0x49, 0x83, 0xc5, 0xf0, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x3c, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x35, 0x48, 0x89, + 0x4d, 0xf8, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, + 0x48, 0x26, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x4d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x15, 0xff, 0xc8, + 0x89, 0x03, 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, + 0x89, 0xcb, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xd9, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x4d, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyLong_ExactDealloc+0x0 + // 10: &_PyRuntime+0x0 + // 18: &PyList_Type+0x0 + // 20: &PyLong_Type+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&PyList_Type); + patch_64(data + 0x20, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x1c); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x14); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x46, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc4, (uintptr_t)data + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_STR_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_STR_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 4: 49 8b 47 08 movq 0x8(%r15), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 19: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyUnicode_Type@GOTPCREL + // 24: 0f 85 00 00 00 00 jne 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2a: 49 8b 47 10 movq 0x10(%r15), %rax + // 2e: 48 83 e0 fb andq $-0x5, %rax + // 32: 48 83 f8 09 cmpq $0x9, %rax + // 36: 0f 83 00 00 00 00 jae 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 3c: 41 8b 47 18 movl 0x18(%r15), %eax + // 40: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 44: 0f 8e 00 00 00 00 jle 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 4a: 0f b7 4b 22 movzwl 0x22(%rbx), %ecx + // 4e: 89 ca movl %ecx, %edx + // 50: 83 e2 07 andl $0x7, %edx + // 53: 83 fa 02 cmpl $0x2, %edx + // 56: 74 14 je 0x6c <__JIT_ENTRY+0x6c> + // 58: 83 fa 01 cmpl $0x1, %edx + // 5b: 75 1e jne 0x7b <__JIT_ENTRY+0x7b> + // 5d: f6 c1 08 testb $0x8, %cl + // 60: 75 24 jne 0x86 <__JIT_ENTRY+0x86> + // 62: 48 8b 4b 38 movq 0x38(%rbx), %rcx + // 66: 0f b6 0c 01 movzbl (%rcx,%rax), %ecx + // 6a: eb 62 jmp 0xce <__JIT_ENTRY+0xce> + // 6c: f6 c1 08 testb $0x8, %cl + // 6f: 75 2e jne 0x9f <__JIT_ENTRY+0x9f> + // 71: 48 8b 4b 38 movq 0x38(%rbx), %rcx + // 75: 0f b7 0c 41 movzwl (%rcx,%rax,2), %ecx + // 79: eb 53 jmp 0xce <__JIT_ENTRY+0xce> + // 7b: f6 c1 08 testb $0x8, %cl + // 7e: 75 38 jne 0xb8 <__JIT_ENTRY+0xb8> + // 80: 48 8b 4b 38 movq 0x38(%rbx), %rcx + // 84: eb 45 jmp 0xcb <__JIT_ENTRY+0xcb> + // 86: 31 d2 xorl %edx, %edx + // 88: f6 c1 10 testb $0x10, %cl + // 8b: 0f 94 c2 sete %dl + // 8e: c1 e2 04 shll $0x4, %edx + // 91: 48 8d 0c 13 leaq (%rbx,%rdx), %rcx + // 95: 48 83 c1 28 addq $0x28, %rcx + // 99: 0f b6 0c 01 movzbl (%rcx,%rax), %ecx + // 9d: eb 2f jmp 0xce <__JIT_ENTRY+0xce> + // 9f: 31 d2 xorl %edx, %edx + // a1: f6 c1 10 testb $0x10, %cl + // a4: 0f 94 c2 sete %dl + // a7: c1 e2 04 shll $0x4, %edx + // aa: 48 8d 0c 13 leaq (%rbx,%rdx), %rcx + // ae: 48 83 c1 28 addq $0x28, %rcx + // b2: 0f b7 0c 41 movzwl (%rcx,%rax,2), %ecx + // b6: eb 16 jmp 0xce <__JIT_ENTRY+0xce> + // b8: 31 d2 xorl %edx, %edx + // ba: f6 c1 10 testb $0x10, %cl + // bd: 0f 94 c2 sete %dl + // c0: c1 e2 04 shll $0x4, %edx + // c3: 48 8d 0c 13 leaq (%rbx,%rdx), %rcx + // c7: 48 83 c1 28 addq $0x28, %rcx + // cb: 8b 0c 81 movl (%rcx,%rax,4), %ecx + // ce: 81 f9 80 00 00 00 cmpl $0x80, %ecx + // d4: 0f 83 00 00 00 00 jae 0xda <__JIT_ENTRY+0xda> + // 00000000000000d6: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // da: 55 pushq %rbp + // db: 48 89 e5 movq %rsp, %rbp + // de: 48 83 ec 10 subq $0x10, %rsp + // e2: 49 83 c5 f0 addq $-0x10, %r13 + // e6: 41 8b 07 movl (%r15), %eax + // e9: 85 c0 testl %eax, %eax + // eb: 78 3a js 0x127 <__JIT_ENTRY+0x127> + // ed: ff c8 decl %eax + // ef: 41 89 07 movl %eax, (%r15) + // f2: 75 33 jne 0x127 <__JIT_ENTRY+0x127> + // f4: 89 4d fc movl %ecx, -0x4(%rbp) + // f7: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xfe <__JIT_ENTRY+0xfe> + // 00000000000000fa: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // fe: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 105: 48 85 c0 testq %rax, %rax + // 108: 74 11 je 0x11b <__JIT_ENTRY+0x11b> + // 10a: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 111: 4c 89 ff movq %r15, %rdi + // 114: be 01 00 00 00 movl $0x1, %esi + // 119: ff d0 callq *%rax + // 11b: 4c 89 ff movq %r15, %rdi + // 11e: ff 15 00 00 00 00 callq *(%rip) ## 0x124 <__JIT_ENTRY+0x124> + // 0000000000000120: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // 124: 8b 4d fc movl -0x4(%rbp), %ecx + // 127: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 12c: 8b 03 movl (%rbx), %eax + // 12e: 85 c0 testl %eax, %eax + // 130: 78 13 js 0x145 <__JIT_ENTRY+0x145> + // 132: ff c8 decl %eax + // 134: 89 03 movl %eax, (%rbx) + // 136: 75 0d jne 0x145 <__JIT_ENTRY+0x145> + // 138: 48 89 df movq %rbx, %rdi + // 13b: 89 cb movl %ecx, %ebx + // 13d: ff 15 00 00 00 00 callq *(%rip) ## 0x143 <__JIT_ENTRY+0x143> + // 000000000000013f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 143: 89 d9 movl %ebx, %ecx + // 145: 89 c8 movl %ecx, %eax + // 147: 48 8d 04 40 leaq (%rax,%rax,2), %rax + // 14b: 48 c1 e0 04 shlq $0x4, %rax + // 14f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x156 <__JIT_ENTRY+0x156> + // 0000000000000152: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 156: 48 01 c8 addq %rcx, %rax + // 159: 48 05 28 21 01 00 addq $0x12128, %rax ## imm = 0x12128 + // 15f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 164: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 16d: 49 89 45 00 movq %rax, (%r13) + // 171: 49 83 c5 08 addq $0x8, %r13 + // 175: 48 83 c4 10 addq $0x10, %rsp + // 179: 5d popq %rbp + // 17a: e9 00 00 00 00 jmp 0x17f <__JIT_ENTRY+0x17f> + // 000000000000017b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[378] = { + 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, + 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, 0x83, + 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, 0x18, + 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xb7, 0x4b, 0x22, 0x89, 0xca, + 0x83, 0xe2, 0x07, 0x83, 0xfa, 0x02, 0x74, 0x14, + 0x83, 0xfa, 0x01, 0x75, 0x1e, 0xf6, 0xc1, 0x08, + 0x75, 0x24, 0x48, 0x8b, 0x4b, 0x38, 0x0f, 0xb6, + 0x0c, 0x01, 0xeb, 0x62, 0xf6, 0xc1, 0x08, 0x75, + 0x2e, 0x48, 0x8b, 0x4b, 0x38, 0x0f, 0xb7, 0x0c, + 0x41, 0xeb, 0x53, 0xf6, 0xc1, 0x08, 0x75, 0x38, + 0x48, 0x8b, 0x4b, 0x38, 0xeb, 0x45, 0x31, 0xd2, + 0xf6, 0xc1, 0x10, 0x0f, 0x94, 0xc2, 0xc1, 0xe2, + 0x04, 0x48, 0x8d, 0x0c, 0x13, 0x48, 0x83, 0xc1, + 0x28, 0x0f, 0xb6, 0x0c, 0x01, 0xeb, 0x2f, 0x31, + 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, 0xc2, 0xc1, + 0xe2, 0x04, 0x48, 0x8d, 0x0c, 0x13, 0x48, 0x83, + 0xc1, 0x28, 0x0f, 0xb7, 0x0c, 0x41, 0xeb, 0x16, + 0x31, 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, 0xc2, + 0xc1, 0xe2, 0x04, 0x48, 0x8d, 0x0c, 0x13, 0x48, + 0x83, 0xc1, 0x28, 0x8b, 0x0c, 0x81, 0x81, 0xf9, + 0x80, 0x00, 0x00, 0x00, 0x0f, 0x83, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, + 0xec, 0x10, 0x49, 0x83, 0xc5, 0xf0, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x3a, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x75, 0x33, 0x89, 0x4d, 0xfc, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x4d, 0xfc, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x13, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x0d, + 0x48, 0x89, 0xdf, 0x89, 0xcb, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd9, 0x89, 0xc8, 0x48, + 0x8d, 0x04, 0x40, 0x48, 0xc1, 0xe0, 0x04, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, + 0xc8, 0x48, 0x05, 0x28, 0x21, 0x01, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, + 0x10, 0x5d, + }; + // 0: &_PyRuntime+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: &PyUnicode_Type+0x0 + // 20: &PyLong_Type+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x20, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x1c); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x14); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x46, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0xd6, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xfa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x120, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x13f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x152, (uintptr_t)data + -0x4); +} + +void +emit__BINARY_OP_SUBSCR_TUPLE_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_TUPLE_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 4: 49 8b 47 08 movq 0x8(%r15), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 19: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyTuple_Type@GOTPCREL + // 24: 0f 85 00 00 00 00 jne 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2a: 49 8b 47 10 movq 0x10(%r15), %rax + // 2e: 48 83 e0 fb andq $-0x5, %rax + // 32: 48 83 f8 09 cmpq $0x9, %rax + // 36: 0f 83 00 00 00 00 jae 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 3c: 41 8b 47 18 movl 0x18(%r15), %eax + // 40: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 44: 0f 8e 00 00 00 00 jle 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 4a: 48 8b 4c c3 18 movq 0x18(%rbx,%rax,8), %rcx + // 4f: 8b 01 movl (%rcx), %eax + // 51: 85 c0 testl %eax, %eax + // 53: 78 04 js 0x59 <__JIT_ENTRY+0x59> + // 55: ff c0 incl %eax + // 57: 89 01 movl %eax, (%rcx) + // 59: 55 pushq %rbp + // 5a: 48 89 e5 movq %rsp, %rbp + // 5d: 48 83 ec 10 subq $0x10, %rsp + // 61: 49 83 c5 f0 addq $-0x10, %r13 + // 65: 41 8b 07 movl (%r15), %eax + // 68: 85 c0 testl %eax, %eax + // 6a: 78 3c js 0xa8 <__JIT_ENTRY+0xa8> + // 6c: ff c8 decl %eax + // 6e: 41 89 07 movl %eax, (%r15) + // 71: 75 35 jne 0xa8 <__JIT_ENTRY+0xa8> + // 73: 48 89 4d f8 movq %rcx, -0x8(%rbp) + // 77: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x7e <__JIT_ENTRY+0x7e> + // 000000000000007a: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 7e: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 85: 48 85 c0 testq %rax, %rax + // 88: 74 11 je 0x9b <__JIT_ENTRY+0x9b> + // 8a: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 91: 4c 89 ff movq %r15, %rdi + // 94: be 01 00 00 00 movl $0x1, %esi + // 99: ff d0 callq *%rax + // 9b: 4c 89 ff movq %r15, %rdi + // 9e: ff 15 00 00 00 00 callq *(%rip) ## 0xa4 <__JIT_ENTRY+0xa4> + // 00000000000000a0: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // a4: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // a8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // ad: 8b 03 movl (%rbx), %eax + // af: 85 c0 testl %eax, %eax + // b1: 78 15 js 0xc8 <__JIT_ENTRY+0xc8> + // b3: ff c8 decl %eax + // b5: 89 03 movl %eax, (%rbx) + // b7: 75 0f jne 0xc8 <__JIT_ENTRY+0xc8> + // b9: 48 89 df movq %rbx, %rdi + // bc: 48 89 cb movq %rcx, %rbx + // bf: ff 15 00 00 00 00 callq *(%rip) ## 0xc5 <__JIT_ENTRY+0xc5> + // 00000000000000c1: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c5: 48 89 d9 movq %rbx, %rcx + // c8: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // cd: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d6: 49 89 4d 00 movq %rcx, (%r13) + // da: 49 83 c5 08 addq $0x8, %r13 + // de: 48 83 c4 10 addq $0x10, %rsp + // e2: 5d popq %rbp + // e3: e9 00 00 00 00 jmp 0xe8 <__JIT_ENTRY+0xe8> + // 00000000000000e4: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[227] = { + 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, + 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, 0x83, + 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, 0x18, + 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x4c, 0xc3, 0x18, 0x8b, + 0x01, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, + 0x01, 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, + 0x10, 0x49, 0x83, 0xc5, 0xf0, 0x41, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x3c, 0xff, 0xc8, 0x41, 0x89, + 0x07, 0x75, 0x35, 0x48, 0x89, 0x4d, 0xf8, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x4d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x15, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xcb, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd9, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x4d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyLong_ExactDealloc+0x0 + // 10: &_PyRuntime+0x0 + // 18: &PyTuple_Type+0x0 + // 20: &PyLong_Type+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x20, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x1c); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x14); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x46, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc1, (uintptr_t)data + -0x4); +} + +void +emit__BINARY_OP_SUBTRACT_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 49 8d 5d f0 leaq -0x10(%r13), %rbx + // 10: f2 0f 10 47 10 movsd 0x10(%rdi), %xmm0 + // 15: f2 0f 5c 46 10 subsd 0x10(%rsi), %xmm0 + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyFloat_FromDouble_ConsumeInputs@GOTPCREL + // 20: 48 85 c0 testq %rax, %rax + // 23: 74 0d je 0x32 <__JIT_ENTRY+0x32> + // 25: 49 83 c5 f8 addq $-0x8, %r13 + // 29: 48 89 03 movq %rax, (%rbx) + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 32: 49 89 dd movq %rbx, %r13 + // 35: 5d popq %rbp + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[59] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8d, 0x5d, 0xf0, + 0xf2, 0x0f, 0x10, 0x47, 0x10, 0xf2, 0x0f, 0x5c, + 0x46, 0x10, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x0d, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x89, 0x03, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0xdd, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_32r(code + 0x2e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x37, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_OP_SUBTRACT_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4c 89 ff movq %r15, %rdi + // 17: 48 89 de movq %rbx, %rsi + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyLong_Subtract@GOTPCREL + // 20: 49 89 c6 movq %rax, %r14 + // 23: 8b 03 movl (%rbx), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 33 js 0x5c <__JIT_ENTRY+0x5c> + // 29: ff c8 decl %eax + // 2b: 89 03 movl %eax, (%rbx) + // 2d: 75 2d jne 0x5c <__JIT_ENTRY+0x5c> + // 2f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 36: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 3d: 48 85 c0 testq %rax, %rax + // 40: 74 11 je 0x53 <__JIT_ENTRY+0x53> + // 42: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 49: 48 89 df movq %rbx, %rdi + // 4c: be 01 00 00 00 movl $0x1, %esi + // 51: ff d0 callq *%rax + // 53: 48 89 df movq %rbx, %rdi + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // 5c: 41 8b 07 movl (%r15), %eax + // 5f: 85 c0 testl %eax, %eax + // 61: 78 07 js 0x6a <__JIT_ENTRY+0x6a> + // 63: ff c8 decl %eax + // 65: 41 89 07 movl %eax, (%r15) + // 68: 74 1e je 0x88 <__JIT_ENTRY+0x88> + // 6a: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 6e: 4d 85 f6 testq %r14, %r14 + // 71: 74 4b je 0xbe <__JIT_ENTRY+0xbe> + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 4c 89 30 movq %r14, (%rax) + // 7a: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 7e: 48 83 c4 10 addq $0x10, %rsp + // 82: 5d popq %rbp + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 88: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x8f <__JIT_ENTRY+0x8f> + // 000000000000008b: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 8f: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 96: 48 85 c0 testq %rax, %rax + // 99: 74 11 je 0xac <__JIT_ENTRY+0xac> + // 9b: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // a2: 4c 89 ff movq %r15, %rdi + // a5: be 01 00 00 00 movl $0x1, %esi + // aa: ff d0 callq *%rax + // ac: 4c 89 ff movq %r15, %rdi + // af: ff 15 00 00 00 00 callq *(%rip) ## 0xb5 <__JIT_ENTRY+0xb5> + // 00000000000000b1: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // b5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // b9: 4d 85 f6 testq %r14, %r14 + // bc: 75 b5 jne 0x73 <__JIT_ENTRY+0x73> + // be: 49 89 c5 movq %rax, %r13 + // c1: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // c5: 48 83 c4 10 addq $0x10, %rsp + // c9: 5d popq %rbp + // ca: e9 00 00 00 00 jmp 0xcf <__JIT_ENTRY+0xcf> + // 00000000000000cb: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[207] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4c, 0x89, 0xff, 0x48, + 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x74, 0x1e, 0x49, 0x8d, 0x45, 0xf0, 0x4d, 0x85, + 0xf6, 0x74, 0x4b, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x89, 0x30, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x4d, 0x85, 0xf6, 0x75, 0xb5, 0x49, 0x89, + 0xc5, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_ExactDealloc+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_Subtract+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_Subtract); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_32r(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + -0x4); + patch_32r(code + 0xcb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BINARY_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_SLICE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 8b 5d e8 movq -0x18(%r13), %rbx + // c: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: ff 15 00 00 00 00 callq *(%rip) ## 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_GOT __PyBuildSlice_ConsumeRefs@GOTPCREL + // 1b: 49 89 c5 movq %rax, %r13 + // 1e: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 23: 4d 85 ed testq %r13, %r13 + // 26: 74 3c je 0x64 <__JIT_ENTRY+0x64> + // 28: 48 83 c0 f0 addq $-0x10, %rax + // 2c: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 31: 48 89 df movq %rbx, %rdi + // 34: 4c 89 ee movq %r13, %rsi + // 37: ff 15 00 00 00 00 callq *(%rip) ## 0x3d <__JIT_ENTRY+0x3d> + // 0000000000000039: X86_64_RELOC_GOT _PyObject_GetItem@GOTPCREL + // 3d: 49 89 c7 movq %rax, %r15 + // 40: 41 8b 45 00 movl (%r13), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 11 js 0x59 <__JIT_ENTRY+0x59> + // 48: ff c8 decl %eax + // 4a: 41 89 45 00 movl %eax, (%r13) + // 4e: 75 09 jne 0x59 <__JIT_ENTRY+0x59> + // 50: 4c 89 ef movq %r13, %rdi + // 53: ff 15 00 00 00 00 callq *(%rip) ## 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 59: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 5e: 48 83 c0 10 addq $0x10, %rax + // 62: eb 03 jmp 0x67 <__JIT_ENTRY+0x67> + // 64: 45 31 ff xorl %r15d, %r15d + // 67: 48 83 c0 e8 addq $-0x18, %rax + // 6b: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 70: 8b 03 movl (%rbx), %eax + // 72: 85 c0 testl %eax, %eax + // 74: 78 06 js 0x7c <__JIT_ENTRY+0x7c> + // 76: ff c8 decl %eax + // 78: 89 03 movl %eax, (%rbx) + // 7a: 74 21 je 0x9d <__JIT_ENTRY+0x9d> + // 7c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 81: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8a: 4d 85 ff testq %r15, %r15 + // 8d: 74 2a je 0xb9 <__JIT_ENTRY+0xb9> + // 8f: 4d 89 7d 00 movq %r15, (%r13) + // 93: 49 83 c5 08 addq $0x8, %r13 + // 97: 5d popq %rbp + // 98: e9 00 00 00 00 jmp 0x9d <__JIT_ENTRY+0x9d> + // 0000000000000099: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 9d: 48 89 df movq %rbx, %rdi + // a0: ff 15 00 00 00 00 callq *(%rip) ## 0xa6 <__JIT_ENTRY+0xa6> + // 00000000000000a2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ab: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b4: 4d 85 ff testq %r15, %r15 + // b7: 75 d6 jne 0x8f <__JIT_ENTRY+0x8f> + // b9: 5d popq %rbp + // ba: e9 00 00 00 00 jmp 0xbf <__JIT_ENTRY+0xbf> + // 00000000000000bb: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[191] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x5d, 0xe8, 0x49, 0x8b, 0x7d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0xc5, 0x49, 0x8b, + 0x44, 0x24, 0x40, 0x4d, 0x85, 0xed, 0x74, 0x3c, + 0x48, 0x83, 0xc0, 0xf0, 0x49, 0x89, 0x44, 0x24, + 0x40, 0x48, 0x89, 0xdf, 0x4c, 0x89, 0xee, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc7, + 0x41, 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x11, + 0xff, 0xc8, 0x41, 0x89, 0x45, 0x00, 0x75, 0x09, + 0x4c, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x83, + 0xc0, 0x10, 0xeb, 0x03, 0x45, 0x31, 0xff, 0x48, + 0x83, 0xc0, 0xe8, 0x49, 0x89, 0x44, 0x24, 0x40, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x03, 0x74, 0x21, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x85, 0xff, 0x74, 0x2a, 0x4d, + 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x75, + 0xd6, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_GetItem+0x0 + // 10: &_PyBuildSlice_ConsumeRefs+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetItem); + patch_64(data + 0x10, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + -0x4); + patch_32r(code + 0x99, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)data + -0x4); + patch_32r(code + 0xbb, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_LIST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 41 0f b7 f7 movzwl %r15w, %esi + // f: 8d 04 f5 00 00 00 00 leal (,%rsi,8), %eax + // 16: 4c 89 eb movq %r13, %rbx + // 19: 48 29 c3 subq %rax, %rbx + // 1c: 48 89 df movq %rbx, %rdi + // 1f: ff 15 00 00 00 00 callq *(%rip) ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT __PyList_FromStackRefStealOnSuccess@GOTPCREL + // 25: 48 85 c0 testq %rax, %rax + // 28: 74 1b je 0x45 <__JIT_ENTRY+0x45> + // 2a: 41 0f b7 cf movzwl %r15w, %ecx + // 2e: 48 89 03 movq %rax, (%rbx) + // 31: b8 01 00 00 00 movl $0x1, %eax + // 36: 29 c8 subl %ecx, %eax + // 38: 48 98 cltq + // 3a: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 3f: 5d popq %rbp + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 45: 5d popq %rbp + // 46: e9 00 00 00 00 jmp 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[75] = { + 0x55, 0x48, 0x89, 0xe5, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x0f, 0xb7, 0xf7, 0x8d, + 0x04, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xeb, 0x48, 0x29, 0xc3, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x1b, 0x41, 0x0f, 0xb7, 0xcf, 0x48, 0x89, + 0x03, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xc8, + 0x48, 0x98, 0x4d, 0x8d, 0x6c, 0xc5, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyList_FromStackRefStealOnSuccess+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyList_FromStackRefStealOnSuccess); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + -0x4); + patch_32r(code + 0x41, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x47, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_MAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_MAP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4c 89 75 e8 movq %r14, -0x18(%rbp) + // c: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 13: 44 0f b7 f8 movzwl %ax, %r15d + // 17: 45 01 ff addl %r15d, %r15d + // 1a: 44 89 f9 movl %r15d, %ecx + // 1d: f7 d9 negl %ecx + // 1f: 48 63 c9 movslq %ecx, %rcx + // 22: 48 8d 1c cd 00 00 00 00 leaq (,%rcx,8), %rbx + // 2a: 4c 01 eb addq %r13, %rbx + // 2d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 32: 48 89 4d f0 movq %rcx, -0x10(%rbp) + // 36: 49 8d 54 cd 08 leaq 0x8(%r13,%rcx,8), %rdx + // 3b: 44 0f b7 e8 movzwl %ax, %r13d + // 3f: be 02 00 00 00 movl $0x2, %esi + // 44: b9 02 00 00 00 movl $0x2, %ecx + // 49: 48 89 df movq %rbx, %rdi + // 4c: 4d 89 e8 movq %r13, %r8 + // 4f: ff 15 00 00 00 00 callq *(%rip) ## 0x55 <__JIT_ENTRY+0x55> + // 0000000000000051: X86_64_RELOC_GOT __PyDict_FromItems@GOTPCREL + // 55: 48 89 45 e0 movq %rax, -0x20(%rbp) + // 59: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 5e: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 62: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6b: 66 45 85 ed testw %r13w, %r13w + // 6f: 74 3e je 0xaf <__JIT_ENTRY+0xaf> + // 71: 4e 8d 2c 6d 01 00 00 00 leaq 0x1(,%r13,2), %r13 + // 79: 4c 8b 35 00 00 00 00 movq (%rip), %r14 ## 0x80 <__JIT_ENTRY+0x80> + // 000000000000007c: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // 80: eb 17 jmp 0x99 <__JIT_ENTRY+0x99> + // 82: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 90: 49 ff cd decq %r13 + // 93: 49 83 fd 01 cmpq $0x1, %r13 + // 97: 76 16 jbe 0xaf <__JIT_ENTRY+0xaf> + // 99: 4a 8b 7c eb f0 movq -0x10(%rbx,%r13,8), %rdi + // 9e: 8b 07 movl (%rdi), %eax + // a0: 85 c0 testl %eax, %eax + // a2: 78 ec js 0x90 <__JIT_ENTRY+0x90> + // a4: ff c8 decl %eax + // a6: 89 07 movl %eax, (%rdi) + // a8: 75 e6 jne 0x90 <__JIT_ENTRY+0x90> + // aa: 41 ff d6 callq *%r14 + // ad: eb e1 jmp 0x90 <__JIT_ENTRY+0x90> + // af: 48 8b 55 e0 movq -0x20(%rbp), %rdx + // b3: 48 85 d2 testq %rdx, %rdx + // b6: 74 28 je 0xe0 <__JIT_ENTRY+0xe0> + // b8: 48 8b 45 f0 movq -0x10(%rbp), %rax + // bc: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // c0: 48 89 14 c1 movq %rdx, (%rcx,%rax,8) + // c4: b8 01 00 00 00 movl $0x1, %eax + // c9: 44 29 f8 subl %r15d, %eax + // cc: 48 98 cltq + // ce: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // d2: 4c 8b 75 e8 movq -0x18(%rbp), %r14 + // d6: 48 83 c4 20 addq $0x20, %rsp + // da: 5d popq %rbp + // db: e9 00 00 00 00 jmp 0xe0 <__JIT_ENTRY+0xe0> + // 00000000000000dc: X86_64_RELOC_BRANCH __JIT_CONTINUE + // e0: 48 8b 45 f0 movq -0x10(%rbp), %rax + // e4: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // e8: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // ec: 4c 8b 75 e8 movq -0x18(%rbp), %r14 + // f0: 48 83 c4 20 addq $0x20, %rsp + // f4: 5d popq %rbp + // f5: e9 00 00 00 00 jmp 0xfa <__JIT_ENTRY+0xfa> + // 00000000000000f6: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[250] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4c, 0x89, 0x75, 0xe8, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x0f, 0xb7, 0xf8, 0x45, + 0x01, 0xff, 0x44, 0x89, 0xf9, 0xf7, 0xd9, 0x48, + 0x63, 0xc9, 0x48, 0x8d, 0x1c, 0xcd, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x01, 0xeb, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0x4d, 0xf0, 0x49, 0x8d, + 0x54, 0xcd, 0x08, 0x44, 0x0f, 0xb7, 0xe8, 0xbe, + 0x02, 0x00, 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0x4d, 0x89, 0xe8, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x45, + 0xe0, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, + 0x45, 0xf8, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x45, 0x85, 0xed, 0x74, + 0x3e, 0x4e, 0x8d, 0x2c, 0x6d, 0x01, 0x00, 0x00, + 0x00, 0x4c, 0x8b, 0x35, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0x17, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcd, 0x49, 0x83, 0xfd, 0x01, 0x76, + 0x16, 0x4a, 0x8b, 0x7c, 0xeb, 0xf0, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0xec, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0xe6, 0x41, 0xff, 0xd6, 0xeb, 0xe1, 0x48, + 0x8b, 0x55, 0xe0, 0x48, 0x85, 0xd2, 0x74, 0x28, + 0x48, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x4d, 0xf8, + 0x48, 0x89, 0x14, 0xc1, 0xb8, 0x01, 0x00, 0x00, + 0x00, 0x44, 0x29, 0xf8, 0x48, 0x98, 0x4c, 0x8d, + 0x2c, 0xc1, 0x4c, 0x8b, 0x75, 0xe8, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x4d, 0xf8, + 0x4c, 0x8d, 0x2c, 0xc1, 0x4c, 0x8b, 0x75, 0xe8, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyDict_FromItems+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyDict_FromItems); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)data + -0x4); + patch_32r(code + 0xdc, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xf6, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SET.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // f: 41 0f b7 df movzwl %r15w, %ebx + // 13: 48 f7 db negq %rbx + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 31 ff xorl %edi, %edi + // 1d: ff 15 00 00 00 00 callq *(%rip) ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT _PySet_New@GOTPCREL + // 23: 49 8b 54 24 40 movq 0x40(%r12), %rdx + // 28: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 31: 48 85 c0 testq %rax, %rax + // 34: 0f 84 e7 00 00 00 je 0x121 <__JIT_ENTRY+0x121> + // 3a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 41: 66 85 c9 testw %cx, %cx + // 44: 0f 84 58 01 00 00 je 0x1a2 <__JIT_ENTRY+0x1a2> + // 4a: 4c 89 75 e8 movq %r14, -0x18(%rbp) + // 4e: 45 31 ff xorl %r15d, %r15d + // 51: 48 89 5d f0 movq %rbx, -0x10(%rbp) + // 55: 49 89 c6 movq %rax, %r14 + // 58: eb 0b jmp 0x65 <__JIT_ENTRY+0x65> + // 5a: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // 60: 48 ff c3 incq %rbx + // 63: 74 2b je 0x90 <__JIT_ENTRY+0x90> + // 65: 45 85 ff testl %r15d, %r15d + // 68: 75 f6 jne 0x60 <__JIT_ENTRY+0x60> + // 6a: 49 89 54 24 40 movq %rdx, 0x40(%r12) + // 6f: 49 8b 74 dd 00 movq (%r13,%rbx,8), %rsi + // 74: 4c 89 f7 movq %r14, %rdi + // 77: ff 15 00 00 00 00 callq *(%rip) ## 0x7d <__JIT_ENTRY+0x7d> + // 0000000000000079: X86_64_RELOC_GOT _PySet_Add@GOTPCREL + // 7d: 41 89 c7 movl %eax, %r15d + // 80: 49 8b 54 24 40 movq 0x40(%r12), %rdx + // 85: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8e: eb d0 jmp 0x60 <__JIT_ENTRY+0x60> + // 90: 48 89 55 f8 movq %rdx, -0x8(%rbp) + // 94: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x9b <__JIT_ENTRY+0x9b> + // 0000000000000097: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 9b: 66 85 c0 testw %ax, %ax + // 9e: 74 35 je 0xd5 <__JIT_ENTRY+0xd5> + // a0: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx ## 0xa7 <__JIT_ENTRY+0xa7> + // 00000000000000a3: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // a7: 48 ff c3 incq %rbx + // aa: 49 83 c5 f8 addq $-0x8, %r13 + // ae: eb 0d jmp 0xbd <__JIT_ENTRY+0xbd> + // b0: 48 ff cb decq %rbx + // b3: 49 83 c5 f8 addq $-0x8, %r13 + // b7: 48 83 fb 01 cmpq $0x1, %rbx + // bb: 76 18 jbe 0xd5 <__JIT_ENTRY+0xd5> + // bd: 49 8b 7d 00 movq (%r13), %rdi + // c1: 8b 07 movl (%rdi), %eax + // c3: 85 c0 testl %eax, %eax + // c5: 78 e9 js 0xb0 <__JIT_ENTRY+0xb0> + // c7: ff c8 decl %eax + // c9: 89 07 movl %eax, (%rdi) + // cb: 75 e3 jne 0xb0 <__JIT_ENTRY+0xb0> + // cd: ff 15 00 00 00 00 callq *(%rip) ## 0xd3 <__JIT_ENTRY+0xd3> + // 00000000000000cf: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // d3: eb db jmp 0xb0 <__JIT_ENTRY+0xb0> + // d5: 45 85 ff testl %r15d, %r15d + // d8: 0f 84 ae 00 00 00 je 0x18c <__JIT_ENTRY+0x18c> + // de: 48 8b 45 f0 movq -0x10(%rbp), %rax + // e2: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // e6: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // ea: 49 89 44 24 40 movq %rax, 0x40(%r12) + // ef: 4c 89 f7 movq %r14, %rdi + // f2: 41 8b 06 movl (%r14), %eax + // f5: 85 c0 testl %eax, %eax + // f7: 4c 8b 75 e8 movq -0x18(%rbp), %r14 + // fb: 78 0c js 0x109 <__JIT_ENTRY+0x109> + // fd: ff c8 decl %eax + // ff: 89 07 movl %eax, (%rdi) + // 101: 75 06 jne 0x109 <__JIT_ENTRY+0x109> + // 103: ff 15 00 00 00 00 callq *(%rip) ## 0x109 <__JIT_ENTRY+0x109> + // 0000000000000105: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 109: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 10e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 117: 48 83 c4 20 addq $0x20, %rsp + // 11b: 5d popq %rbp + // 11c: e9 00 00 00 00 jmp 0x121 <__JIT_ENTRY+0x121> + // 000000000000011d: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 121: 48 89 55 f8 movq %rdx, -0x8(%rbp) + // 125: 48 89 5d f0 movq %rbx, -0x10(%rbp) + // 129: 4c 89 75 e8 movq %r14, -0x18(%rbp) + // 12d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x134 <__JIT_ENTRY+0x134> + // 0000000000000130: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 134: 66 85 c0 testw %ax, %ax + // 137: 74 39 je 0x172 <__JIT_ENTRY+0x172> + // 139: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx ## 0x140 <__JIT_ENTRY+0x140> + // 000000000000013c: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 140: 48 ff c3 incq %rbx + // 143: 49 83 c5 f8 addq $-0x8, %r13 + // 147: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0x14e <__JIT_ENTRY+0x14e> + // 000000000000014a: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // 14e: eb 0d jmp 0x15d <__JIT_ENTRY+0x15d> + // 150: 48 ff cb decq %rbx + // 153: 49 83 c5 f8 addq $-0x8, %r13 + // 157: 48 83 fb 01 cmpq $0x1, %rbx + // 15b: 76 15 jbe 0x172 <__JIT_ENTRY+0x172> + // 15d: 49 8b 7d 00 movq (%r13), %rdi + // 161: 8b 07 movl (%rdi), %eax + // 163: 85 c0 testl %eax, %eax + // 165: 78 e9 js 0x150 <__JIT_ENTRY+0x150> + // 167: ff c8 decl %eax + // 169: 89 07 movl %eax, (%rdi) + // 16b: 75 e3 jne 0x150 <__JIT_ENTRY+0x150> + // 16d: 41 ff d7 callq *%r15 + // 170: eb de jmp 0x150 <__JIT_ENTRY+0x150> + // 172: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 176: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // 17a: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 17e: 4c 8b 75 e8 movq -0x18(%rbp), %r14 + // 182: 48 83 c4 20 addq $0x20, %rsp + // 186: 5d popq %rbp + // 187: e9 00 00 00 00 jmp 0x18c <__JIT_ENTRY+0x18c> + // 0000000000000188: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 18c: 48 8b 5d f0 movq -0x10(%rbp), %rbx + // 190: 48 8b 55 f8 movq -0x8(%rbp), %rdx + // 194: 4c 89 f0 movq %r14, %rax + // 197: 4c 8b 75 e8 movq -0x18(%rbp), %r14 + // 19b: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0x1a2 <__JIT_ENTRY+0x1a2> + // 000000000000019e: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 1a2: 41 0f b7 f7 movzwl %r15w, %esi + // 1a6: 48 89 04 da movq %rax, (%rdx,%rbx,8) + // 1aa: b9 01 00 00 00 movl $0x1, %ecx + // 1af: 29 f1 subl %esi, %ecx + // 1b1: 48 63 c1 movslq %ecx, %rax + // 1b4: 4c 8d 2c c2 leaq (%rdx,%rax,8), %r13 + // 1b8: 48 83 c4 20 addq $0x20, %rsp + // 1bc: 5d popq %rbp + // 1bd: e9 00 00 00 00 jmp 0x1c2 <__JIT_ENTRY+0x1c2> + // 00000000000001be: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[445] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x0f, 0xb7, 0xdf, 0x48, 0xf7, 0xdb, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x31, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x54, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x0f, 0x84, 0xe7, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc9, 0x0f, 0x84, 0x58, 0x01, + 0x00, 0x00, 0x4c, 0x89, 0x75, 0xe8, 0x45, 0x31, + 0xff, 0x48, 0x89, 0x5d, 0xf0, 0x49, 0x89, 0xc6, + 0xeb, 0x0b, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x48, 0xff, 0xc3, 0x74, 0x2b, 0x45, 0x85, 0xff, + 0x75, 0xf6, 0x49, 0x89, 0x54, 0x24, 0x40, 0x49, + 0x8b, 0x74, 0xdd, 0x00, 0x4c, 0x89, 0xf7, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, 0xc7, + 0x49, 0x8b, 0x54, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xeb, 0xd0, + 0x48, 0x89, 0x55, 0xf8, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x35, + 0x0f, 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xff, 0xc3, 0x49, 0x83, 0xc5, 0xf8, 0xeb, 0x0d, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x45, 0x85, 0xff, + 0x0f, 0x84, 0xae, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x45, 0xf0, 0x48, 0x8b, 0x4d, 0xf8, 0x48, 0x8d, + 0x04, 0xc1, 0x49, 0x89, 0x44, 0x24, 0x40, 0x4c, + 0x89, 0xf7, 0x41, 0x8b, 0x06, 0x85, 0xc0, 0x4c, + 0x8b, 0x75, 0xe8, 0x78, 0x0c, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x55, 0xf8, 0x48, 0x89, 0x5d, + 0xf0, 0x4c, 0x89, 0x75, 0xe8, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x39, 0x0f, 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc3, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x0d, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x8b, 0x45, 0xf0, 0x48, 0x8b, + 0x4d, 0xf8, 0x4c, 0x8d, 0x2c, 0xc1, 0x4c, 0x8b, + 0x75, 0xe8, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5d, 0xf0, + 0x48, 0x8b, 0x55, 0xf8, 0x4c, 0x89, 0xf0, 0x4c, + 0x8b, 0x75, 0xe8, 0x4c, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x0f, 0xb7, 0xf7, 0x48, 0x89, + 0x04, 0xda, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x29, + 0xf1, 0x48, 0x63, 0xc1, 0x4c, 0x8d, 0x2c, 0xc2, + 0x48, 0x83, 0xc4, 0x20, 0x5d, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + // 10: &PySet_Add+0x0 + // 18: &PySet_New+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&PySet_Add); + patch_64(data + 0x18, (uintptr_t)&PySet_New); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xcf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x105, (uintptr_t)data + 0x4); + patch_32r(code + 0x11d, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x130, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14a, (uintptr_t)data + 0x4); + patch_32r(code + 0x188, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x19e, (uintptr_t)data + -0x4); +} + +void +emit__BUILD_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SLICE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4c 89 eb movq %r13, %rbx + // b: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 12: 0f b7 d0 movzwl %ax, %edx + // 15: 8d 0c d5 00 00 00 00 leal (,%rdx,8), %ecx + // 1c: 4c 89 6d e8 movq %r13, -0x18(%rbp) + // 20: 48 29 cb subq %rcx, %rbx + // 23: 48 8b 3b movq (%rbx), %rdi + // 26: 48 8b 73 08 movq 0x8(%rbx), %rsi + // 2a: 66 83 f8 03 cmpw $0x3, %ax + // 2e: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // 32: 4c 89 65 f8 movq %r12, -0x8(%rbp) + // 36: 48 89 55 e0 movq %rdx, -0x20(%rbp) + // 3a: 75 06 jne 0x42 <__JIT_ENTRY+0x42> + // 3c: 48 8b 53 10 movq 0x10(%rbx), %rdx + // 40: eb 02 jmp 0x44 <__JIT_ENTRY+0x44> + // 42: 31 d2 xorl %edx, %edx + // 44: ff 15 00 00 00 00 callq *(%rip) ## 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_GOT _PySlice_New@GOTPCREL + // 4a: 49 89 c5 movq %rax, %r13 + // 4d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 54: 66 85 c0 testw %ax, %ax + // 57: 74 49 je 0xa2 <__JIT_ENTRY+0xa2> + // 59: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d ## 0x61 <__JIT_ENTRY+0x61> + // 000000000000005d: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 61: 49 ff c6 incq %r14 + // 64: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 68: 4c 8d 60 f8 leaq -0x8(%rax), %r12 + // 6c: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0x73 <__JIT_ENTRY+0x73> + // 000000000000006f: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // 73: eb 18 jmp 0x8d <__JIT_ENTRY+0x8d> + // 75: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 80: 49 ff ce decq %r14 + // 83: 49 83 c4 f8 addq $-0x8, %r12 + // 87: 49 83 fe 01 cmpq $0x1, %r14 + // 8b: 76 15 jbe 0xa2 <__JIT_ENTRY+0xa2> + // 8d: 49 8b 3c 24 movq (%r12), %rdi + // 91: 8b 07 movl (%rdi), %eax + // 93: 85 c0 testl %eax, %eax + // 95: 78 e9 js 0x80 <__JIT_ENTRY+0x80> + // 97: ff c8 decl %eax + // 99: 89 07 movl %eax, (%rdi) + // 9b: 75 e3 jne 0x80 <__JIT_ENTRY+0x80> + // 9d: 41 ff d7 callq *%r15 + // a0: eb de jmp 0x80 <__JIT_ENTRY+0x80> + // a2: 4d 85 ed testq %r13, %r13 + // a5: 74 27 je 0xce <__JIT_ENTRY+0xce> + // a7: 4c 89 2b movq %r13, (%rbx) + // aa: b8 01 00 00 00 movl $0x1, %eax + // af: 2b 45 e0 subl -0x20(%rbp), %eax + // b2: 48 98 cltq + // b4: 48 8b 4d e8 movq -0x18(%rbp), %rcx + // b8: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // bc: 4c 8b 65 f8 movq -0x8(%rbp), %r12 + // c0: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // c4: 48 83 c4 20 addq $0x20, %rsp + // c8: 5d popq %rbp + // c9: e9 00 00 00 00 jmp 0xce <__JIT_ENTRY+0xce> + // 00000000000000ca: X86_64_RELOC_BRANCH __JIT_CONTINUE + // ce: 4c 8b 65 f8 movq -0x8(%rbp), %r12 + // d2: 49 89 dd movq %rbx, %r13 + // d5: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // d9: 48 83 c4 20 addq $0x20, %rsp + // dd: 5d popq %rbp + // de: e9 00 00 00 00 jmp 0xe3 <__JIT_ENTRY+0xe3> + // 00000000000000df: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[227] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4c, 0x89, 0xeb, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xb7, 0xd0, 0x8d, 0x0c, 0xd5, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6d, 0xe8, + 0x48, 0x29, 0xcb, 0x48, 0x8b, 0x3b, 0x48, 0x8b, + 0x73, 0x08, 0x66, 0x83, 0xf8, 0x03, 0x4c, 0x89, + 0x75, 0xf0, 0x4c, 0x89, 0x65, 0xf8, 0x48, 0x89, + 0x55, 0xe0, 0x75, 0x06, 0x48, 0x8b, 0x53, 0x10, + 0xeb, 0x02, 0x31, 0xd2, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0xc5, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x49, 0x44, 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x49, 0xff, 0xc6, 0x48, 0x8b, 0x45, 0xe8, + 0x4c, 0x8d, 0x60, 0xf8, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x18, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xce, 0x49, 0x83, 0xc4, 0xf8, 0x49, + 0x83, 0xfe, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x3c, + 0x24, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x4d, 0x85, 0xed, 0x74, 0x27, 0x4c, + 0x89, 0x2b, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x2b, + 0x45, 0xe0, 0x48, 0x98, 0x48, 0x8b, 0x4d, 0xe8, + 0x4c, 0x8d, 0x2c, 0xc1, 0x4c, 0x8b, 0x65, 0xf8, + 0x4c, 0x8b, 0x75, 0xf0, 0x48, 0x83, 0xc4, 0x20, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, + 0x65, 0xf8, 0x49, 0x89, 0xdd, 0x4c, 0x8b, 0x75, + 0xf0, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PySlice_New+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PySlice_New); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xe, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + -0x4); + patch_32r(code + 0xca, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xdf, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_STRING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_STRING.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // c: 4c 89 eb movq %r13, %rbx + // f: 4c 89 65 f8 movq %r12, -0x8(%rbp) + // 13: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x1a <__JIT_ENTRY+0x1a> + // 0000000000000016: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 1a: 44 0f b7 f8 movzwl %ax, %r15d + // 1e: 42 8d 04 fd 00 00 00 00 leal (,%r15,8), %eax + // 26: 4c 89 6d e8 movq %r13, -0x18(%rbp) + // 2a: 48 29 c3 subq %rax, %rbx + // 2d: bf e0 87 00 00 movl $0x87e0, %edi ## imm = 0x87E0 + // 32: 48 03 3d 00 00 00 00 addq (%rip), %rdi ## 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 39: 48 89 de movq %rbx, %rsi + // 3c: 4c 89 fa movq %r15, %rdx + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __PyUnicode_JoinArray@GOTPCREL + // 45: 49 89 c5 movq %rax, %r13 + // 48: 66 45 85 ff testw %r15w, %r15w + // 4c: 74 43 je 0x91 <__JIT_ENTRY+0x91> + // 4e: 49 ff c7 incq %r15 + // 51: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 55: 4c 8d 70 f8 leaq -0x8(%rax), %r14 + // 59: 4c 8b 25 00 00 00 00 movq (%rip), %r12 ## 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // 60: eb 1b jmp 0x7d <__JIT_ENTRY+0x7d> + // 62: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 70: 49 ff cf decq %r15 + // 73: 49 83 c6 f8 addq $-0x8, %r14 + // 77: 49 83 ff 01 cmpq $0x1, %r15 + // 7b: 76 14 jbe 0x91 <__JIT_ENTRY+0x91> + // 7d: 49 8b 3e movq (%r14), %rdi + // 80: 8b 07 movl (%rdi), %eax + // 82: 85 c0 testl %eax, %eax + // 84: 78 ea js 0x70 <__JIT_ENTRY+0x70> + // 86: ff c8 decl %eax + // 88: 89 07 movl %eax, (%rdi) + // 8a: 75 e4 jne 0x70 <__JIT_ENTRY+0x70> + // 8c: 41 ff d4 callq *%r12 + // 8f: eb df jmp 0x70 <__JIT_ENTRY+0x70> + // 91: 4d 85 ed testq %r13, %r13 + // 94: 74 31 je 0xc7 <__JIT_ENTRY+0xc7> + // 96: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x9d <__JIT_ENTRY+0x9d> + // 0000000000000099: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 9d: 0f b7 c0 movzwl %ax, %eax + // a0: 4c 89 2b movq %r13, (%rbx) + // a3: b9 01 00 00 00 movl $0x1, %ecx + // a8: 29 c1 subl %eax, %ecx + // aa: 48 63 c1 movslq %ecx, %rax + // ad: 48 8b 4d e8 movq -0x18(%rbp), %rcx + // b1: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // b5: 4c 8b 65 f8 movq -0x8(%rbp), %r12 + // b9: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // bd: 48 83 c4 20 addq $0x20, %rsp + // c1: 5d popq %rbp + // c2: e9 00 00 00 00 jmp 0xc7 <__JIT_ENTRY+0xc7> + // 00000000000000c3: X86_64_RELOC_BRANCH __JIT_CONTINUE + // c7: 4c 8b 65 f8 movq -0x8(%rbp), %r12 + // cb: 49 89 dd movq %rbx, %r13 + // ce: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // d2: 48 83 c4 20 addq $0x20, %rsp + // d6: 5d popq %rbp + // d7: e9 00 00 00 00 jmp 0xdc <__JIT_ENTRY+0xdc> + // 00000000000000d8: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[220] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4c, 0x89, 0x75, 0xf0, 0x4c, 0x89, 0xeb, 0x4c, + 0x89, 0x65, 0xf8, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x0f, 0xb7, 0xf8, 0x42, 0x8d, + 0x04, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x6d, 0xe8, 0x48, 0x29, 0xc3, 0xbf, 0xe0, 0x87, + 0x00, 0x00, 0x48, 0x03, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xde, 0x4c, 0x89, 0xfa, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc5, + 0x66, 0x45, 0x85, 0xff, 0x74, 0x43, 0x49, 0xff, + 0xc7, 0x48, 0x8b, 0x45, 0xe8, 0x4c, 0x8d, 0x70, + 0xf8, 0x4c, 0x8b, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0x1b, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc6, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x3e, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xea, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0xe4, 0x41, 0xff, 0xd4, 0xeb, + 0xdf, 0x4d, 0x85, 0xed, 0x74, 0x31, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc0, + 0x4c, 0x89, 0x2b, 0xb9, 0x01, 0x00, 0x00, 0x00, + 0x29, 0xc1, 0x48, 0x63, 0xc1, 0x48, 0x8b, 0x4d, + 0xe8, 0x4c, 0x8d, 0x2c, 0xc1, 0x4c, 0x8b, 0x65, + 0xf8, 0x4c, 0x8b, 0x75, 0xf0, 0x48, 0x83, 0xc4, + 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x65, 0xf8, 0x49, 0x89, 0xdd, 0x4c, 0x8b, + 0x75, 0xf0, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + // 10: &_PyUnicode_JoinArray+0x0 + // 18: &_PyRuntime+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_JoinArray); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + -0x4); + patch_32r(code + 0xc3, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xd8, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__BUILD_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 41 0f b7 f7 movzwl %r15w, %esi + // f: 8d 04 f5 00 00 00 00 leal (,%rsi,8), %eax + // 16: 4c 89 eb movq %r13, %rbx + // 19: 48 29 c3 subq %rax, %rbx + // 1c: 48 89 df movq %rbx, %rdi + // 1f: ff 15 00 00 00 00 callq *(%rip) ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT __PyTuple_FromStackRefStealOnSuccess@GOTPCREL + // 25: 48 85 c0 testq %rax, %rax + // 28: 74 1b je 0x45 <__JIT_ENTRY+0x45> + // 2a: 41 0f b7 cf movzwl %r15w, %ecx + // 2e: 48 89 03 movq %rax, (%rbx) + // 31: b8 01 00 00 00 movl $0x1, %eax + // 36: 29 c8 subl %ecx, %eax + // 38: 48 98 cltq + // 3a: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 3f: 5d popq %rbp + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 45: 5d popq %rbp + // 46: e9 00 00 00 00 jmp 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[75] = { + 0x55, 0x48, 0x89, 0xe5, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x0f, 0xb7, 0xf7, 0x8d, + 0x04, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xeb, 0x48, 0x29, 0xc3, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x1b, 0x41, 0x0f, 0xb7, 0xcf, 0x48, 0x89, + 0x03, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xc8, + 0x48, 0x98, 0x4d, 0x8d, 0x6c, 0xc5, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyTuple_FromStackRefStealOnSuccess+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyTuple_FromStackRefStealOnSuccess); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + -0x4); + patch_32r(code + 0x41, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x47, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_CLASS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: b8 fe ff ff ff movl $0xfffffffe, %eax ## imm = 0xFFFFFFFE + // 14: 29 c8 subl %ecx, %eax + // 16: 4c 63 f8 movslq %eax, %r15 + // 19: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // 1e: 48 8b 47 08 movq 0x8(%rdi), %rax + // 22: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 29: 0f 84 e3 00 00 00 je 0x112 <__JIT_ENTRY+0x112> + // 2f: 48 8b 87 90 01 00 00 movq 0x190(%rdi), %rax + // 36: 48 85 c0 testq %rax, %rax + // 39: 0f 84 d3 00 00 00 je 0x112 <__JIT_ENTRY+0x112> + // 3f: 8d 14 cd 00 00 00 00 leal (,%rcx,8), %edx + // 46: 4c 89 ee movq %r13, %rsi + // 49: 48 29 d6 subq %rdx, %rsi + // 4c: 89 ca movl %ecx, %edx + // 4e: f7 d2 notl %edx + // 50: 48 63 da movslq %edx, %rbx + // 53: 45 31 c0 xorl %r8d, %r8d + // 56: 31 d2 xorl %edx, %edx + // 58: 49 83 7c dd 00 00 cmpq $0x0, (%r13,%rbx,8) + // 5e: 41 0f 94 c0 sete %r8b + // 62: 0f 95 c2 setne %dl + // 65: 01 ca addl %ecx, %edx + // 67: 4a 8d 34 c6 leaq (%rsi,%r8,8), %rsi + // 6b: 48 83 c6 f8 addq $-0x8, %rsi + // 6f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 74: 31 c9 xorl %ecx, %ecx + // 76: ff d0 callq *%rax + // 78: 48 89 45 e0 movq %rax, -0x20(%rbp) + // 7c: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 81: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 85: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8e: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // 93: 8b 07 movl (%rdi), %eax + // 95: 85 c0 testl %eax, %eax + // 97: 78 0c js 0xa5 <__JIT_ENTRY+0xa5> + // 99: ff c8 decl %eax + // 9b: 89 07 movl %eax, (%rdi) + // 9d: 75 06 jne 0xa5 <__JIT_ENTRY+0xa5> + // 9f: ff 15 00 00 00 00 callq *(%rip) ## 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a5: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // a9: 48 89 5d e8 movq %rbx, -0x18(%rbp) + // ad: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // b2: 48 85 ff testq %rdi, %rdi + // b5: 74 12 je 0xc9 <__JIT_ENTRY+0xc9> + // b7: 8b 07 movl (%rdi), %eax + // b9: 85 c0 testl %eax, %eax + // bb: 78 0c js 0xc9 <__JIT_ENTRY+0xc9> + // bd: ff c8 decl %eax + // bf: 89 07 movl %eax, (%rdi) + // c1: 75 06 jne 0xc9 <__JIT_ENTRY+0xc9> + // c3: ff 15 00 00 00 00 callq *(%rip) ## 0xc9 <__JIT_ENTRY+0xc9> + // 00000000000000c5: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c9: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xd0 <__JIT_ENTRY+0xd0> + // 00000000000000cc: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // d0: 66 85 c0 testw %ax, %ax + // d3: 74 47 je 0x11c <__JIT_ENTRY+0x11c> + // d5: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx ## 0xdc <__JIT_ENTRY+0xdc> + // 00000000000000d8: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // dc: 48 ff c3 incq %rbx + // df: 49 83 c5 f8 addq $-0x8, %r13 + // e3: 4c 8b 35 00 00 00 00 movq (%rip), %r14 ## 0xea <__JIT_ENTRY+0xea> + // 00000000000000e6: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // ea: eb 11 jmp 0xfd <__JIT_ENTRY+0xfd> + // ec: 0f 1f 40 00 nopl (%rax) + // f0: 48 ff cb decq %rbx + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 48 83 fb 01 cmpq $0x1, %rbx + // fb: 76 1f jbe 0x11c <__JIT_ENTRY+0x11c> + // fd: 49 8b 7d 00 movq (%r13), %rdi + // 101: 8b 07 movl (%rdi), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <__JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 07 movl %eax, (%rdi) + // 10b: 75 e3 jne 0xf0 <__JIT_ENTRY+0xf0> + // 10d: 41 ff d6 callq *%r14 + // 110: eb de jmp 0xf0 <__JIT_ENTRY+0xf0> + // 112: 48 83 c4 20 addq $0x20, %rsp + // 116: 5d popq %rbp + // 117: e9 00 00 00 00 jmp 0x11c <__JIT_ENTRY+0x11c> + // 0000000000000118: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 11c: 48 8b 45 e0 movq -0x20(%rbp), %rax + // 120: 48 85 c0 testq %rax, %rax + // 123: 74 1e je 0x143 <__JIT_ENTRY+0x143> + // 125: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // 129: 4a 89 04 f9 movq %rax, (%rcx,%r15,8) + // 12d: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 131: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 135: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 139: 48 83 c4 20 addq $0x20, %rsp + // 13d: 5d popq %rbp + // 13e: e9 00 00 00 00 jmp 0x143 <__JIT_ENTRY+0x143> + // 000000000000013f: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 143: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 147: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 14b: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 14f: 48 83 c4 20 addq $0x20, %rsp + // 153: 5d popq %rbp + // 154: e9 00 00 00 00 jmp 0x159 <__JIT_ENTRY+0x159> + // 0000000000000155: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[345] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xb8, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc8, 0x4c, 0x63, + 0xf8, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x8b, + 0x47, 0x08, 0xf6, 0x80, 0xab, 0x00, 0x00, 0x00, + 0x80, 0x0f, 0x84, 0xe3, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x87, 0x90, 0x01, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x0f, 0x84, 0xd3, 0x00, 0x00, 0x00, 0x8d, + 0x14, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xee, 0x48, 0x29, 0xd6, 0x89, 0xca, 0xf7, 0xd2, + 0x48, 0x63, 0xda, 0x45, 0x31, 0xc0, 0x31, 0xd2, + 0x49, 0x83, 0x7c, 0xdd, 0x00, 0x00, 0x41, 0x0f, + 0x94, 0xc0, 0x0f, 0x95, 0xc2, 0x01, 0xca, 0x4a, + 0x8d, 0x34, 0xc6, 0x48, 0x83, 0xc6, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x31, 0xc9, 0xff, 0xd0, + 0x48, 0x89, 0x45, 0xe0, 0x49, 0x8b, 0x44, 0x24, + 0x40, 0x48, 0x89, 0x45, 0xf8, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x8b, + 0x7c, 0xfd, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x75, + 0xf0, 0x48, 0x89, 0x5d, 0xe8, 0x49, 0x8b, 0x7c, + 0xdd, 0x00, 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc0, 0x74, 0x47, 0x0f, 0xb7, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc3, 0x49, + 0x83, 0xc5, 0xf8, 0x4c, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x1f, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0x41, 0xff, 0xd6, + 0xeb, 0xde, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0xe0, + 0x48, 0x85, 0xc0, 0x74, 0x1e, 0x48, 0x8b, 0x4d, + 0xf8, 0x4a, 0x89, 0x04, 0xf9, 0x48, 0x8b, 0x45, + 0xe8, 0x4c, 0x8d, 0x2c, 0xc1, 0x4c, 0x8b, 0x75, + 0xf0, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf8, 0x4e, + 0x8d, 0x2c, 0xf8, 0x4c, 0x8b, 0x75, 0xf0, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xd8, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xe6, (uintptr_t)data + -0x4); + patch_32r(code + 0x118, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x13f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x155, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 4c 63 f9 movslq %ecx, %r15 + // 16: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 1b: 29 c1 subl %eax, %ecx + // 1d: 48 63 d9 movslq %ecx, %rbx + // 20: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // 25: 31 d2 xorl %edx, %edx + // 27: 31 f6 xorl %esi, %esi + // 29: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2f: 40 0f 95 c7 setne %dil + // 33: 41 0f 94 c1 sete %r9b + // 37: 4c 8b 41 08 movq 0x8(%rcx), %r8 + // 3b: 4c 3b 05 00 00 00 00 cmpq (%rip), %r8 ## 0x42 <__JIT_ENTRY+0x42> + // 000000000000003e: X86_64_RELOC_GOT _PyCFunction_Type@GOTPCREL + // 42: 0f 85 dd 00 00 00 jne 0x125 <__JIT_ENTRY+0x125> + // 48: 4c 8b 41 10 movq 0x10(%rcx), %r8 + // 4c: 41 81 78 10 80 00 00 00 cmpl $0x80, 0x10(%r8) + // 54: 0f 85 cb 00 00 00 jne 0x125 <__JIT_ENTRY+0x125> + // 5a: 44 8d 14 c5 00 00 00 00 leal (,%rax,8), %r10d + // 62: 4d 89 eb movq %r13, %r11 + // 65: 4d 29 d3 subq %r10, %r11 + // 68: 44 88 ce movb %r9b, %sil + // 6b: 49 8d 34 f3 leaq (%r11,%rsi,8), %rsi + // 6f: 48 83 c6 f8 addq $-0x8, %rsi + // 73: 40 88 fa movb %dil, %dl + // 76: 01 c2 addl %eax, %edx + // 78: 49 8b 40 08 movq 0x8(%r8), %rax + // 7c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 81: 48 8b 79 18 movq 0x18(%rcx), %rdi + // 85: 89 d2 movl %edx, %edx + // 87: ff d0 callq *%rax + // 89: 48 89 45 e8 movq %rax, -0x18(%rbp) + // 8d: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 92: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // a4: 8b 07 movl (%rdi), %eax + // a6: 85 c0 testl %eax, %eax + // a8: 78 0c js 0xb6 <__JIT_ENTRY+0xb6> + // aa: ff c8 decl %eax + // ac: 89 07 movl %eax, (%rdi) + // ae: 75 06 jne 0xb6 <__JIT_ENTRY+0xb6> + // b0: ff 15 00 00 00 00 callq *(%rip) ## 0xb6 <__JIT_ENTRY+0xb6> + // 00000000000000b2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b6: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // ba: 4d 89 fe movq %r15, %r14 + // bd: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // c2: 48 85 ff testq %rdi, %rdi + // c5: 74 12 je 0xd9 <__JIT_ENTRY+0xd9> + // c7: 8b 07 movl (%rdi), %eax + // c9: 85 c0 testl %eax, %eax + // cb: 78 0c js 0xd9 <__JIT_ENTRY+0xd9> + // cd: ff c8 decl %eax + // cf: 89 07 movl %eax, (%rdi) + // d1: 75 06 jne 0xd9 <__JIT_ENTRY+0xd9> + // d3: ff 15 00 00 00 00 callq *(%rip) ## 0xd9 <__JIT_ENTRY+0xd9> + // 00000000000000d5: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // d9: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xe0 <__JIT_ENTRY+0xe0> + // 00000000000000dc: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // e0: 66 85 c0 testw %ax, %ax + // e3: 74 4a je 0x12f <__JIT_ENTRY+0x12f> + // e5: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d ## 0xed <__JIT_ENTRY+0xed> + // 00000000000000e9: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // ed: 49 ff c7 incq %r15 + // f0: 49 83 c5 f8 addq $-0x8, %r13 + // f4: eb 17 jmp 0x10d <__JIT_ENTRY+0x10d> + // f6: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 100: 49 ff cf decq %r15 + // 103: 49 83 c5 f8 addq $-0x8, %r13 + // 107: 49 83 ff 01 cmpq $0x1, %r15 + // 10b: 76 22 jbe 0x12f <__JIT_ENTRY+0x12f> + // 10d: 49 8b 7d 00 movq (%r13), %rdi + // 111: 8b 07 movl (%rdi), %eax + // 113: 85 c0 testl %eax, %eax + // 115: 78 e9 js 0x100 <__JIT_ENTRY+0x100> + // 117: ff c8 decl %eax + // 119: 89 07 movl %eax, (%rdi) + // 11b: 75 e3 jne 0x100 <__JIT_ENTRY+0x100> + // 11d: ff 15 00 00 00 00 callq *(%rip) ## 0x123 <__JIT_ENTRY+0x123> + // 000000000000011f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 123: eb db jmp 0x100 <__JIT_ENTRY+0x100> + // 125: 48 83 c4 20 addq $0x20, %rsp + // 129: 5d popq %rbp + // 12a: e9 00 00 00 00 jmp 0x12f <__JIT_ENTRY+0x12f> + // 000000000000012b: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 12f: 48 8b 4d e8 movq -0x18(%rbp), %rcx + // 133: 48 85 c9 testq %rcx, %rcx + // 136: 74 1a je 0x152 <__JIT_ENTRY+0x152> + // 138: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 13c: 48 89 0c d8 movq %rcx, (%rax,%rbx,8) + // 140: 4e 8d 2c f0 leaq (%rax,%r14,8), %r13 + // 144: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 148: 48 83 c4 20 addq $0x20, %rsp + // 14c: 5d popq %rbp + // 14d: e9 00 00 00 00 jmp 0x152 <__JIT_ENTRY+0x152> + // 000000000000014e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 152: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 156: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 15a: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 15e: 48 83 c4 20 addq $0x20, %rsp + // 162: 5d popq %rbp + // 163: e9 00 00 00 00 jmp 0x168 <__JIT_ENTRY+0x168> + // 0000000000000164: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[360] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xd9, + 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x31, 0xd2, 0x31, + 0xf6, 0x4b, 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x40, + 0x0f, 0x95, 0xc7, 0x41, 0x0f, 0x94, 0xc1, 0x4c, + 0x8b, 0x41, 0x08, 0x4c, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x85, 0xdd, 0x00, 0x00, 0x00, + 0x4c, 0x8b, 0x41, 0x10, 0x41, 0x81, 0x78, 0x10, + 0x80, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xcb, 0x00, + 0x00, 0x00, 0x44, 0x8d, 0x14, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x89, 0xeb, 0x4d, 0x29, 0xd3, + 0x44, 0x88, 0xce, 0x49, 0x8d, 0x34, 0xf3, 0x48, + 0x83, 0xc6, 0xf8, 0x40, 0x88, 0xfa, 0x01, 0xc2, + 0x49, 0x8b, 0x40, 0x08, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x79, 0x18, 0x89, 0xd2, 0xff, + 0xd0, 0x48, 0x89, 0x45, 0xe8, 0x49, 0x8b, 0x44, + 0x24, 0x40, 0x48, 0x89, 0x45, 0xf8, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x7c, 0xdd, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x75, 0xf0, 0x4d, 0x89, 0xfe, 0x4b, 0x8b, 0x7c, + 0xfd, 0x00, 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc0, 0x74, 0x4a, 0x44, 0x0f, 0xb7, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xc7, + 0x49, 0x83, 0xc5, 0xf8, 0xeb, 0x17, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x22, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x83, 0xc4, + 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x4d, 0xe8, 0x48, 0x85, 0xc9, 0x74, 0x1a, + 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x89, 0x0c, 0xd8, + 0x4e, 0x8d, 0x2c, 0xf0, 0x4c, 0x8b, 0x75, 0xf0, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf8, 0x4c, 0x8d, + 0x2c, 0xd8, 0x4c, 0x8b, 0x75, 0xf0, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyCFunction_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyCFunction_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xdc, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x11f, (uintptr_t)data + -0x4); + patch_32r(code + 0x12b, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x14e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x164, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST_WITH_KEYWORDS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 4c 63 f9 movslq %ecx, %r15 + // 16: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 1b: 29 c1 subl %eax, %ecx + // 1d: 48 63 d9 movslq %ecx, %rbx + // 20: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // 25: 31 d2 xorl %edx, %edx + // 27: 31 f6 xorl %esi, %esi + // 29: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2f: 40 0f 95 c7 setne %dil + // 33: 41 0f 94 c1 sete %r9b + // 37: 4c 8b 41 08 movq 0x8(%rcx), %r8 + // 3b: 4c 3b 05 00 00 00 00 cmpq (%rip), %r8 ## 0x42 <__JIT_ENTRY+0x42> + // 000000000000003e: X86_64_RELOC_GOT _PyCFunction_Type@GOTPCREL + // 42: 0f 85 dd 00 00 00 jne 0x125 <__JIT_ENTRY+0x125> + // 48: 4c 8b 41 10 movq 0x10(%rcx), %r8 + // 4c: 41 81 78 10 82 00 00 00 cmpl $0x82, 0x10(%r8) + // 54: 0f 85 cb 00 00 00 jne 0x125 <__JIT_ENTRY+0x125> + // 5a: 44 8d 14 c5 00 00 00 00 leal (,%rax,8), %r10d + // 62: 4d 89 eb movq %r13, %r11 + // 65: 4d 29 d3 subq %r10, %r11 + // 68: 44 88 ce movb %r9b, %sil + // 6b: 49 8d 34 f3 leaq (%r11,%rsi,8), %rsi + // 6f: 48 83 c6 f8 addq $-0x8, %rsi + // 73: 40 88 fa movb %dil, %dl + // 76: 01 c2 addl %eax, %edx + // 78: 49 8b 40 08 movq 0x8(%r8), %rax + // 7c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 81: 48 8b 79 18 movq 0x18(%rcx), %rdi + // 85: 89 d2 movl %edx, %edx + // 87: 31 c9 xorl %ecx, %ecx + // 89: ff d0 callq *%rax + // 8b: 48 89 45 e8 movq %rax, -0x18(%rbp) + // 8f: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 94: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 98: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a1: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // a6: 8b 07 movl (%rdi), %eax + // a8: 85 c0 testl %eax, %eax + // aa: 78 0c js 0xb8 <__JIT_ENTRY+0xb8> + // ac: ff c8 decl %eax + // ae: 89 07 movl %eax, (%rdi) + // b0: 75 06 jne 0xb8 <__JIT_ENTRY+0xb8> + // b2: ff 15 00 00 00 00 callq *(%rip) ## 0xb8 <__JIT_ENTRY+0xb8> + // 00000000000000b4: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b8: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // bc: 4d 89 fe movq %r15, %r14 + // bf: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // c4: 48 85 ff testq %rdi, %rdi + // c7: 74 12 je 0xdb <__JIT_ENTRY+0xdb> + // c9: 8b 07 movl (%rdi), %eax + // cb: 85 c0 testl %eax, %eax + // cd: 78 0c js 0xdb <__JIT_ENTRY+0xdb> + // cf: ff c8 decl %eax + // d1: 89 07 movl %eax, (%rdi) + // d3: 75 06 jne 0xdb <__JIT_ENTRY+0xdb> + // d5: ff 15 00 00 00 00 callq *(%rip) ## 0xdb <__JIT_ENTRY+0xdb> + // 00000000000000d7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // db: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xe2 <__JIT_ENTRY+0xe2> + // 00000000000000de: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // e2: 66 85 c0 testw %ax, %ax + // e5: 74 48 je 0x12f <__JIT_ENTRY+0x12f> + // e7: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d ## 0xef <__JIT_ENTRY+0xef> + // 00000000000000eb: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // ef: 49 ff c7 incq %r15 + // f2: 49 83 c5 f8 addq $-0x8, %r13 + // f6: eb 15 jmp 0x10d <__JIT_ENTRY+0x10d> + // f8: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // 100: 49 ff cf decq %r15 + // 103: 49 83 c5 f8 addq $-0x8, %r13 + // 107: 49 83 ff 01 cmpq $0x1, %r15 + // 10b: 76 22 jbe 0x12f <__JIT_ENTRY+0x12f> + // 10d: 49 8b 7d 00 movq (%r13), %rdi + // 111: 8b 07 movl (%rdi), %eax + // 113: 85 c0 testl %eax, %eax + // 115: 78 e9 js 0x100 <__JIT_ENTRY+0x100> + // 117: ff c8 decl %eax + // 119: 89 07 movl %eax, (%rdi) + // 11b: 75 e3 jne 0x100 <__JIT_ENTRY+0x100> + // 11d: ff 15 00 00 00 00 callq *(%rip) ## 0x123 <__JIT_ENTRY+0x123> + // 000000000000011f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 123: eb db jmp 0x100 <__JIT_ENTRY+0x100> + // 125: 48 83 c4 20 addq $0x20, %rsp + // 129: 5d popq %rbp + // 12a: e9 00 00 00 00 jmp 0x12f <__JIT_ENTRY+0x12f> + // 000000000000012b: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 12f: 48 8b 4d e8 movq -0x18(%rbp), %rcx + // 133: 48 85 c9 testq %rcx, %rcx + // 136: 74 1a je 0x152 <__JIT_ENTRY+0x152> + // 138: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 13c: 48 89 0c d8 movq %rcx, (%rax,%rbx,8) + // 140: 4e 8d 2c f0 leaq (%rax,%r14,8), %r13 + // 144: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 148: 48 83 c4 20 addq $0x20, %rsp + // 14c: 5d popq %rbp + // 14d: e9 00 00 00 00 jmp 0x152 <__JIT_ENTRY+0x152> + // 000000000000014e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 152: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 156: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 15a: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 15e: 48 83 c4 20 addq $0x20, %rsp + // 162: 5d popq %rbp + // 163: e9 00 00 00 00 jmp 0x168 <__JIT_ENTRY+0x168> + // 0000000000000164: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[360] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xd9, + 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x31, 0xd2, 0x31, + 0xf6, 0x4b, 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x40, + 0x0f, 0x95, 0xc7, 0x41, 0x0f, 0x94, 0xc1, 0x4c, + 0x8b, 0x41, 0x08, 0x4c, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x85, 0xdd, 0x00, 0x00, 0x00, + 0x4c, 0x8b, 0x41, 0x10, 0x41, 0x81, 0x78, 0x10, + 0x82, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xcb, 0x00, + 0x00, 0x00, 0x44, 0x8d, 0x14, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x89, 0xeb, 0x4d, 0x29, 0xd3, + 0x44, 0x88, 0xce, 0x49, 0x8d, 0x34, 0xf3, 0x48, + 0x83, 0xc6, 0xf8, 0x40, 0x88, 0xfa, 0x01, 0xc2, + 0x49, 0x8b, 0x40, 0x08, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x79, 0x18, 0x89, 0xd2, 0x31, + 0xc9, 0xff, 0xd0, 0x48, 0x89, 0x45, 0xe8, 0x49, + 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, 0x45, 0xf8, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x7c, 0xdd, 0x00, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x75, 0xf0, 0x4d, 0x89, 0xfe, 0x4b, + 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x48, 0x44, + 0x0f, 0xb7, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0xff, 0xc7, 0x49, 0x83, 0xc5, 0xf8, 0xeb, 0x15, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x22, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x83, 0xc4, + 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x4d, 0xe8, 0x48, 0x85, 0xc9, 0x74, 0x1a, + 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x89, 0x0c, 0xd8, + 0x4e, 0x8d, 0x2c, 0xf0, 0x4c, 0x8b, 0x75, 0xf0, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf8, 0x4c, 0x8d, + 0x2c, 0xd8, 0x4c, 0x8b, 0x75, 0xf0, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyCFunction_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyCFunction_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xeb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x11f, (uintptr_t)data + -0x4); + patch_32r(code + 0x12b, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x14e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x164, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_BUILTIN_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_O.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 d1 movslq %ecx, %rdx + // 12: 31 c9 xorl %ecx, %ecx + // 14: 31 f6 xorl %esi, %esi + // 16: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 1c: 0f 94 c2 sete %dl + // 1f: 40 0f 95 c6 setne %sil + // 23: 01 c6 addl %eax, %esi + // 25: 83 fe 01 cmpl $0x1, %esi + // 28: 0f 85 d7 00 00 00 jne 0x105 <__JIT_ENTRY+0x105> + // 2e: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 33: 29 c6 subl %eax, %esi + // 35: 48 63 de movslq %esi, %rbx + // 38: 49 8b 74 dd 00 movq (%r13,%rbx,8), %rsi + // 3d: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 41: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi ## 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_GOT _PyCFunction_Type@GOTPCREL + // 48: 0f 85 b7 00 00 00 jne 0x105 <__JIT_ENTRY+0x105> + // 4e: 48 8b 7e 10 movq 0x10(%rsi), %rdi + // 52: 83 7f 10 08 cmpl $0x8, 0x10(%rdi) + // 56: 0f 85 a9 00 00 00 jne 0x105 <__JIT_ENTRY+0x105> + // 5c: 45 8b 46 34 movl 0x34(%r14), %r8d + // 60: 45 85 c0 testl %r8d, %r8d + // 63: 0f 8e 9c 00 00 00 jle 0x105 <__JIT_ENTRY+0x105> + // 69: c1 e0 03 shll $0x3, %eax + // 6c: 4d 89 e9 movq %r13, %r9 + // 6f: 49 29 c1 subq %rax, %r9 + // 72: 88 d1 movb %dl, %cl + // 74: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 7c: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 80: 4d 8b 3c 01 movq (%r9,%rax), %r15 + // 84: 41 ff c8 decl %r8d + // 87: 45 89 46 34 movl %r8d, 0x34(%r14) + // 8b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 90: 48 8b 7e 18 movq 0x18(%rsi), %rdi + // 94: 4c 89 fe movq %r15, %rsi + // 97: ff d1 callq *%rcx + // 99: 41 ff 46 34 incl 0x34(%r14) + // 9d: 41 8b 0f movl (%r15), %ecx + // a0: 85 c9 testl %ecx, %ecx + // a2: 78 16 js 0xba <__JIT_ENTRY+0xba> + // a4: ff c9 decl %ecx + // a6: 41 89 0f movl %ecx, (%r15) + // a9: 75 0f jne 0xba <__JIT_ENTRY+0xba> + // ab: 4c 89 ff movq %r15, %rdi + // ae: 49 89 c7 movq %rax, %r15 + // b1: ff 15 00 00 00 00 callq *(%rip) ## 0xb7 <__JIT_ENTRY+0xb7> + // 00000000000000b3: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b7: 4c 89 f8 movq %r15, %rax + // ba: 48 8d 0c dd 00 00 00 00 leaq (,%rbx,8), %rcx + // c2: 49 01 4c 24 40 addq %rcx, 0x40(%r12) + // c7: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // cc: 8b 0f movl (%rdi), %ecx + // ce: 85 c9 testl %ecx, %ecx + // d0: 78 12 js 0xe4 <__JIT_ENTRY+0xe4> + // d2: ff c9 decl %ecx + // d4: 89 0f movl %ecx, (%rdi) + // d6: 75 0c jne 0xe4 <__JIT_ENTRY+0xe4> + // d8: 48 89 c3 movq %rax, %rbx + // db: ff 15 00 00 00 00 callq *(%rip) ## 0xe1 <__JIT_ENTRY+0xe1> + // 00000000000000dd: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // e1: 48 89 d8 movq %rbx, %rax + // e4: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // f2: 48 85 c0 testq %rax, %rax + // f5: 74 14 je 0x10b <__JIT_ENTRY+0x10b> + // f7: 49 89 45 00 movq %rax, (%r13) + // fb: 49 83 c5 08 addq $0x8, %r13 + // ff: 5d popq %rbp + // 100: e9 00 00 00 00 jmp 0x105 <__JIT_ENTRY+0x105> + // 0000000000000101: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 105: 5d popq %rbp + // 106: e9 00 00 00 00 jmp 0x10b <__JIT_ENTRY+0x10b> + // 0000000000000107: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 10b: 5d popq %rbp + // 10c: e9 00 00 00 00 jmp 0x111 <__JIT_ENTRY+0x111> + // 000000000000010d: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[273] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xd1, 0x31, 0xc9, 0x31, 0xf6, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x0f, 0x94, 0xc2, 0x40, + 0x0f, 0x95, 0xc6, 0x01, 0xc6, 0x83, 0xfe, 0x01, + 0x0f, 0x85, 0xd7, 0x00, 0x00, 0x00, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc6, 0x48, 0x63, 0xde, + 0x49, 0x8b, 0x74, 0xdd, 0x00, 0x48, 0x8b, 0x7e, + 0x08, 0x48, 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xb7, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x7e, 0x10, 0x83, 0x7f, 0x10, 0x08, 0x0f, 0x85, + 0xa9, 0x00, 0x00, 0x00, 0x45, 0x8b, 0x46, 0x34, + 0x45, 0x85, 0xc0, 0x0f, 0x8e, 0x9c, 0x00, 0x00, + 0x00, 0xc1, 0xe0, 0x03, 0x4d, 0x89, 0xe9, 0x49, + 0x29, 0xc1, 0x88, 0xd1, 0x48, 0x8d, 0x04, 0xcd, + 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, 0x4f, 0x08, + 0x4d, 0x8b, 0x3c, 0x01, 0x41, 0xff, 0xc8, 0x45, + 0x89, 0x46, 0x34, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x8b, 0x7e, 0x18, 0x4c, 0x89, 0xfe, 0xff, + 0xd1, 0x41, 0xff, 0x46, 0x34, 0x41, 0x8b, 0x0f, + 0x85, 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x41, 0x89, + 0x0f, 0x75, 0x0f, 0x4c, 0x89, 0xff, 0x49, 0x89, + 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf8, 0x48, 0x8d, 0x0c, 0xdd, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x01, 0x4c, 0x24, 0x40, 0x49, + 0x8b, 0x7c, 0xdd, 0x00, 0x8b, 0x0f, 0x85, 0xc9, + 0x78, 0x12, 0xff, 0xc9, 0x89, 0x0f, 0x75, 0x0c, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x14, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyCFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xdd, (uintptr_t)data + -0x4); + patch_32r(code + 0x101, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x107, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x10d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_INTRINSIC_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x14 <__JIT_ENTRY+0x14> + // 0000000000000010: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 14: c1 e0 04 shll $0x4, %eax + // 17: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT_LOAD __PyIntrinsics_UnaryFunctions@GOTPCREL + // 1e: 4c 89 f7 movq %r14, %rdi + // 21: 48 89 de movq %rbx, %rsi + // 24: ff 14 01 callq *(%rcx,%rax) + // 27: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 35: 8b 0b movl (%rbx), %ecx + // 37: 85 c9 testl %ecx, %ecx + // 39: 78 06 js 0x41 <__JIT_ENTRY+0x41> + // 3b: ff c9 decl %ecx + // 3d: 89 0b movl %ecx, (%rbx) + // 3f: 74 0f je 0x50 <__JIT_ENTRY+0x50> + // 41: 48 85 c0 testq %rax, %rax + // 44: 74 1e je 0x64 <__JIT_ENTRY+0x64> + // 46: 49 89 45 f8 movq %rax, -0x8(%r13) + // 4a: 5d popq %rbp + // 4b: e9 00 00 00 00 jmp 0x50 <__JIT_ENTRY+0x50> + // 000000000000004c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 50: 48 89 df movq %rbx, %rdi + // 53: 48 89 c3 movq %rax, %rbx + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5c: 48 89 d8 movq %rbx, %rax + // 5f: 48 85 c0 testq %rax, %rax + // 62: 75 e2 jne 0x46 <__JIT_ENTRY+0x46> + // 64: 49 83 c5 f8 addq $-0x8, %r13 + // 68: 5d popq %rbp + // 69: e9 00 00 00 00 jmp 0x6e <__JIT_ENTRY+0x6e> + // 000000000000006a: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[110] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x48, 0x89, 0xde, 0xff, 0x14, 0x01, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, + 0x0f, 0x48, 0x85, 0xc0, 0x74, 0x1e, 0x49, 0x89, + 0x45, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, + 0x85, 0xc0, 0x75, 0xe2, 0x49, 0x83, 0xc5, 0xf8, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyIntrinsics_UnaryFunctions+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_UnaryFunctions); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); + patch_32r(code + 0x4c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_32r(code + 0x6a, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_INTRINSIC_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_2.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 f7 movq %r14, %rdi + // b: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // f: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x1f <__JIT_ENTRY+0x1f> + // 000000000000001b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 1f: c1 e0 04 shll $0x4, %eax + // 22: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_GOT_LOAD __PyIntrinsics_BinaryFunctions@GOTPCREL + // 29: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // 2d: 4c 89 fe movq %r15, %rsi + // 30: 48 89 da movq %rbx, %rdx + // 33: ff 14 01 callq *(%rcx,%rax) + // 36: 49 89 c6 movq %rax, %r14 + // 39: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 47: 41 8b 07 movl (%r15), %eax + // 4a: 85 c0 testl %eax, %eax + // 4c: 78 10 js 0x5e <__JIT_ENTRY+0x5e> + // 4e: ff c8 decl %eax + // 50: 41 89 07 movl %eax, (%r15) + // 53: 75 09 jne 0x5e <__JIT_ENTRY+0x5e> + // 55: 4c 89 ff movq %r15, %rdi + // 58: ff 15 00 00 00 00 callq *(%rip) ## 0x5e <__JIT_ENTRY+0x5e> + // 000000000000005a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5e: 8b 03 movl (%rbx), %eax + // 60: 85 c0 testl %eax, %eax + // 62: 78 06 js 0x6a <__JIT_ENTRY+0x6a> + // 64: ff c8 decl %eax + // 66: 89 03 movl %eax, (%rbx) + // 68: 74 1b je 0x85 <__JIT_ENTRY+0x85> + // 6a: 4d 85 f6 testq %r14, %r14 + // 6d: 74 24 je 0x93 <__JIT_ENTRY+0x93> + // 6f: 4d 89 75 f0 movq %r14, -0x10(%r13) + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 7b: 48 83 c4 10 addq $0x10, %rsp + // 7f: 5d popq %rbp + // 80: e9 00 00 00 00 jmp 0x85 <__JIT_ENTRY+0x85> + // 0000000000000081: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 85: 48 89 df movq %rbx, %rdi + // 88: ff 15 00 00 00 00 callq *(%rip) ## 0x8e <__JIT_ENTRY+0x8e> + // 000000000000008a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8e: 4d 85 f6 testq %r14, %r14 + // 91: 75 dc jne 0x6f <__JIT_ENTRY+0x6f> + // 93: 49 83 c5 f0 addq $-0x10, %r13 + // 97: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 9b: 48 83 c4 10 addq $0x10, %rsp + // 9f: 5d popq %rbp + // a0: e9 00 00 00 00 jmp 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[165] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xf7, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, + 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x04, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0x75, 0xf8, 0x4c, 0x89, 0xfe, + 0x48, 0x89, 0xda, 0xff, 0x14, 0x01, 0x49, 0x89, + 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, + 0x74, 0x1b, 0x4d, 0x85, 0xf6, 0x74, 0x24, 0x4d, + 0x89, 0x75, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, + 0xf6, 0x75, 0xdc, 0x49, 0x83, 0xc5, 0xf0, 0x4c, + 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyIntrinsics_BinaryFunctions+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_BinaryFunctions); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + -0x4); + patch_32r(code + 0x81, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + -0x4); + patch_32r(code + 0xa1, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_ISINSTANCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_ISINSTANCE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 48 63 d9 movslq %ecx, %rbx + // 16: 31 f6 xorl %esi, %esi + // 18: 31 c9 xorl %ecx, %ecx + // 1a: 49 83 7c dd 00 00 cmpq $0x0, (%r13,%rbx,8) + // 20: 40 0f 95 c6 setne %sil + // 24: 0f 94 c2 sete %dl + // 27: 01 c6 addl %eax, %esi + // 29: 83 fe 02 cmpl $0x2, %esi + // 2c: 75 1c jne 0x4a <__JIT_ENTRY+0x4a> + // 2e: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 33: 29 c6 subl %eax, %esi + // 35: 4c 63 fe movslq %esi, %r15 + // 38: 49 8b 76 10 movq 0x10(%r14), %rsi + // 3c: 48 8b b6 20 67 03 00 movq 0x36720(%rsi), %rsi + // 43: 4b 3b 74 fd 00 cmpq (%r13,%r15,8), %rsi + // 48: 74 0a je 0x54 <__JIT_ENTRY+0x54> + // 4a: 48 83 c4 20 addq $0x20, %rsp + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 54: c1 e0 03 shll $0x3, %eax + // 57: 4c 89 ee movq %r13, %rsi + // 5a: 48 29 c6 subq %rax, %rsi + // 5d: 88 d1 movb %dl, %cl + // 5f: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 67: 48 8b 3c 06 movq (%rsi,%rax), %rdi + // 6b: 48 8b 74 06 08 movq 0x8(%rsi,%rax), %rsi + // 70: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 75: ff 15 00 00 00 00 callq *(%rip) ## 0x7b <__JIT_ENTRY+0x7b> + // 0000000000000077: X86_64_RELOC_GOT _PyObject_IsInstance@GOTPCREL + // 7b: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // 80: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 89: 85 c0 testl %eax, %eax + // 8b: 0f 88 93 00 00 00 js 0x124 <__JIT_ENTRY+0x124> + // 91: 89 45 fc movl %eax, -0x4(%rbp) + // 94: 48 89 4d f0 movq %rcx, -0x10(%rbp) + // 98: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // 9d: 8b 07 movl (%rdi), %eax + // 9f: 85 c0 testl %eax, %eax + // a1: 78 0c js 0xaf <__JIT_ENTRY+0xaf> + // a3: ff c8 decl %eax + // a5: 89 07 movl %eax, (%rdi) + // a7: 75 06 jne 0xaf <__JIT_ENTRY+0xaf> + // a9: ff 15 00 00 00 00 callq *(%rip) ## 0xaf <__JIT_ENTRY+0xaf> + // 00000000000000ab: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // af: 4c 89 7d e8 movq %r15, -0x18(%rbp) + // b3: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // b8: 48 85 ff testq %rdi, %rdi + // bb: 74 12 je 0xcf <__JIT_ENTRY+0xcf> + // bd: 8b 07 movl (%rdi), %eax + // bf: 85 c0 testl %eax, %eax + // c1: 78 0c js 0xcf <__JIT_ENTRY+0xcf> + // c3: ff c8 decl %eax + // c5: 89 07 movl %eax, (%rdi) + // c7: 75 06 jne 0xcf <__JIT_ENTRY+0xcf> + // c9: ff 15 00 00 00 00 callq *(%rip) ## 0xcf <__JIT_ENTRY+0xcf> + // 00000000000000cb: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // cf: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xd6 <__JIT_ENTRY+0xd6> + // 00000000000000d2: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // d6: 66 85 c0 testw %ax, %ax + // d9: 74 3a je 0x115 <__JIT_ENTRY+0x115> + // db: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d ## 0xe3 <__JIT_ENTRY+0xe3> + // 00000000000000df: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // e3: 49 ff c7 incq %r15 + // e6: 49 83 c5 f8 addq $-0x8, %r13 + // ea: eb 11 jmp 0xfd <__JIT_ENTRY+0xfd> + // ec: 0f 1f 40 00 nopl (%rax) + // f0: 49 ff cf decq %r15 + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 49 83 ff 01 cmpq $0x1, %r15 + // fb: 76 18 jbe 0x115 <__JIT_ENTRY+0x115> + // fd: 49 8b 7d 00 movq (%r13), %rdi + // 101: 8b 07 movl (%rdi), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <__JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 07 movl %eax, (%rdi) + // 10b: 75 e3 jne 0xf0 <__JIT_ENTRY+0xf0> + // 10d: ff 15 00 00 00 00 callq *(%rip) ## 0x113 <__JIT_ENTRY+0x113> + // 000000000000010f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 113: eb db jmp 0xf0 <__JIT_ENTRY+0xf0> + // 115: 83 7d fc 00 cmpl $0x0, -0x4(%rbp) + // 119: 75 16 jne 0x131 <__JIT_ENTRY+0x131> + // 11b: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x122 <__JIT_ENTRY+0x122> + // 000000000000011e: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 122: eb 14 jmp 0x138 <__JIT_ENTRY+0x138> + // 124: 49 89 cd movq %rcx, %r13 + // 127: 48 83 c4 20 addq $0x20, %rsp + // 12b: 5d popq %rbp + // 12c: e9 00 00 00 00 jmp 0x131 <__JIT_ENTRY+0x131> + // 000000000000012d: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 131: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x138 <__JIT_ENTRY+0x138> + // 0000000000000134: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 138: 48 8b 4d e8 movq -0x18(%rbp), %rcx + // 13c: 48 8b 55 f0 movq -0x10(%rbp), %rdx + // 140: 48 89 04 ca movq %rax, (%rdx,%rcx,8) + // 144: 4c 8d 2c da leaq (%rdx,%rbx,8), %r13 + // 148: 48 83 c4 20 addq $0x20, %rsp + // 14c: 5d popq %rbp + // 14d: e9 00 00 00 00 jmp 0x152 <__JIT_ENTRY+0x152> + // 000000000000014e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[333] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xd9, 0x31, 0xf6, + 0x31, 0xc9, 0x49, 0x83, 0x7c, 0xdd, 0x00, 0x00, + 0x40, 0x0f, 0x95, 0xc6, 0x0f, 0x94, 0xc2, 0x01, + 0xc6, 0x83, 0xfe, 0x02, 0x75, 0x1c, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc6, 0x4c, 0x63, 0xfe, + 0x49, 0x8b, 0x76, 0x10, 0x48, 0x8b, 0xb6, 0x20, + 0x67, 0x03, 0x00, 0x4b, 0x3b, 0x74, 0xfd, 0x00, + 0x74, 0x0a, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, + 0x89, 0xee, 0x48, 0x29, 0xc6, 0x88, 0xd1, 0x48, + 0x8d, 0x04, 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x48, + 0x8b, 0x3c, 0x06, 0x48, 0x8b, 0x74, 0x06, 0x08, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x0f, 0x88, 0x93, 0x00, 0x00, + 0x00, 0x89, 0x45, 0xfc, 0x48, 0x89, 0x4d, 0xf0, + 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0x7d, 0xe8, 0x49, 0x8b, 0x7c, 0xdd, 0x00, + 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x3a, 0x44, 0x0f, 0xb7, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0xff, 0xc7, 0x49, 0x83, + 0xc5, 0xf8, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x83, 0x7d, 0xfc, + 0x00, 0x75, 0x16, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x14, 0x49, 0x89, 0xcd, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x4d, 0xe8, 0x48, 0x8b, 0x55, 0xf0, + 0x48, 0x89, 0x04, 0xca, 0x4c, 0x8d, 0x2c, 0xda, + 0x48, 0x83, 0xc4, 0x20, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: OPARG + // 20: &PyObject_IsInstance+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&PyObject_IsInstance); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x14); + patch_32r(code + 0x50, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xdf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x10f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x11e, (uintptr_t)data + 0x4); + patch_32r(code + 0x12d, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x134, (uintptr_t)data + -0x4); +} + +void +emit__CALL_KW_NON_PY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_KW_NON_PY.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // c: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 13: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 17: 89 d8 movl %ebx, %eax + // 19: f7 d0 notl %eax + // 1b: 48 98 cltq + // 1d: 48 89 45 e8 movq %rax, -0x18(%rbp) + // 21: 48 8d 04 c5 00 00 00 00 leaq (,%rax,8), %rax + // 29: 4c 01 e8 addq %r13, %rax + // 2c: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 31: 29 d9 subl %ebx, %ecx + // 33: 48 63 f1 movslq %ecx, %rsi + // 36: b9 fd ff ff ff movl $0xfffffffd, %ecx ## imm = 0xFFFFFFFD + // 3b: 29 d9 subl %ebx, %ecx + // 3d: 4c 63 f1 movslq %ecx, %r14 + // 40: 4b 8b 7c f5 00 movq (%r13,%r14,8), %rdi + // 45: 31 c9 xorl %ecx, %ecx + // 47: 31 d2 xorl %edx, %edx + // 49: 48 89 75 f8 movq %rsi, -0x8(%rbp) + // 4d: 49 83 7c f5 00 00 cmpq $0x0, (%r13,%rsi,8) + // 53: 0f 95 c1 setne %cl + // 56: 0f 94 c2 sete %dl + // 59: 48 8d 34 d0 leaq (%rax,%rdx,8), %rsi + // 5d: 48 83 c6 f8 addq $-0x8, %rsi + // 61: 01 d9 addl %ebx, %ecx + // 63: 41 2b 4f 10 subl 0x10(%r15), %ecx + // 67: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6c: 48 63 c1 movslq %ecx, %rax + // 6f: 48 ba 00 00 00 00 00 00 00 80 movabsq $-0x8000000000000000, %rdx ## imm = 0x8000000000000000 + // 79: 48 09 c2 orq %rax, %rdx + // 7c: 4c 89 f9 movq %r15, %rcx + // 7f: ff 15 00 00 00 00 callq *(%rip) ## 0x85 <__JIT_ENTRY+0x85> + // 0000000000000081: X86_64_RELOC_GOT _PyObject_Vectorcall@GOTPCREL + // 85: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 8b: 48 89 45 e0 movq %rax, -0x20(%rbp) + // 8f: 41 8b 07 movl (%r15), %eax + // 92: 85 c0 testl %eax, %eax + // 94: 78 10 js 0xa6 <__JIT_ENTRY+0xa6> + // 96: ff c8 decl %eax + // 98: 41 89 07 movl %eax, (%r15) + // 9b: 75 09 jne 0xa6 <__JIT_ENTRY+0xa6> + // 9d: 4c 89 ff movq %r15, %rdi + // a0: ff 15 00 00 00 00 callq *(%rip) ## 0xa6 <__JIT_ENTRY+0xa6> + // 00000000000000a2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a6: 4d 8b 7c 24 40 movq 0x40(%r12), %r15 + // ab: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b4: 4b 8b 7c f5 00 movq (%r13,%r14,8), %rdi + // b9: 8b 07 movl (%rdi), %eax + // bb: 85 c0 testl %eax, %eax + // bd: 78 0c js 0xcb <__JIT_ENTRY+0xcb> + // bf: ff c8 decl %eax + // c1: 89 07 movl %eax, (%rdi) + // c3: 75 06 jne 0xcb <__JIT_ENTRY+0xcb> + // c5: ff 15 00 00 00 00 callq *(%rip) ## 0xcb <__JIT_ENTRY+0xcb> + // 00000000000000c7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // cb: 48 8b 45 f8 movq -0x8(%rbp), %rax + // cf: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // d4: 48 85 ff testq %rdi, %rdi + // d7: 74 12 je 0xeb <__JIT_ENTRY+0xeb> + // d9: 8b 07 movl (%rdi), %eax + // db: 85 c0 testl %eax, %eax + // dd: 78 0c js 0xeb <__JIT_ENTRY+0xeb> + // df: ff c8 decl %eax + // e1: 89 07 movl %eax, (%rdi) + // e3: 75 06 jne 0xeb <__JIT_ENTRY+0xeb> + // e5: ff 15 00 00 00 00 callq *(%rip) ## 0xeb <__JIT_ENTRY+0xeb> + // 00000000000000e7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // eb: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xf2 <__JIT_ENTRY+0xf2> + // 00000000000000ee: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // f2: 66 85 c0 testw %ax, %ax + // f5: 74 48 je 0x13f <__JIT_ENTRY+0x13f> + // f7: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d ## 0xff <__JIT_ENTRY+0xff> + // 00000000000000fb: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // ff: 49 ff c6 incq %r14 + // 102: f7 db negl %ebx + // 104: 48 63 c3 movslq %ebx, %rax + // 107: 48 8d 1c c5 f0 ff ff ff leaq -0x10(,%rax,8), %rbx + // 10f: 4c 01 eb addq %r13, %rbx + // 112: 4c 8b 2d 00 00 00 00 movq (%rip), %r13 ## 0x119 <__JIT_ENTRY+0x119> + // 0000000000000115: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // 119: eb 0e jmp 0x129 <__JIT_ENTRY+0x129> + // 11b: 0f 1f 44 00 00 nopl (%rax,%rax) + // 120: 49 ff ce decq %r14 + // 123: 49 83 fe 01 cmpq $0x1, %r14 + // 127: 76 16 jbe 0x13f <__JIT_ENTRY+0x13f> + // 129: 4a 8b 7c f3 f8 movq -0x8(%rbx,%r14,8), %rdi + // 12e: 8b 07 movl (%rdi), %eax + // 130: 85 c0 testl %eax, %eax + // 132: 78 ec js 0x120 <__JIT_ENTRY+0x120> + // 134: ff c8 decl %eax + // 136: 89 07 movl %eax, (%rdi) + // 138: 75 e6 jne 0x120 <__JIT_ENTRY+0x120> + // 13a: 41 ff d5 callq *%r13 + // 13d: eb e1 jmp 0x120 <__JIT_ENTRY+0x120> + // 13f: 48 8b 4d e0 movq -0x20(%rbp), %rcx + // 143: 48 85 c9 testq %rcx, %rcx + // 146: 74 1e je 0x166 <__JIT_ENTRY+0x166> + // 148: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 14c: 49 89 0c c7 movq %rcx, (%r15,%rax,8) + // 150: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 154: 4d 8d 2c c7 leaq (%r15,%rax,8), %r13 + // 158: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 15c: 48 83 c4 20 addq $0x20, %rsp + // 160: 5d popq %rbp + // 161: e9 00 00 00 00 jmp 0x166 <__JIT_ENTRY+0x166> + // 0000000000000162: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 166: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 16a: 4d 8d 2c c7 leaq (%r15,%rax,8), %r13 + // 16e: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 172: 48 83 c4 20 addq $0x20, %rsp + // 176: 5d popq %rbp + // 177: e9 00 00 00 00 jmp 0x17c <__JIT_ENTRY+0x17c> + // 0000000000000178: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[380] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4c, 0x89, 0x75, 0xf0, 0x0f, 0xb7, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x7d, 0xf8, 0x89, + 0xd8, 0xf7, 0xd0, 0x48, 0x98, 0x48, 0x89, 0x45, + 0xe8, 0x48, 0x8d, 0x04, 0xc5, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x01, 0xe8, 0xb9, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xd9, 0x48, 0x63, 0xf1, 0xb9, 0xfd, + 0xff, 0xff, 0xff, 0x29, 0xd9, 0x4c, 0x63, 0xf1, + 0x4b, 0x8b, 0x7c, 0xf5, 0x00, 0x31, 0xc9, 0x31, + 0xd2, 0x48, 0x89, 0x75, 0xf8, 0x49, 0x83, 0x7c, + 0xf5, 0x00, 0x00, 0x0f, 0x95, 0xc1, 0x0f, 0x94, + 0xc2, 0x48, 0x8d, 0x34, 0xd0, 0x48, 0x83, 0xc6, + 0xf8, 0x01, 0xd9, 0x41, 0x2b, 0x4f, 0x10, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x63, 0xc1, 0x48, + 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x48, 0x09, 0xc2, 0x4c, 0x89, 0xf9, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xf8, 0x48, 0x89, 0x45, 0xe0, 0x41, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x7c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x7c, 0xf5, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf8, 0x49, + 0x8b, 0x7c, 0xc5, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x48, 0x44, + 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x49, + 0xff, 0xc6, 0xf7, 0xdb, 0x48, 0x63, 0xc3, 0x48, + 0x8d, 0x1c, 0xc5, 0xf0, 0xff, 0xff, 0xff, 0x4c, + 0x01, 0xeb, 0x4c, 0x8b, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0xeb, 0x0e, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xff, 0xce, 0x49, 0x83, 0xfe, 0x01, 0x76, + 0x16, 0x4a, 0x8b, 0x7c, 0xf3, 0xf8, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0xec, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0xe6, 0x41, 0xff, 0xd5, 0xeb, 0xe1, 0x48, + 0x8b, 0x4d, 0xe0, 0x48, 0x85, 0xc9, 0x74, 0x1e, + 0x48, 0x8b, 0x45, 0xf8, 0x49, 0x89, 0x0c, 0xc7, + 0x48, 0x8b, 0x45, 0xe8, 0x4d, 0x8d, 0x2c, 0xc7, + 0x4c, 0x8b, 0x75, 0xf0, 0x48, 0x83, 0xc4, 0x20, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x45, 0xf8, 0x4d, 0x8d, 0x2c, 0xc7, 0x4c, 0x8b, + 0x75, 0xf0, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyObject_Vectorcall+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyObject_Vectorcall); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xc7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xee, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x115, (uintptr_t)data + -0x4); + patch_32r(code + 0x162, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x178, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LEN.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 48 63 d1 movslq %ecx, %rdx + // 16: 31 c9 xorl %ecx, %ecx + // 18: 31 f6 xorl %esi, %esi + // 1a: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 20: 0f 94 c2 sete %dl + // 23: 40 0f 95 c6 setne %sil + // 27: 01 c6 addl %eax, %esi + // 29: 83 fe 01 cmpl $0x1, %esi + // 2c: 75 1c jne 0x4a <__JIT_ENTRY+0x4a> + // 2e: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 33: 29 c6 subl %eax, %esi + // 35: 4c 63 fe movslq %esi, %r15 + // 38: 49 8b 76 10 movq 0x10(%r14), %rsi + // 3c: 48 8b b6 28 67 03 00 movq 0x36728(%rsi), %rsi + // 43: 4b 3b 74 fd 00 cmpq (%r13,%r15,8), %rsi + // 48: 74 0a je 0x54 <__JIT_ENTRY+0x54> + // 4a: 48 83 c4 10 addq $0x10, %rsp + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 54: c1 e0 03 shll $0x3, %eax + // 57: 4c 89 ee movq %r13, %rsi + // 5a: 48 29 c6 subq %rax, %rsi + // 5d: 88 d1 movb %dl, %cl + // 5f: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 67: 48 8b 1c 06 movq (%rsi,%rax), %rbx + // 6b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 70: 48 89 df movq %rbx, %rdi + // 73: ff 15 00 00 00 00 callq *(%rip) ## 0x79 <__JIT_ENTRY+0x79> + // 0000000000000075: X86_64_RELOC_GOT _PyObject_Size@GOTPCREL + // 79: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // 7e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 87: 48 85 c0 testq %rax, %rax + // 8a: 0f 88 80 00 00 00 js 0x110 <__JIT_ENTRY+0x110> + // 90: 48 89 4d f8 movq %rcx, -0x8(%rbp) + // 94: 48 89 c7 movq %rax, %rdi + // 97: ff 15 00 00 00 00 callq *(%rip) ## 0x9d <__JIT_ENTRY+0x9d> + // 0000000000000099: X86_64_RELOC_GOT _PyLong_FromSsize_t@GOTPCREL + // 9d: 48 85 c0 testq %rax, %rax + // a0: 74 7b je 0x11d <__JIT_ENTRY+0x11d> + // a2: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // a6: 49 89 4c 24 40 movq %rcx, 0x40(%r12) + // ab: 8b 0b movl (%rbx), %ecx + // ad: 85 c9 testl %ecx, %ecx + // af: 78 15 js 0xc6 <__JIT_ENTRY+0xc6> + // b1: ff c9 decl %ecx + // b3: 89 0b movl %ecx, (%rbx) + // b5: 75 0f jne 0xc6 <__JIT_ENTRY+0xc6> + // b7: 48 89 df movq %rbx, %rdi + // ba: 48 89 c3 movq %rax, %rbx + // bd: ff 15 00 00 00 00 callq *(%rip) ## 0xc3 <__JIT_ENTRY+0xc3> + // 00000000000000bf: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c3: 48 89 d8 movq %rbx, %rax + // c6: 4a 8d 0c fd 00 00 00 00 leaq (,%r15,8), %rcx + // ce: 49 01 4c 24 40 addq %rcx, 0x40(%r12) + // d3: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // d8: 8b 0f movl (%rdi), %ecx + // da: 85 c9 testl %ecx, %ecx + // dc: 78 12 js 0xf0 <__JIT_ENTRY+0xf0> + // de: ff c9 decl %ecx + // e0: 89 0f movl %ecx, (%rdi) + // e2: 75 0c jne 0xf0 <__JIT_ENTRY+0xf0> + // e4: 48 89 c3 movq %rax, %rbx + // e7: ff 15 00 00 00 00 callq *(%rip) ## 0xed <__JIT_ENTRY+0xed> + // 00000000000000e9: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ed: 48 89 d8 movq %rbx, %rax + // f0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fe: 49 89 45 00 movq %rax, (%r13) + // 102: 49 83 c5 08 addq $0x8, %r13 + // 106: 48 83 c4 10 addq $0x10, %rsp + // 10a: 5d popq %rbp + // 10b: e9 00 00 00 00 jmp 0x110 <__JIT_ENTRY+0x110> + // 000000000000010c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 110: 49 89 cd movq %rcx, %r13 + // 113: 48 83 c4 10 addq $0x10, %rsp + // 117: 5d popq %rbp + // 118: e9 00 00 00 00 jmp 0x11d <__JIT_ENTRY+0x11d> + // 0000000000000119: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 11d: 4c 8b 6d f8 movq -0x8(%rbp), %r13 + // 121: 48 83 c4 10 addq $0x10, %rsp + // 125: 5d popq %rbp + // 126: e9 00 00 00 00 jmp 0x12b <__JIT_ENTRY+0x12b> + // 0000000000000127: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[299] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xd1, 0x31, 0xc9, + 0x31, 0xf6, 0x49, 0x83, 0x7c, 0xd5, 0x00, 0x00, + 0x0f, 0x94, 0xc2, 0x40, 0x0f, 0x95, 0xc6, 0x01, + 0xc6, 0x83, 0xfe, 0x01, 0x75, 0x1c, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc6, 0x4c, 0x63, 0xfe, + 0x49, 0x8b, 0x76, 0x10, 0x48, 0x8b, 0xb6, 0x28, + 0x67, 0x03, 0x00, 0x4b, 0x3b, 0x74, 0xfd, 0x00, + 0x74, 0x0a, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, + 0x89, 0xee, 0x48, 0x29, 0xc6, 0x88, 0xd1, 0x48, + 0x8d, 0x04, 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x48, + 0x8b, 0x1c, 0x06, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x4c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x0f, 0x88, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x89, 0x4d, 0xf8, 0x48, 0x89, 0xc7, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x7b, 0x48, 0x8b, 0x4d, 0xf8, 0x49, 0x89, + 0x4c, 0x24, 0x40, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x15, 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, + 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x4a, 0x8d, + 0x0c, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x49, 0x01, + 0x4c, 0x24, 0x40, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, + 0x8b, 0x0f, 0x85, 0xc9, 0x78, 0x12, 0xff, 0xc9, + 0x89, 0x0f, 0x75, 0x0c, 0x48, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xcd, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x6d, + 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyLong_FromSsize_t+0x0 + // 10: &PyObject_Size+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x10, (uintptr_t)&PyObject_Size); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x14); + patch_32r(code + 0x50, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + -0x4); + patch_32r(code + 0x10c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x119, state->instruction_starts[instruction->error_target] + -0x4); + patch_32r(code + 0x127, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LIST_APPEND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 5d e8 movq -0x18(%r13), %rbx + // 4: 49 8b 46 10 movq 0x10(%r14), %rax + // 8: 48 39 98 30 67 03 00 cmpq %rbx, 0x36730(%rax) + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 19: 49 8b 47 08 movq 0x8(%r15), %rax + // 1d: f6 80 ab 00 00 00 02 testb $0x2, 0xab(%rax) + // 24: 0f 84 00 00 00 00 je 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2a: 55 pushq %rbp + // 2b: 48 89 e5 movq %rsp, %rbp + // 2e: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 32: 49 83 c5 f0 addq $-0x10, %r13 + // 36: 49 8b 47 10 movq 0x10(%r15), %rax + // 3a: 49 39 47 20 cmpq %rax, 0x20(%r15) + // 3e: 7e 1f jle 0x5f <__JIT_ENTRY+0x5f> + // 40: 49 8b 4f 18 movq 0x18(%r15), %rcx + // 44: 48 89 34 c1 movq %rsi, (%rcx,%rax,8) + // 48: 48 ff c0 incq %rax + // 4b: 49 89 47 10 movq %rax, 0x10(%r15) + // 4f: b1 01 movb $0x1, %cl + // 51: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 56: 41 8b 07 movl (%r15), %eax + // 59: 85 c0 testl %eax, %eax + // 5b: 79 1c jns 0x79 <__JIT_ENTRY+0x79> + // 5d: eb 30 jmp 0x8f <__JIT_ENTRY+0x8f> + // 5f: 4c 89 ff movq %r15, %rdi + // 62: ff 15 00 00 00 00 callq *(%rip) ## 0x68 <__JIT_ENTRY+0x68> + // 0000000000000064: X86_64_RELOC_GOT __PyList_AppendTakeRefListResize@GOTPCREL + // 68: 85 c0 testl %eax, %eax + // 6a: 0f 94 c1 sete %cl + // 6d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 72: 41 8b 07 movl (%r15), %eax + // 75: 85 c0 testl %eax, %eax + // 77: 78 16 js 0x8f <__JIT_ENTRY+0x8f> + // 79: ff c8 decl %eax + // 7b: 41 89 07 movl %eax, (%r15) + // 7e: 75 0f jne 0x8f <__JIT_ENTRY+0x8f> + // 80: 4c 89 ff movq %r15, %rdi + // 83: 41 89 cf movl %ecx, %r15d + // 86: ff 15 00 00 00 00 callq *(%rip) ## 0x8c <__JIT_ENTRY+0x8c> + // 0000000000000088: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8c: 44 89 f9 movl %r15d, %ecx + // 8f: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 95: 8b 03 movl (%rbx), %eax + // 97: 85 c0 testl %eax, %eax + // 99: 78 13 js 0xae <__JIT_ENTRY+0xae> + // 9b: ff c8 decl %eax + // 9d: 89 03 movl %eax, (%rbx) + // 9f: 75 0d jne 0xae <__JIT_ENTRY+0xae> + // a1: 48 89 df movq %rbx, %rdi + // a4: 89 cb movl %ecx, %ebx + // a6: ff 15 00 00 00 00 callq *(%rip) ## 0xac <__JIT_ENTRY+0xac> + // 00000000000000a8: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ac: 89 d9 movl %ebx, %ecx + // ae: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // bc: 84 c9 testb %cl, %cl + // be: 5d popq %rbp + // bf: 0f 84 00 00 00 00 je 0xc5 <__JIT_ENTRY+0xc5> + // 00000000000000c1: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // c5: e9 00 00 00 00 jmp 0xca <__JIT_ENTRY+0xca> + // 00000000000000c6: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[197] = { + 0x49, 0x8b, 0x5d, 0xe8, 0x49, 0x8b, 0x46, 0x10, + 0x48, 0x39, 0x98, 0x30, 0x67, 0x03, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x7d, + 0xf0, 0x49, 0x8b, 0x47, 0x08, 0xf6, 0x80, 0xab, + 0x00, 0x00, 0x00, 0x02, 0x0f, 0x84, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, + 0x75, 0xf8, 0x49, 0x83, 0xc5, 0xf0, 0x49, 0x8b, + 0x47, 0x10, 0x49, 0x39, 0x47, 0x20, 0x7e, 0x1f, + 0x49, 0x8b, 0x4f, 0x18, 0x48, 0x89, 0x34, 0xc1, + 0x48, 0xff, 0xc0, 0x49, 0x89, 0x47, 0x10, 0xb1, + 0x01, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x79, 0x1c, 0xeb, 0x30, 0x4c, + 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x0f, 0x94, 0xc1, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x16, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x0f, + 0x4c, 0x89, 0xff, 0x41, 0x89, 0xcf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x89, 0xf9, 0x49, + 0x83, 0x44, 0x24, 0x40, 0xf8, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x13, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x0d, 0x48, 0x89, 0xdf, 0x89, 0xcb, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd9, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x84, 0xc9, 0x5d, 0x0f, + 0x84, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyList_AppendTakeRefListResize+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyList_AppendTakeRefListResize); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x64, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xa8, (uintptr_t)data + -0x4); + patch_32r(code + 0xc1, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 4c 63 f9 movslq %ecx, %r15 + // 16: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 1b: 29 c1 subl %eax, %ecx + // 1d: 48 63 d9 movslq %ecx, %rbx + // 20: 4d 8b 4c dd 00 movq (%r13,%rbx,8), %r9 + // 25: 31 c9 xorl %ecx, %ecx + // 27: 31 f6 xorl %esi, %esi + // 29: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2f: 0f 95 c2 setne %dl + // 32: 40 0f 94 c7 sete %dil + // 36: 4d 8b 41 08 movq 0x8(%r9), %r8 + // 3a: 4c 3b 05 00 00 00 00 cmpq (%rip), %r8 ## 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_GOT _PyMethodDescr_Type@GOTPCREL + // 41: 75 34 jne 0x77 <__JIT_ENTRY+0x77> + // 43: 4d 8b 41 28 movq 0x28(%r9), %r8 + // 47: 41 81 78 10 80 00 00 00 cmpl $0x80, 0x10(%r8) + // 4f: 75 26 jne 0x77 <__JIT_ENTRY+0x77> + // 51: 44 8d 14 c5 00 00 00 00 leal (,%rax,8), %r10d + // 59: 4d 89 eb movq %r13, %r11 + // 5c: 4d 29 d3 subq %r10, %r11 + // 5f: 40 88 fe movb %dil, %sil + // 62: 49 8d 34 f3 leaq (%r11,%rsi,8), %rsi + // 66: 48 83 c6 f8 addq $-0x8, %rsi + // 6a: 48 8b 3e movq (%rsi), %rdi + // 6d: 4c 8b 57 08 movq 0x8(%rdi), %r10 + // 71: 4d 3b 51 10 cmpq 0x10(%r9), %r10 + // 75: 74 0a je 0x81 <__JIT_ENTRY+0x81> + // 77: 48 83 c4 20 addq $0x20, %rsp + // 7b: 5d popq %rbp + // 7c: e9 00 00 00 00 jmp 0x81 <__JIT_ENTRY+0x81> + // 000000000000007d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 81: 88 d1 movb %dl, %cl + // 83: 01 c8 addl %ecx, %eax + // 85: ff c8 decl %eax + // 87: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8c: 48 83 c6 08 addq $0x8, %rsi + // 90: 48 63 d0 movslq %eax, %rdx + // 93: 41 ff 50 08 callq *0x8(%r8) + // 97: 48 89 45 e8 movq %rax, -0x18(%rbp) + // 9b: 49 8b 44 24 40 movq 0x40(%r12), %rax + // a0: 48 89 45 f8 movq %rax, -0x8(%rbp) + // a4: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ad: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // b2: 8b 07 movl (%rdi), %eax + // b4: 85 c0 testl %eax, %eax + // b6: 78 0c js 0xc4 <__JIT_ENTRY+0xc4> + // b8: ff c8 decl %eax + // ba: 89 07 movl %eax, (%rdi) + // bc: 75 06 jne 0xc4 <__JIT_ENTRY+0xc4> + // be: ff 15 00 00 00 00 callq *(%rip) ## 0xc4 <__JIT_ENTRY+0xc4> + // 00000000000000c0: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c4: 4c 89 7d f0 movq %r15, -0x10(%rbp) + // c8: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // cd: 48 85 ff testq %rdi, %rdi + // d0: 74 12 je 0xe4 <__JIT_ENTRY+0xe4> + // d2: 8b 07 movl (%rdi), %eax + // d4: 85 c0 testl %eax, %eax + // d6: 78 0c js 0xe4 <__JIT_ENTRY+0xe4> + // d8: ff c8 decl %eax + // da: 89 07 movl %eax, (%rdi) + // dc: 75 06 jne 0xe4 <__JIT_ENTRY+0xe4> + // de: ff 15 00 00 00 00 callq *(%rip) ## 0xe4 <__JIT_ENTRY+0xe4> + // 00000000000000e0: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // e4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xeb <__JIT_ENTRY+0xeb> + // 00000000000000e7: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // eb: 66 85 c0 testw %ax, %ax + // ee: 74 45 je 0x135 <__JIT_ENTRY+0x135> + // f0: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d ## 0xf8 <__JIT_ENTRY+0xf8> + // 00000000000000f4: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f8: 49 ff c7 incq %r15 + // fb: 49 83 c5 f8 addq $-0x8, %r13 + // ff: eb 1c jmp 0x11d <__JIT_ENTRY+0x11d> + // 101: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 49 ff cf decq %r15 + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 49 83 ff 01 cmpq $0x1, %r15 + // 11b: 76 18 jbe 0x135 <__JIT_ENTRY+0x135> + // 11d: 49 8b 7d 00 movq (%r13), %rdi + // 121: 8b 07 movl (%rdi), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <__JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 07 movl %eax, (%rdi) + // 12b: 75 e3 jne 0x110 <__JIT_ENTRY+0x110> + // 12d: ff 15 00 00 00 00 callq *(%rip) ## 0x133 <__JIT_ENTRY+0x133> + // 000000000000012f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 133: eb db jmp 0x110 <__JIT_ENTRY+0x110> + // 135: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 139: 48 85 c0 testq %rax, %rax + // 13c: 74 1a je 0x158 <__JIT_ENTRY+0x158> + // 13e: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // 142: 48 89 04 d9 movq %rax, (%rcx,%rbx,8) + // 146: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 14a: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 14e: 48 83 c4 20 addq $0x20, %rsp + // 152: 5d popq %rbp + // 153: e9 00 00 00 00 jmp 0x158 <__JIT_ENTRY+0x158> + // 0000000000000154: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 158: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 15c: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 160: 48 83 c4 20 addq $0x20, %rsp + // 164: 5d popq %rbp + // 165: e9 00 00 00 00 jmp 0x16a <__JIT_ENTRY+0x16a> + // 0000000000000166: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[362] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xd9, + 0x4d, 0x8b, 0x4c, 0xdd, 0x00, 0x31, 0xc9, 0x31, + 0xf6, 0x4b, 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x0f, + 0x95, 0xc2, 0x40, 0x0f, 0x94, 0xc7, 0x4d, 0x8b, + 0x41, 0x08, 0x4c, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x34, 0x4d, 0x8b, 0x41, 0x28, 0x41, + 0x81, 0x78, 0x10, 0x80, 0x00, 0x00, 0x00, 0x75, + 0x26, 0x44, 0x8d, 0x14, 0xc5, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0xeb, 0x4d, 0x29, 0xd3, 0x40, + 0x88, 0xfe, 0x49, 0x8d, 0x34, 0xf3, 0x48, 0x83, + 0xc6, 0xf8, 0x48, 0x8b, 0x3e, 0x4c, 0x8b, 0x57, + 0x08, 0x4d, 0x3b, 0x51, 0x10, 0x74, 0x0a, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x88, 0xd1, 0x01, 0xc8, 0xff, 0xc8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x83, 0xc6, 0x08, + 0x48, 0x63, 0xd0, 0x41, 0xff, 0x50, 0x08, 0x48, + 0x89, 0x45, 0xe8, 0x49, 0x8b, 0x44, 0x24, 0x40, + 0x48, 0x89, 0x45, 0xf8, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7c, + 0xdd, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x7d, 0xf0, + 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x85, 0xff, + 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x45, + 0x44, 0x0f, 0xb7, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc7, 0x49, 0x83, 0xc5, 0xf8, 0xeb, + 0x1c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x8b, 0x45, + 0xe8, 0x48, 0x85, 0xc0, 0x74, 0x1a, 0x48, 0x8b, + 0x4d, 0xf8, 0x48, 0x89, 0x04, 0xd9, 0x48, 0x8b, + 0x45, 0xf0, 0x4c, 0x8d, 0x2c, 0xc1, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x45, 0xf8, 0x4c, 0x8d, 0x2c, 0xd8, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyMethodDescr_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyMethodDescr_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0xc); + patch_32r(code + 0x7d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xc0, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe0, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xf4, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x12f, (uintptr_t)data + -0x4); + patch_32r(code + 0x154, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x166, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 4c 63 f9 movslq %ecx, %r15 + // 16: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 1b: 29 c1 subl %eax, %ecx + // 1d: 48 63 d9 movslq %ecx, %rbx + // 20: 4d 8b 4c dd 00 movq (%r13,%rbx,8), %r9 + // 25: 31 c9 xorl %ecx, %ecx + // 27: 31 f6 xorl %esi, %esi + // 29: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2f: 0f 95 c2 setne %dl + // 32: 40 0f 94 c7 sete %dil + // 36: 4d 8b 41 08 movq 0x8(%r9), %r8 + // 3a: 4c 3b 05 00 00 00 00 cmpq (%rip), %r8 ## 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_GOT _PyMethodDescr_Type@GOTPCREL + // 41: 75 34 jne 0x77 <__JIT_ENTRY+0x77> + // 43: 4d 8b 41 28 movq 0x28(%r9), %r8 + // 47: 41 81 78 10 82 00 00 00 cmpl $0x82, 0x10(%r8) + // 4f: 75 26 jne 0x77 <__JIT_ENTRY+0x77> + // 51: 44 8d 14 c5 00 00 00 00 leal (,%rax,8), %r10d + // 59: 4d 89 eb movq %r13, %r11 + // 5c: 4d 29 d3 subq %r10, %r11 + // 5f: 40 88 fe movb %dil, %sil + // 62: 49 8d 34 f3 leaq (%r11,%rsi,8), %rsi + // 66: 48 83 c6 f8 addq $-0x8, %rsi + // 6a: 48 8b 3e movq (%rsi), %rdi + // 6d: 4c 8b 57 08 movq 0x8(%rdi), %r10 + // 71: 4d 3b 51 10 cmpq 0x10(%r9), %r10 + // 75: 74 0a je 0x81 <__JIT_ENTRY+0x81> + // 77: 48 83 c4 20 addq $0x20, %rsp + // 7b: 5d popq %rbp + // 7c: e9 00 00 00 00 jmp 0x81 <__JIT_ENTRY+0x81> + // 000000000000007d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 81: 88 d1 movb %dl, %cl + // 83: 01 c8 addl %ecx, %eax + // 85: ff c8 decl %eax + // 87: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8c: 48 83 c6 08 addq $0x8, %rsi + // 90: 48 63 d0 movslq %eax, %rdx + // 93: 31 c9 xorl %ecx, %ecx + // 95: 41 ff 50 08 callq *0x8(%r8) + // 99: 48 89 45 e8 movq %rax, -0x18(%rbp) + // 9d: 49 8b 44 24 40 movq 0x40(%r12), %rax + // a2: 48 89 45 f8 movq %rax, -0x8(%rbp) + // a6: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // af: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // b4: 8b 07 movl (%rdi), %eax + // b6: 85 c0 testl %eax, %eax + // b8: 78 0c js 0xc6 <__JIT_ENTRY+0xc6> + // ba: ff c8 decl %eax + // bc: 89 07 movl %eax, (%rdi) + // be: 75 06 jne 0xc6 <__JIT_ENTRY+0xc6> + // c0: ff 15 00 00 00 00 callq *(%rip) ## 0xc6 <__JIT_ENTRY+0xc6> + // 00000000000000c2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c6: 4c 89 7d f0 movq %r15, -0x10(%rbp) + // ca: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // cf: 48 85 ff testq %rdi, %rdi + // d2: 74 12 je 0xe6 <__JIT_ENTRY+0xe6> + // d4: 8b 07 movl (%rdi), %eax + // d6: 85 c0 testl %eax, %eax + // d8: 78 0c js 0xe6 <__JIT_ENTRY+0xe6> + // da: ff c8 decl %eax + // dc: 89 07 movl %eax, (%rdi) + // de: 75 06 jne 0xe6 <__JIT_ENTRY+0xe6> + // e0: ff 15 00 00 00 00 callq *(%rip) ## 0xe6 <__JIT_ENTRY+0xe6> + // 00000000000000e2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // e6: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xed <__JIT_ENTRY+0xed> + // 00000000000000e9: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // ed: 66 85 c0 testw %ax, %ax + // f0: 74 43 je 0x135 <__JIT_ENTRY+0x135> + // f2: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d ## 0xfa <__JIT_ENTRY+0xfa> + // 00000000000000f6: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // fa: 49 ff c7 incq %r15 + // fd: 49 83 c5 f8 addq $-0x8, %r13 + // 101: eb 1a jmp 0x11d <__JIT_ENTRY+0x11d> + // 103: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 49 ff cf decq %r15 + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 49 83 ff 01 cmpq $0x1, %r15 + // 11b: 76 18 jbe 0x135 <__JIT_ENTRY+0x135> + // 11d: 49 8b 7d 00 movq (%r13), %rdi + // 121: 8b 07 movl (%rdi), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <__JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 07 movl %eax, (%rdi) + // 12b: 75 e3 jne 0x110 <__JIT_ENTRY+0x110> + // 12d: ff 15 00 00 00 00 callq *(%rip) ## 0x133 <__JIT_ENTRY+0x133> + // 000000000000012f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 133: eb db jmp 0x110 <__JIT_ENTRY+0x110> + // 135: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 139: 48 85 c0 testq %rax, %rax + // 13c: 74 1a je 0x158 <__JIT_ENTRY+0x158> + // 13e: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // 142: 48 89 04 d9 movq %rax, (%rcx,%rbx,8) + // 146: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 14a: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 14e: 48 83 c4 20 addq $0x20, %rsp + // 152: 5d popq %rbp + // 153: e9 00 00 00 00 jmp 0x158 <__JIT_ENTRY+0x158> + // 0000000000000154: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 158: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 15c: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 160: 48 83 c4 20 addq $0x20, %rsp + // 164: 5d popq %rbp + // 165: e9 00 00 00 00 jmp 0x16a <__JIT_ENTRY+0x16a> + // 0000000000000166: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[362] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xd9, + 0x4d, 0x8b, 0x4c, 0xdd, 0x00, 0x31, 0xc9, 0x31, + 0xf6, 0x4b, 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x0f, + 0x95, 0xc2, 0x40, 0x0f, 0x94, 0xc7, 0x4d, 0x8b, + 0x41, 0x08, 0x4c, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x34, 0x4d, 0x8b, 0x41, 0x28, 0x41, + 0x81, 0x78, 0x10, 0x82, 0x00, 0x00, 0x00, 0x75, + 0x26, 0x44, 0x8d, 0x14, 0xc5, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0xeb, 0x4d, 0x29, 0xd3, 0x40, + 0x88, 0xfe, 0x49, 0x8d, 0x34, 0xf3, 0x48, 0x83, + 0xc6, 0xf8, 0x48, 0x8b, 0x3e, 0x4c, 0x8b, 0x57, + 0x08, 0x4d, 0x3b, 0x51, 0x10, 0x74, 0x0a, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x88, 0xd1, 0x01, 0xc8, 0xff, 0xc8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x83, 0xc6, 0x08, + 0x48, 0x63, 0xd0, 0x31, 0xc9, 0x41, 0xff, 0x50, + 0x08, 0x48, 0x89, 0x45, 0xe8, 0x49, 0x8b, 0x44, + 0x24, 0x40, 0x48, 0x89, 0x45, 0xf8, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x7c, 0xdd, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x7d, 0xf0, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x48, + 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, + 0x74, 0x43, 0x44, 0x0f, 0xb7, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x49, 0xff, 0xc7, 0x49, 0x83, 0xc5, + 0xf8, 0xeb, 0x1a, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x8b, 0x45, + 0xe8, 0x48, 0x85, 0xc0, 0x74, 0x1a, 0x48, 0x8b, + 0x4d, 0xf8, 0x48, 0x89, 0x04, 0xd9, 0x48, 0x8b, + 0x45, 0xf0, 0x4c, 0x8d, 0x2c, 0xc1, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x45, 0xf8, 0x4c, 0x8d, 0x2c, 0xd8, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyMethodDescr_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyMethodDescr_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0xc); + patch_32r(code + 0x7d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xf6, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x12f, (uintptr_t)data + -0x4); + patch_32r(code + 0x154, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x166, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_NOARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_NOARGS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 d1 movslq %ecx, %rdx + // 12: 31 c9 xorl %ecx, %ecx + // 14: 31 f6 xorl %esi, %esi + // 16: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 1c: 0f 94 c2 sete %dl + // 1f: 40 0f 95 c6 setne %sil + // 23: 01 c6 addl %eax, %esi + // 25: 83 fe 01 cmpl $0x1, %esi + // 28: 0f 85 df 00 00 00 jne 0x10d <__JIT_ENTRY+0x10d> + // 2e: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 33: 29 c6 subl %eax, %esi + // 35: 4c 63 fe movslq %esi, %r15 + // 38: 4b 8b 74 fd 00 movq (%r13,%r15,8), %rsi + // 3d: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 41: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi ## 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_GOT _PyMethodDescr_Type@GOTPCREL + // 48: 0f 85 bf 00 00 00 jne 0x10d <__JIT_ENTRY+0x10d> + // 4e: c1 e0 03 shll $0x3, %eax + // 51: 4c 89 ef movq %r13, %rdi + // 54: 48 29 c7 subq %rax, %rdi + // 57: 88 d1 movb %dl, %cl + // 59: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 61: 48 8b 1c 07 movq (%rdi,%rax), %rbx + // 65: 48 8b 43 08 movq 0x8(%rbx), %rax + // 69: 48 3b 46 10 cmpq 0x10(%rsi), %rax + // 6d: 0f 85 9a 00 00 00 jne 0x10d <__JIT_ENTRY+0x10d> + // 73: 48 8b 46 28 movq 0x28(%rsi), %rax + // 77: 83 78 10 04 cmpl $0x4, 0x10(%rax) + // 7b: 0f 85 8c 00 00 00 jne 0x10d <__JIT_ENTRY+0x10d> + // 81: 41 8b 4e 34 movl 0x34(%r14), %ecx + // 85: 85 c9 testl %ecx, %ecx + // 87: 0f 8e 80 00 00 00 jle 0x10d <__JIT_ENTRY+0x10d> + // 8d: 48 8b 40 08 movq 0x8(%rax), %rax + // 91: ff c9 decl %ecx + // 93: 41 89 4e 34 movl %ecx, 0x34(%r14) + // 97: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9c: 48 89 df movq %rbx, %rdi + // 9f: 31 f6 xorl %esi, %esi + // a1: ff d0 callq *%rax + // a3: 41 ff 46 34 incl 0x34(%r14) + // a7: 8b 0b movl (%rbx), %ecx + // a9: 85 c9 testl %ecx, %ecx + // ab: 78 15 js 0xc2 <__JIT_ENTRY+0xc2> + // ad: ff c9 decl %ecx + // af: 89 0b movl %ecx, (%rbx) + // b1: 75 0f jne 0xc2 <__JIT_ENTRY+0xc2> + // b3: 48 89 df movq %rbx, %rdi + // b6: 48 89 c3 movq %rax, %rbx + // b9: ff 15 00 00 00 00 callq *(%rip) ## 0xbf <__JIT_ENTRY+0xbf> + // 00000000000000bb: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // bf: 48 89 d8 movq %rbx, %rax + // c2: 4a 8d 0c fd 00 00 00 00 leaq (,%r15,8), %rcx + // ca: 49 01 4c 24 40 addq %rcx, 0x40(%r12) + // cf: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // d4: 8b 0f movl (%rdi), %ecx + // d6: 85 c9 testl %ecx, %ecx + // d8: 78 12 js 0xec <__JIT_ENTRY+0xec> + // da: ff c9 decl %ecx + // dc: 89 0f movl %ecx, (%rdi) + // de: 75 0c jne 0xec <__JIT_ENTRY+0xec> + // e0: 48 89 c3 movq %rax, %rbx + // e3: ff 15 00 00 00 00 callq *(%rip) ## 0xe9 <__JIT_ENTRY+0xe9> + // 00000000000000e5: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // e9: 48 89 d8 movq %rbx, %rax + // ec: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fa: 48 85 c0 testq %rax, %rax + // fd: 74 14 je 0x113 <__JIT_ENTRY+0x113> + // ff: 49 89 45 00 movq %rax, (%r13) + // 103: 49 83 c5 08 addq $0x8, %r13 + // 107: 5d popq %rbp + // 108: e9 00 00 00 00 jmp 0x10d <__JIT_ENTRY+0x10d> + // 0000000000000109: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 10d: 5d popq %rbp + // 10e: e9 00 00 00 00 jmp 0x113 <__JIT_ENTRY+0x113> + // 000000000000010f: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 113: 5d popq %rbp + // 114: e9 00 00 00 00 jmp 0x119 <__JIT_ENTRY+0x119> + // 0000000000000115: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[281] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xd1, 0x31, 0xc9, 0x31, 0xf6, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x0f, 0x94, 0xc2, 0x40, + 0x0f, 0x95, 0xc6, 0x01, 0xc6, 0x83, 0xfe, 0x01, + 0x0f, 0x85, 0xdf, 0x00, 0x00, 0x00, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc6, 0x4c, 0x63, 0xfe, + 0x4b, 0x8b, 0x74, 0xfd, 0x00, 0x48, 0x8b, 0x7e, + 0x08, 0x48, 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xbf, 0x00, 0x00, 0x00, 0xc1, 0xe0, + 0x03, 0x4c, 0x89, 0xef, 0x48, 0x29, 0xc7, 0x88, + 0xd1, 0x48, 0x8d, 0x04, 0xcd, 0xf8, 0xff, 0xff, + 0xff, 0x48, 0x8b, 0x1c, 0x07, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x3b, 0x46, 0x10, 0x0f, 0x85, 0x9a, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x46, 0x28, 0x83, + 0x78, 0x10, 0x04, 0x0f, 0x85, 0x8c, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x4e, 0x34, 0x85, 0xc9, 0x0f, + 0x8e, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x40, + 0x08, 0xff, 0xc9, 0x41, 0x89, 0x4e, 0x34, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0x31, + 0xf6, 0xff, 0xd0, 0x41, 0xff, 0x46, 0x34, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, + 0x0b, 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xd8, 0x4a, 0x8d, 0x0c, 0xfd, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x01, 0x4c, 0x24, 0x40, 0x4b, + 0x8b, 0x7c, 0xfd, 0x00, 0x8b, 0x0f, 0x85, 0xc9, + 0x78, 0x12, 0xff, 0xc9, 0x89, 0x0f, 0x75, 0x0c, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x14, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyMethodDescr_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe5, (uintptr_t)data + -0x4); + patch_32r(code + 0x109, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x10f, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x115, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_METHOD_DESCRIPTOR_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_O.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 4c 63 f9 movslq %ecx, %r15 + // 16: 31 f6 xorl %esi, %esi + // 18: 31 c9 xorl %ecx, %ecx + // 1a: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 20: 40 0f 95 c6 setne %sil + // 24: 0f 94 c2 sete %dl + // 27: 01 c6 addl %eax, %esi + // 29: 83 fe 02 cmpl $0x2, %esi + // 2c: 75 54 jne 0x82 <__JIT_ENTRY+0x82> + // 2e: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 33: 29 c6 subl %eax, %esi + // 35: 4c 63 ce movslq %esi, %r9 + // 38: 4b 8b 74 cd 00 movq (%r13,%r9,8), %rsi + // 3d: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 41: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi ## 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_GOT _PyMethodDescr_Type@GOTPCREL + // 48: 75 38 jne 0x82 <__JIT_ENTRY+0x82> + // 4a: 4c 8b 46 28 movq 0x28(%rsi), %r8 + // 4e: 41 83 78 10 08 cmpl $0x8, 0x10(%r8) + // 53: 75 2d jne 0x82 <__JIT_ENTRY+0x82> + // 55: 4c 89 4d f8 movq %r9, -0x8(%rbp) + // 59: 41 8b 5e 34 movl 0x34(%r14), %ebx + // 5d: 85 db testl %ebx, %ebx + // 5f: 7e 21 jle 0x82 <__JIT_ENTRY+0x82> + // 61: c1 e0 03 shll $0x3, %eax + // 64: 4d 89 e9 movq %r13, %r9 + // 67: 49 29 c1 subq %rax, %r9 + // 6a: 88 d1 movb %dl, %cl + // 6c: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 74: 49 8b 3c 01 movq (%r9,%rax), %rdi + // 78: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 7c: 48 3b 4e 10 cmpq 0x10(%rsi), %rcx + // 80: 74 0a je 0x8c <__JIT_ENTRY+0x8c> + // 82: 48 83 c4 20 addq $0x20, %rsp + // 86: 5d popq %rbp + // 87: e9 00 00 00 00 jmp 0x8c <__JIT_ENTRY+0x8c> + // 0000000000000088: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 8c: 49 8b 74 01 08 movq 0x8(%r9,%rax), %rsi + // 91: 49 8b 40 08 movq 0x8(%r8), %rax + // 95: ff cb decl %ebx + // 97: 41 89 5e 34 movl %ebx, 0x34(%r14) + // 9b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a0: ff d0 callq *%rax + // a2: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // a7: 48 89 4d f0 movq %rcx, -0x10(%rbp) + // ab: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b4: 41 ff 46 34 incl 0x34(%r14) + // b8: 48 89 45 e8 movq %rax, -0x18(%rbp) + // bc: 48 8b 45 f8 movq -0x8(%rbp), %rax + // c0: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // c5: 8b 07 movl (%rdi), %eax + // c7: 85 c0 testl %eax, %eax + // c9: 78 0c js 0xd7 <__JIT_ENTRY+0xd7> + // cb: ff c8 decl %eax + // cd: 89 07 movl %eax, (%rdi) + // cf: 75 06 jne 0xd7 <__JIT_ENTRY+0xd7> + // d1: ff 15 00 00 00 00 callq *(%rip) ## 0xd7 <__JIT_ENTRY+0xd7> + // 00000000000000d3: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // d7: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // dc: 48 85 ff testq %rdi, %rdi + // df: 74 12 je 0xf3 <__JIT_ENTRY+0xf3> + // e1: 8b 07 movl (%rdi), %eax + // e3: 85 c0 testl %eax, %eax + // e5: 78 0c js 0xf3 <__JIT_ENTRY+0xf3> + // e7: ff c8 decl %eax + // e9: 89 07 movl %eax, (%rdi) + // eb: 75 06 jne 0xf3 <__JIT_ENTRY+0xf3> + // ed: ff 15 00 00 00 00 callq *(%rip) ## 0xf3 <__JIT_ENTRY+0xf3> + // 00000000000000ef: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // f3: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xfa <__JIT_ENTRY+0xfa> + // 00000000000000f6: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // fa: 66 85 c0 testw %ax, %ax + // fd: 74 36 je 0x135 <__JIT_ENTRY+0x135> + // ff: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx ## 0x106 <__JIT_ENTRY+0x106> + // 0000000000000102: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 106: 48 ff c3 incq %rbx + // 109: 49 83 c5 f8 addq $-0x8, %r13 + // 10d: eb 0e jmp 0x11d <__JIT_ENTRY+0x11d> + // 10f: 90 nop + // 110: 48 ff cb decq %rbx + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fb 01 cmpq $0x1, %rbx + // 11b: 76 18 jbe 0x135 <__JIT_ENTRY+0x135> + // 11d: 49 8b 7d 00 movq (%r13), %rdi + // 121: 8b 07 movl (%rdi), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <__JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 07 movl %eax, (%rdi) + // 12b: 75 e3 jne 0x110 <__JIT_ENTRY+0x110> + // 12d: ff 15 00 00 00 00 callq *(%rip) ## 0x133 <__JIT_ENTRY+0x133> + // 000000000000012f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 133: eb db jmp 0x110 <__JIT_ENTRY+0x110> + // 135: 48 8b 55 e8 movq -0x18(%rbp), %rdx + // 139: 48 85 d2 testq %rdx, %rdx + // 13c: 74 1a je 0x158 <__JIT_ENTRY+0x158> + // 13e: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 142: 48 8b 4d f0 movq -0x10(%rbp), %rcx + // 146: 48 89 14 c1 movq %rdx, (%rcx,%rax,8) + // 14a: 4e 8d 2c f9 leaq (%rcx,%r15,8), %r13 + // 14e: 48 83 c4 20 addq $0x20, %rsp + // 152: 5d popq %rbp + // 153: e9 00 00 00 00 jmp 0x158 <__JIT_ENTRY+0x158> + // 0000000000000154: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 158: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 15c: 48 8b 4d f0 movq -0x10(%rbp), %rcx + // 160: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 164: 48 83 c4 20 addq $0x20, %rsp + // 168: 5d popq %rbp + // 169: e9 00 00 00 00 jmp 0x16e <__JIT_ENTRY+0x16e> + // 000000000000016a: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[366] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0x31, 0xf6, + 0x31, 0xc9, 0x4b, 0x83, 0x7c, 0xfd, 0x00, 0x00, + 0x40, 0x0f, 0x95, 0xc6, 0x0f, 0x94, 0xc2, 0x01, + 0xc6, 0x83, 0xfe, 0x02, 0x75, 0x54, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc6, 0x4c, 0x63, 0xce, + 0x4b, 0x8b, 0x74, 0xcd, 0x00, 0x48, 0x8b, 0x7e, + 0x08, 0x48, 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x38, 0x4c, 0x8b, 0x46, 0x28, 0x41, 0x83, + 0x78, 0x10, 0x08, 0x75, 0x2d, 0x4c, 0x89, 0x4d, + 0xf8, 0x41, 0x8b, 0x5e, 0x34, 0x85, 0xdb, 0x7e, + 0x21, 0xc1, 0xe0, 0x03, 0x4d, 0x89, 0xe9, 0x49, + 0x29, 0xc1, 0x88, 0xd1, 0x48, 0x8d, 0x04, 0xcd, + 0xf8, 0xff, 0xff, 0xff, 0x49, 0x8b, 0x3c, 0x01, + 0x48, 0x8b, 0x4f, 0x08, 0x48, 0x3b, 0x4e, 0x10, + 0x74, 0x0a, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x74, 0x01, + 0x08, 0x49, 0x8b, 0x40, 0x08, 0xff, 0xcb, 0x41, + 0x89, 0x5e, 0x34, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0xff, 0xd0, 0x49, 0x8b, 0x4c, 0x24, 0x40, 0x48, + 0x89, 0x4d, 0xf0, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0x46, 0x34, + 0x48, 0x89, 0x45, 0xe8, 0x48, 0x8b, 0x45, 0xf8, + 0x49, 0x8b, 0x7c, 0xc5, 0x00, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4b, + 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x36, 0x0f, + 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0xc3, 0x49, 0x83, 0xc5, 0xf8, 0xeb, 0x0e, 0x90, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x8b, 0x55, + 0xe8, 0x48, 0x85, 0xd2, 0x74, 0x1a, 0x48, 0x8b, + 0x45, 0xf8, 0x48, 0x8b, 0x4d, 0xf0, 0x48, 0x89, + 0x14, 0xc1, 0x4e, 0x8d, 0x2c, 0xf9, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x4d, 0xf0, + 0x4c, 0x8d, 0x2c, 0xc1, 0x48, 0x83, 0xc4, 0x20, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyMethodDescr_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyMethodDescr_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_32r(code + 0x88, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xef, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf6, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x102, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x12f, (uintptr_t)data + -0x4); + patch_32r(code + 0x154, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x16a, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_NON_PY_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_NON_PY_GENERAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // c: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 13: 8d 0c c5 00 00 00 00 leal (,%rax,8), %ecx + // 1a: 4c 89 ea movq %r13, %rdx + // 1d: 48 29 ca subq %rcx, %rdx + // 20: 89 c1 movl %eax, %ecx + // 22: f7 d1 notl %ecx + // 24: 4c 63 f1 movslq %ecx, %r14 + // 27: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 2c: 29 c1 subl %eax, %ecx + // 2e: 48 63 d9 movslq %ecx, %rbx + // 31: 31 c9 xorl %ecx, %ecx + // 33: 31 f6 xorl %esi, %esi + // 35: 4b 83 7c f5 00 00 cmpq $0x0, (%r13,%r14,8) + // 3b: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 40: 0f 95 c1 setne %cl + // 43: 40 0f 94 c6 sete %sil + // 47: 48 8d 34 f2 leaq (%rdx,%rsi,8), %rsi + // 4b: 48 83 c6 f8 addq $-0x8, %rsi + // 4f: 01 c1 addl %eax, %ecx + // 51: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 56: 48 ba 00 00 00 00 00 00 00 80 movabsq $-0x8000000000000000, %rdx ## imm = 0x8000000000000000 + // 60: 48 09 ca orq %rcx, %rdx + // 63: 31 c9 xorl %ecx, %ecx + // 65: ff 15 00 00 00 00 callq *(%rip) ## 0x6b <__JIT_ENTRY+0x6b> + // 0000000000000067: X86_64_RELOC_GOT _PyObject_Vectorcall@GOTPCREL + // 6b: 48 89 45 e0 movq %rax, -0x20(%rbp) + // 6f: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 74: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 86: 8b 07 movl (%rdi), %eax + // 88: 85 c0 testl %eax, %eax + // 8a: 78 0c js 0x98 <__JIT_ENTRY+0x98> + // 8c: ff c8 decl %eax + // 8e: 89 07 movl %eax, (%rdi) + // 90: 75 06 jne 0x98 <__JIT_ENTRY+0x98> + // 92: ff 15 00 00 00 00 callq *(%rip) ## 0x98 <__JIT_ENTRY+0x98> + // 0000000000000094: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 98: 4c 89 75 e8 movq %r14, -0x18(%rbp) + // 9c: 4b 8b 7c f5 00 movq (%r13,%r14,8), %rdi + // a1: 48 85 ff testq %rdi, %rdi + // a4: 74 12 je 0xb8 <__JIT_ENTRY+0xb8> + // a6: 8b 07 movl (%rdi), %eax + // a8: 85 c0 testl %eax, %eax + // aa: 78 0c js 0xb8 <__JIT_ENTRY+0xb8> + // ac: ff c8 decl %eax + // ae: 89 07 movl %eax, (%rdi) + // b0: 75 06 jne 0xb8 <__JIT_ENTRY+0xb8> + // b2: ff 15 00 00 00 00 callq *(%rip) ## 0xb8 <__JIT_ENTRY+0xb8> + // 00000000000000b4: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b8: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xbf <__JIT_ENTRY+0xbf> + // 00000000000000bb: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // bf: 66 85 c0 testw %ax, %ax + // c2: 74 3e je 0x102 <__JIT_ENTRY+0x102> + // c4: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d ## 0xcc <__JIT_ENTRY+0xcc> + // 00000000000000c8: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // cc: 49 ff c6 incq %r14 + // cf: 49 83 c5 f8 addq $-0x8, %r13 + // d3: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0xda <__JIT_ENTRY+0xda> + // 00000000000000d6: X86_64_RELOC_GOT_LOAD __Py_Dealloc@GOTPCREL + // da: eb 11 jmp 0xed <__JIT_ENTRY+0xed> + // dc: 0f 1f 40 00 nopl (%rax) + // e0: 49 ff ce decq %r14 + // e3: 49 83 c5 f8 addq $-0x8, %r13 + // e7: 49 83 fe 01 cmpq $0x1, %r14 + // eb: 76 15 jbe 0x102 <__JIT_ENTRY+0x102> + // ed: 49 8b 7d 00 movq (%r13), %rdi + // f1: 8b 07 movl (%rdi), %eax + // f3: 85 c0 testl %eax, %eax + // f5: 78 e9 js 0xe0 <__JIT_ENTRY+0xe0> + // f7: ff c8 decl %eax + // f9: 89 07 movl %eax, (%rdi) + // fb: 75 e3 jne 0xe0 <__JIT_ENTRY+0xe0> + // fd: 41 ff d7 callq *%r15 + // 100: eb de jmp 0xe0 <__JIT_ENTRY+0xe0> + // 102: 48 8b 45 e0 movq -0x20(%rbp), %rax + // 106: 48 85 c0 testq %rax, %rax + // 109: 74 1e je 0x129 <__JIT_ENTRY+0x129> + // 10b: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // 10f: 48 89 04 d9 movq %rax, (%rcx,%rbx,8) + // 113: 48 8b 45 e8 movq -0x18(%rbp), %rax + // 117: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 11b: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 11f: 48 83 c4 20 addq $0x20, %rsp + // 123: 5d popq %rbp + // 124: e9 00 00 00 00 jmp 0x129 <__JIT_ENTRY+0x129> + // 0000000000000125: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 129: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 12d: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 131: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 135: 48 83 c4 20 addq $0x20, %rsp + // 139: 5d popq %rbp + // 13a: e9 00 00 00 00 jmp 0x13f <__JIT_ENTRY+0x13f> + // 000000000000013b: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[319] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4c, 0x89, 0x75, 0xf0, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x8d, 0x0c, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xea, 0x48, 0x29, 0xca, + 0x89, 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf1, 0xb9, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, + 0xd9, 0x31, 0xc9, 0x31, 0xf6, 0x4b, 0x83, 0x7c, + 0xf5, 0x00, 0x00, 0x49, 0x8b, 0x7c, 0xdd, 0x00, + 0x0f, 0x95, 0xc1, 0x40, 0x0f, 0x94, 0xc6, 0x48, + 0x8d, 0x34, 0xf2, 0x48, 0x83, 0xc6, 0xf8, 0x01, + 0xc1, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0xba, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x48, 0x09, 0xca, 0x31, 0xc9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x45, 0xe0, 0x49, + 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, 0x45, 0xf8, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x7c, 0xdd, 0x00, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x75, 0xe8, 0x4b, 0x8b, 0x7c, 0xf5, + 0x00, 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x3e, 0x44, 0x0f, 0xb7, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xc6, 0x49, + 0x83, 0xc5, 0xf8, 0x4c, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x49, 0xff, 0xce, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xfe, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x8b, 0x45, 0xe0, 0x48, 0x85, + 0xc0, 0x74, 0x1e, 0x48, 0x8b, 0x4d, 0xf8, 0x48, + 0x89, 0x04, 0xd9, 0x48, 0x8b, 0x45, 0xe8, 0x4c, + 0x8d, 0x2c, 0xc1, 0x4c, 0x8b, 0x75, 0xf0, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x45, 0xf8, 0x4c, 0x8d, 0x2c, + 0xd8, 0x4c, 0x8b, 0x75, 0xf0, 0x48, 0x83, 0xc4, + 0x20, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyObject_Vectorcall+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyObject_Vectorcall); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x94, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc8, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xd6, (uintptr_t)data + -0x4); + patch_32r(code + 0x125, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x13b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_STR_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_STR_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 9: 75 0d jne 0x18 <__JIT_ENTRY+0x18> + // b: 49 8b 45 e8 movq -0x18(%r13), %rax + // f: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyUnicode_Type@GOTPCREL + // 16: 74 06 je 0x1e <__JIT_ENTRY+0x1e> + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1e: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 22: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 27: 48 89 df movq %rbx, %rdi + // 2a: ff 15 00 00 00 00 callq *(%rip) ## 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_GOT _PyObject_Str@GOTPCREL + // 30: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 36: 8b 0b movl (%rbx), %ecx + // 38: 85 c9 testl %ecx, %ecx + // 3a: 78 15 js 0x51 <__JIT_ENTRY+0x51> + // 3c: ff c9 decl %ecx + // 3e: 89 0b movl %ecx, (%rbx) + // 40: 75 0f jne 0x51 <__JIT_ENTRY+0x51> + // 42: 48 89 df movq %rbx, %rdi + // 45: 48 89 c3 movq %rax, %rbx + // 48: ff 15 00 00 00 00 callq *(%rip) ## 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4e: 48 89 d8 movq %rbx, %rax + // 51: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 56: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5f: 48 85 c0 testq %rax, %rax + // 62: 74 0e je 0x72 <__JIT_ENTRY+0x72> + // 64: 49 89 45 00 movq %rax, (%r13) + // 68: 49 83 c5 08 addq $0x8, %r13 + // 6c: 5d popq %rbp + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 000000000000006e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 72: 5d popq %rbp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 0000000000000074: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[120] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x83, 0x7d, 0xf0, + 0x00, 0x75, 0x0d, 0x49, 0x8b, 0x45, 0xe8, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0b, + 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, + 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_Str+0x0 + // 10: &PyUnicode_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_Str); + patch_64(data + 0x10, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0xc); + patch_32r(code + 0x1a, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + -0x4); + patch_32r(code + 0x6e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x74, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_TUPLE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TUPLE_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 9: 75 0d jne 0x18 <__JIT_ENTRY+0x18> + // b: 49 8b 45 e8 movq -0x18(%r13), %rax + // f: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyTuple_Type@GOTPCREL + // 16: 74 06 je 0x1e <__JIT_ENTRY+0x1e> + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1e: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 22: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 27: 48 89 df movq %rbx, %rdi + // 2a: ff 15 00 00 00 00 callq *(%rip) ## 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_GOT _PySequence_Tuple@GOTPCREL + // 30: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 36: 8b 0b movl (%rbx), %ecx + // 38: 85 c9 testl %ecx, %ecx + // 3a: 78 15 js 0x51 <__JIT_ENTRY+0x51> + // 3c: ff c9 decl %ecx + // 3e: 89 0b movl %ecx, (%rbx) + // 40: 75 0f jne 0x51 <__JIT_ENTRY+0x51> + // 42: 48 89 df movq %rbx, %rdi + // 45: 48 89 c3 movq %rax, %rbx + // 48: ff 15 00 00 00 00 callq *(%rip) ## 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4e: 48 89 d8 movq %rbx, %rax + // 51: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 56: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5f: 48 85 c0 testq %rax, %rax + // 62: 74 0e je 0x72 <__JIT_ENTRY+0x72> + // 64: 49 89 45 00 movq %rax, (%r13) + // 68: 49 83 c5 08 addq $0x8, %r13 + // 6c: 5d popq %rbp + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 000000000000006e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 72: 5d popq %rbp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 0000000000000074: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[120] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x83, 0x7d, 0xf0, + 0x00, 0x75, 0x0d, 0x49, 0x8b, 0x45, 0xe8, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0b, + 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, + 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PySequence_Tuple+0x0 + // 10: &PyTuple_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x10, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0xc); + patch_32r(code + 0x1a, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + -0x4); + patch_32r(code + 0x6e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x74, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CALL_TYPE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TYPE_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 5: 0f 85 00 00 00 00 jne 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // b: 49 8b 45 e8 movq -0x18(%r13), %rax + // f: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyType_Type@GOTPCREL + // 16: 0f 85 00 00 00 00 jne 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1c: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 20: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 24: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 28: 8b 11 movl (%rcx), %edx + // 2a: 85 d2 testl %edx, %edx + // 2c: 78 04 js 0x32 <__JIT_ENTRY+0x32> + // 2e: ff c2 incl %edx + // 30: 89 11 movl %edx, (%rcx) + // 32: 49 89 4d e8 movq %rcx, -0x18(%r13) + // 36: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 3b: 8b 07 movl (%rdi), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 06 js 0x47 <__JIT_ENTRY+0x47> + // 41: ff c8 decl %eax + // 43: 89 07 movl %eax, (%rdi) + // 45: 74 13 je 0x5a <__JIT_ENTRY+0x5a> + // 47: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 0000000000000056: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5a: 55 pushq %rbp + // 5b: 48 89 e5 movq %rsp, %rbp + // 5e: ff 15 00 00 00 00 callq *(%rip) ## 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 64: 5d popq %rbp + // 65: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 0000000000000074: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[115] = { + 0x49, 0x83, 0x7d, 0xf0, 0x00, 0x0f, 0x85, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x45, 0xe8, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7d, 0xf8, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x8b, 0x4f, 0x08, + 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, + 0x89, 0x11, 0x49, 0x89, 0x4d, 0xe8, 0x49, 0x89, + 0x44, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyType_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyType_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x7, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_32r(code + 0x18, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x56, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + -0x4); +} + +void +emit__CHECK_AND_ALLOCATE_OBJECT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_AND_ALLOCATE_OBJECT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 89 c1 movl %eax, %ecx + // 11: f7 d1 notl %ecx + // 13: 4c 63 f9 movslq %ecx, %r15 + // 16: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 1c: 0f 85 e2 00 00 00 jne 0x104 <__JIT_ENTRY+0x104> + // 22: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 27: 29 c1 subl %eax, %ecx + // 29: 48 63 d9 movslq %ecx, %rbx + // 2c: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 31: 48 8b 47 08 movq 0x8(%rdi), %rax + // 35: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 3c: 0f 84 c2 00 00 00 je 0x104 <__JIT_ENTRY+0x104> + // 42: 8b 87 80 01 00 00 movl 0x180(%rdi), %eax + // 48: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 4e: 0f 85 b0 00 00 00 jne 0x104 <__JIT_ENTRY+0x104> + // 54: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // 5b: 48 85 c0 testq %rax, %rax + // 5e: 0f 84 a0 00 00 00 je 0x104 <__JIT_ENTRY+0x104> + // 64: 48 8b b7 a0 03 00 00 movq 0x3a0(%rdi), %rsi + // 6b: 48 8b 4e 30 movq 0x30(%rsi), %rcx + // 6f: 48 63 49 4c movslq 0x4c(%rcx), %rcx + // 73: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x7a <__JIT_ENTRY+0x7a> + // 0000000000000076: X86_64_RELOC_GOT_LOAD __Py_InitCleanup@GOTPCREL + // 7a: 48 63 52 4c movslq 0x4c(%rdx), %rdx + // 7e: 48 01 ca addq %rcx, %rdx + // 81: 49 8b 8e f8 00 00 00 movq 0xf8(%r14), %rcx + // 88: 48 29 c1 subq %rax, %rcx + // 8b: 48 c1 f9 03 sarq $0x3, %rcx + // 8f: 48 39 d1 cmpq %rdx, %rcx + // 92: 7e 70 jle 0x104 <__JIT_ENTRY+0x104> + // 94: 48 89 75 f8 movq %rsi, -0x8(%rbp) + // 98: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9d: 31 f6 xorl %esi, %esi + // 9f: ff 15 00 00 00 00 callq *(%rip) ## 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_GOT _PyType_GenericAlloc@GOTPCREL + // a5: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // aa: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b3: 48 85 c0 testq %rax, %rax + // b6: 74 56 je 0x10e <__JIT_ENTRY+0x10e> + // b8: 4b 89 44 fd 00 movq %rax, (%r13,%r15,8) + // bd: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // c2: 48 8b 55 f8 movq -0x8(%rbp), %rdx + // c6: 8b 02 movl (%rdx), %eax + // c8: 85 c0 testl %eax, %eax + // ca: 78 04 js 0xd0 <__JIT_ENTRY+0xd0> + // cc: ff c0 incl %eax + // ce: 89 02 movl %eax, (%rdx) + // d0: 49 89 54 dd 00 movq %rdx, (%r13,%rbx,8) + // d5: 49 89 4c 24 40 movq %rcx, 0x40(%r12) + // da: 8b 07 movl (%rdi), %eax + // dc: 85 c0 testl %eax, %eax + // de: 78 0c js 0xec <__JIT_ENTRY+0xec> + // e0: ff c8 decl %eax + // e2: 89 07 movl %eax, (%rdi) + // e4: 75 06 jne 0xec <__JIT_ENTRY+0xec> + // e6: ff 15 00 00 00 00 callq *(%rip) ## 0xec <__JIT_ENTRY+0xec> + // 00000000000000e8: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ec: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fa: 48 83 c4 10 addq $0x10, %rsp + // fe: 5d popq %rbp + // ff: e9 00 00 00 00 jmp 0x104 <__JIT_ENTRY+0x104> + // 0000000000000100: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 104: 48 83 c4 10 addq $0x10, %rsp + // 108: 5d popq %rbp + // 109: e9 00 00 00 00 jmp 0x10e <__JIT_ENTRY+0x10e> + // 000000000000010a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 10e: 49 89 cd movq %rcx, %r13 + // 111: 48 83 c4 10 addq $0x10, %rsp + // 115: 5d popq %rbp + // 116: e9 00 00 00 00 jmp 0x11b <__JIT_ENTRY+0x11b> + // 0000000000000117: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[283] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0x4b, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x0f, 0x85, 0xe2, 0x00, + 0x00, 0x00, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc1, 0x48, 0x63, 0xd9, 0x49, 0x8b, 0x7c, 0xdd, + 0x00, 0x48, 0x8b, 0x47, 0x08, 0xf6, 0x80, 0xab, + 0x00, 0x00, 0x00, 0x80, 0x0f, 0x84, 0xc2, 0x00, + 0x00, 0x00, 0x8b, 0x87, 0x80, 0x01, 0x00, 0x00, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, + 0xb0, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x86, 0xf0, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x0f, 0x84, + 0xa0, 0x00, 0x00, 0x00, 0x48, 0x8b, 0xb7, 0xa0, + 0x03, 0x00, 0x00, 0x48, 0x8b, 0x4e, 0x30, 0x48, + 0x63, 0x49, 0x4c, 0x48, 0x8b, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x63, 0x52, 0x4c, 0x48, 0x01, + 0xca, 0x49, 0x8b, 0x8e, 0xf8, 0x00, 0x00, 0x00, + 0x48, 0x29, 0xc1, 0x48, 0xc1, 0xf9, 0x03, 0x48, + 0x39, 0xd1, 0x7e, 0x70, 0x48, 0x89, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x31, 0xf6, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x56, + 0x4b, 0x89, 0x44, 0xfd, 0x00, 0x49, 0x8b, 0x7c, + 0xdd, 0x00, 0x48, 0x8b, 0x55, 0xf8, 0x8b, 0x02, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x02, + 0x49, 0x89, 0x54, 0xdd, 0x00, 0x49, 0x89, 0x4c, + 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0xcd, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyType_GenericAlloc+0x0 + // 10: &_Py_InitCleanup+0x0 + // 18: OPERAND0 + // 20: OPARG + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyType_GenericAlloc); + patch_64(data + 0x10, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x18, instruction->operand0); + patch_64(data + 0x20, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xe8, (uintptr_t)data + -0x4); + patch_32r(code + 0x100, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x10a, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x117, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_CLASS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: f6 81 ab 00 00 00 80 testb $-0x80, 0xab(%rcx) + // 13: 74 14 je 0x29 <__JIT_ENTRY+0x29> + // 15: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // 1b: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 21: 75 06 jne 0x29 <__JIT_ENTRY+0x29> + // 23: 5d popq %rbp + // 24: e9 00 00 00 00 jmp 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 29: 5d popq %rbp + // 2a: e9 00 00 00 00 jmp 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[47] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x08, 0xf6, 0x81, 0xab, 0x00, + 0x00, 0x00, 0x80, 0x74, 0x14, 0x8b, 0x80, 0x80, + 0x01, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); + patch_32r(code + 0x25, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x2b, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_METHOD_LAZY_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // f: 48 83 7c 08 e8 00 cmpq $0x0, -0x18(%rax,%rcx) + // 15: 74 06 je 0x1d <__JIT_ENTRY+0x1d> + // 17: 5d popq %rbp + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1d: 5d popq %rbp + // 1e: e9 00 00 00 00 jmp 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[30] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0x7c, 0x08, 0xe8, 0x00, 0x74, 0x06, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_ATTR_MODULE_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_MODULE_PUSH_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: 48 8b 89 90 00 00 00 movq 0x90(%rcx), %rcx + // 13: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x1a <__JIT_ENTRY+0x1a> + // 0000000000000016: X86_64_RELOC_GOT_LOAD _PyModule_Type@GOTPCREL + // 1a: 48 3b 8a 90 00 00 00 cmpq 0x90(%rdx), %rcx + // 21: 75 21 jne 0x44 <__JIT_ENTRY+0x44> + // 23: 48 8b 40 10 movq 0x10(%rax), %rax + // 27: 48 8b 40 20 movq 0x20(%rax), %rax + // 2b: 8b 48 0c movl 0xc(%rax), %ecx + // 2e: 3b 0d 00 00 00 00 cmpl (%rip), %ecx ## 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 34: 75 0e jne 0x44 <__JIT_ENTRY+0x44> + // 36: 49 89 45 00 movq %rax, (%r13) + // 3a: 49 83 c5 08 addq $0x8, %r13 + // 3e: 5d popq %rbp + // 3f: e9 00 00 00 00 jmp 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 44: 5d popq %rbp + // 45: e9 00 00 00 00 jmp 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[74] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x08, 0x48, 0x8b, 0x89, 0x90, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x3b, 0x8a, 0x90, 0x00, 0x00, + 0x00, 0x75, 0x21, 0x48, 0x8b, 0x40, 0x10, 0x48, + 0x8b, 0x40, 0x20, 0x8b, 0x48, 0x0c, 0x3b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x0e, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyModule_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyModule_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + -0x4); + patch_32r(code + 0x40, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x46, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_WITH_HINT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 e8 movq -0x18(%rax), %rax + // c: 48 85 c0 testq %rax, %rax + // f: 74 0e je 0x1f <__JIT_ENTRY+0x1f> + // 11: 49 89 45 00 movq %rax, (%r13) + // 15: 49 83 c5 08 addq $0x8, %r13 + // 19: 5d popq %rbp + // 1a: e9 00 00 00 00 jmp 0x1f <__JIT_ENTRY+0x1f> + // 000000000000001b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1f: 5d popq %rbp + // 20: e9 00 00 00 00 jmp 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[37] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0xe8, 0x48, 0x85, 0xc0, 0x74, + 0x0e, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x21, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_CALL_BOUND_METHOD_EXACT_ARGS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 c9 movslq %ecx, %rcx + // 12: 49 83 7c cd 00 00 cmpq $0x0, (%r13,%rcx,8) + // 18: 75 1c jne 0x36 <__JIT_ENTRY+0x36> + // 1a: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 1f: 29 c1 subl %eax, %ecx + // 21: 48 63 c1 movslq %ecx, %rax + // 24: 49 8b 44 c5 00 movq (%r13,%rax,8), %rax + // 29: 48 8b 40 08 movq 0x8(%rax), %rax + // 2d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 34: 74 06 je 0x3c <__JIT_ENTRY+0x3c> + // 36: 5d popq %rbp + // 37: e9 00 00 00 00 jmp 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 3c: 5d popq %rbp + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 000000000000003e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[61] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xc9, 0x49, 0x83, 0x7c, 0xcd, 0x00, 0x00, + 0x75, 0x1c, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc1, 0x48, 0x63, 0xc1, 0x49, 0x8b, 0x44, 0xc5, + 0x00, 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyMethod_Type+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_EG_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EG_MATCH.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 20 subq $0x20, %rsp + // 8: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: 4c 89 f7 movq %r14, %rdi + // 18: 48 89 de movq %rbx, %rsi + // 1b: ff 15 00 00 00 00 callq *(%rip) ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __PyEval_CheckExceptStarTypeValid@GOTPCREL + // 21: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 26: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2f: 85 c0 testl %eax, %eax + // 31: 0f 88 c5 00 00 00 js 0xfc <__JIT_ENTRY+0xfc> + // 37: 4c 89 75 f0 movq %r14, -0x10(%rbp) + // 3b: 48 c7 45 f8 00 00 00 00 movq $0x0, -0x8(%rbp) + // 43: 48 c7 45 e8 00 00 00 00 movq $0x0, -0x18(%rbp) + // 4b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 50: 48 8d 4d f8 leaq -0x8(%rbp), %rcx + // 54: 4c 8d 45 e8 leaq -0x18(%rbp), %r8 + // 58: 4c 89 e7 movq %r12, %rdi + // 5b: 4c 89 fe movq %r15, %rsi + // 5e: 48 89 da movq %rbx, %rdx + // 61: ff 15 00 00 00 00 callq *(%rip) ## 0x67 <__JIT_ENTRY+0x67> + // 0000000000000063: X86_64_RELOC_GOT __PyEval_ExceptionGroupMatch@GOTPCREL + // 67: 41 89 c6 movl %eax, %r14d + // 6a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 78: 41 8b 07 movl (%r15), %eax + // 7b: 85 c0 testl %eax, %eax + // 7d: 78 10 js 0x8f <__JIT_ENTRY+0x8f> + // 7f: ff c8 decl %eax + // 81: 41 89 07 movl %eax, (%r15) + // 84: 75 09 jne 0x8f <__JIT_ENTRY+0x8f> + // 86: 4c 89 ff movq %r15, %rdi + // 89: ff 15 00 00 00 00 callq *(%rip) ## 0x8f <__JIT_ENTRY+0x8f> + // 000000000000008b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8f: 8b 03 movl (%rbx), %eax + // 91: 85 c0 testl %eax, %eax + // 93: 78 0a js 0x9f <__JIT_ENTRY+0x9f> + // 95: ff c8 decl %eax + // 97: 89 03 movl %eax, (%rbx) + // 99: 0f 84 97 00 00 00 je 0x136 <__JIT_ENTRY+0x136> + // 9f: 45 85 f6 testl %r14d, %r14d + // a2: 0f 88 a0 00 00 00 js 0x148 <__JIT_ENTRY+0x148> + // a8: 48 8b 7d f8 movq -0x8(%rbp), %rdi + // ac: 48 85 ff testq %rdi, %rdi + // af: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // b3: 74 73 je 0x128 <__JIT_ENTRY+0x128> + // b5: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xbc <__JIT_ENTRY+0xbc> + // 00000000000000b8: X86_64_RELOC_GOT_LOAD __Py_NoneStruct@GOTPCREL + // bc: 48 39 c7 cmpq %rax, %rdi + // bf: 74 25 je 0xe6 <__JIT_ENTRY+0xe6> + // c1: 49 83 c5 f0 addq $-0x10, %r13 + // c5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // ca: ff 15 00 00 00 00 callq *(%rip) ## 0xd0 <__JIT_ENTRY+0xd0> + // 00000000000000cc: X86_64_RELOC_GOT _PyErr_SetHandledException@GOTPCREL + // d0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // de: 49 83 c5 10 addq $0x10, %r13 + // e2: 48 8b 45 f8 movq -0x8(%rbp), %rax + // e6: 48 8b 4d e8 movq -0x18(%rbp), %rcx + // ea: 49 89 4d f0 movq %rcx, -0x10(%r13) + // ee: 49 89 45 f8 movq %rax, -0x8(%r13) + // f2: 48 83 c4 20 addq $0x20, %rsp + // f6: 5d popq %rbp + // f7: e9 00 00 00 00 jmp 0xfc <__JIT_ENTRY+0xfc> + // 00000000000000f8: X86_64_RELOC_BRANCH __JIT_CONTINUE + // fc: 41 8b 07 movl (%r15), %eax + // ff: 85 c0 testl %eax, %eax + // 101: 78 10 js 0x113 <__JIT_ENTRY+0x113> + // 103: ff c8 decl %eax + // 105: 41 89 07 movl %eax, (%r15) + // 108: 75 09 jne 0x113 <__JIT_ENTRY+0x113> + // 10a: 4c 89 ff movq %r15, %rdi + // 10d: ff 15 00 00 00 00 callq *(%rip) ## 0x113 <__JIT_ENTRY+0x113> + // 000000000000010f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 113: 8b 03 movl (%rbx), %eax + // 115: 85 c0 testl %eax, %eax + // 117: 78 0f js 0x128 <__JIT_ENTRY+0x128> + // 119: ff c8 decl %eax + // 11b: 89 03 movl %eax, (%rbx) + // 11d: 75 09 jne 0x128 <__JIT_ENTRY+0x128> + // 11f: 48 89 df movq %rbx, %rdi + // 122: ff 15 00 00 00 00 callq *(%rip) ## 0x128 <__JIT_ENTRY+0x128> + // 0000000000000124: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 128: 49 83 c5 f0 addq $-0x10, %r13 + // 12c: 48 83 c4 20 addq $0x20, %rsp + // 130: 5d popq %rbp + // 131: e9 00 00 00 00 jmp 0x136 <__JIT_ENTRY+0x136> + // 0000000000000132: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 136: 48 89 df movq %rbx, %rdi + // 139: ff 15 00 00 00 00 callq *(%rip) ## 0x13f <__JIT_ENTRY+0x13f> + // 000000000000013b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 13f: 45 85 f6 testl %r14d, %r14d + // 142: 0f 89 60 ff ff ff jns 0xa8 <__JIT_ENTRY+0xa8> + // 148: 49 83 c5 f0 addq $-0x10, %r13 + // 14c: 4c 8b 75 f0 movq -0x10(%rbp), %r14 + // 150: 48 83 c4 20 addq $0x20, %rsp + // 154: 5d popq %rbp + // 155: e9 00 00 00 00 jmp 0x15a <__JIT_ENTRY+0x15a> + // 0000000000000156: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[346] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, + 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, + 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x0f, 0x88, 0xc5, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0x75, 0xf0, 0x48, 0xc7, 0x45, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0x45, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x8d, 0x4d, 0xf8, 0x4c, 0x8d, 0x45, 0xe8, + 0x4c, 0x89, 0xe7, 0x4c, 0x89, 0xfe, 0x48, 0x89, + 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x0a, 0xff, 0xc8, 0x89, + 0x03, 0x0f, 0x84, 0x97, 0x00, 0x00, 0x00, 0x45, + 0x85, 0xf6, 0x0f, 0x88, 0xa0, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x7d, 0xf8, 0x48, 0x85, 0xff, 0x4c, + 0x8b, 0x75, 0xf0, 0x74, 0x73, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x39, 0xc7, 0x74, + 0x25, 0x49, 0x83, 0xc5, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0x10, 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x8b, + 0x4d, 0xe8, 0x49, 0x89, 0x4d, 0xf0, 0x49, 0x89, + 0x45, 0xf8, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x75, 0x09, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x20, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x85, 0xf6, 0x0f, 0x89, 0x60, 0xff, 0xff, 0xff, + 0x49, 0x83, 0xc5, 0xf0, 0x4c, 0x8b, 0x75, 0xf0, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyErr_SetHandledException+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &_PyEval_ExceptionGroupMatch+0x0 + // 20: &_PyEval_CheckExceptStarTypeValid+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyErr_SetHandledException); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&_PyEval_ExceptionGroupMatch); + patch_64(data + 0x20, (uintptr_t)&_PyEval_CheckExceptStarTypeValid); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x4); + patch_32r(code + 0xf8, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x10f, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x124, (uintptr_t)data + -0x4); + patch_32r(code + 0x132, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x13b, (uintptr_t)data + -0x4); + patch_32r(code + 0x156, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_EXC_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EXC_MATCH.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 4c 89 f7 movq %r14, %rdi + // 14: 48 89 de movq %rbx, %rsi + // 17: ff 15 00 00 00 00 callq *(%rip) ## 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_GOT __PyEval_CheckExceptTypeValid@GOTPCREL + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 85 c0 testl %eax, %eax + // 2d: 78 40 js 0x6f <__JIT_ENTRY+0x6f> + // 2f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 34: 4c 89 ff movq %r15, %rdi + // 37: 48 89 de movq %rbx, %rsi + // 3a: ff 15 00 00 00 00 callq *(%rip) ## 0x40 <__JIT_ENTRY+0x40> + // 000000000000003c: X86_64_RELOC_GOT _PyErr_GivenExceptionMatches@GOTPCREL + // 40: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 45: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4e: 8b 0b movl (%rbx), %ecx + // 50: 85 c9 testl %ecx, %ecx + // 52: 78 06 js 0x5a <__JIT_ENTRY+0x5a> + // 54: ff c9 decl %ecx + // 56: 89 0b movl %ecx, (%rbx) + // 58: 74 2b je 0x85 <__JIT_ENTRY+0x85> + // 5a: 85 c0 testl %eax, %eax + // 5c: 75 38 jne 0x96 <__JIT_ENTRY+0x96> + // 5e: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x65 <__JIT_ENTRY+0x65> + // 0000000000000061: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 65: 49 89 45 f8 movq %rax, -0x8(%r13) + // 69: 5d popq %rbp + // 6a: e9 00 00 00 00 jmp 0x6f <__JIT_ENTRY+0x6f> + // 000000000000006b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6f: 8b 03 movl (%rbx), %eax + // 71: 85 c0 testl %eax, %eax + // 73: 78 06 js 0x7b <__JIT_ENTRY+0x7b> + // 75: ff c8 decl %eax + // 77: 89 03 movl %eax, (%rbx) + // 79: 74 2c je 0xa7 <__JIT_ENTRY+0xa7> + // 7b: 49 83 c5 f8 addq $-0x8, %r13 + // 7f: 5d popq %rbp + // 80: e9 00 00 00 00 jmp 0x85 <__JIT_ENTRY+0x85> + // 0000000000000081: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 85: 48 89 df movq %rbx, %rdi + // 88: 89 c3 movl %eax, %ebx + // 8a: ff 15 00 00 00 00 callq *(%rip) ## 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 90: 89 d8 movl %ebx, %eax + // 92: 85 c0 testl %eax, %eax + // 94: 74 c8 je 0x5e <__JIT_ENTRY+0x5e> + // 96: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x9d <__JIT_ENTRY+0x9d> + // 0000000000000099: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 9d: 49 89 45 f8 movq %rax, -0x8(%r13) + // a1: 5d popq %rbp + // a2: e9 00 00 00 00 jmp 0xa7 <__JIT_ENTRY+0xa7> + // 00000000000000a3: X86_64_RELOC_BRANCH __JIT_CONTINUE + // a7: 48 89 df movq %rbx, %rdi + // aa: ff 15 00 00 00 00 callq *(%rip) ## 0xb0 <__JIT_ENTRY+0xb0> + // 00000000000000ac: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b0: 49 83 c5 f8 addq $-0x8, %r13 + // b4: 5d popq %rbp + // b5: e9 00 00 00 00 jmp 0xba <__JIT_ENTRY+0xba> + // 00000000000000b6: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[186] = { + 0x55, 0x48, 0x89, 0xe5, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xde, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x40, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xff, 0x48, + 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, + 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, + 0x74, 0x2b, 0x85, 0xc0, 0x75, 0x38, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x03, 0x74, 0x2c, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x85, 0xc0, 0x74, 0xc8, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &PyErr_GivenExceptionMatches+0x0 + // 20: &_PyEval_CheckExceptTypeValid+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&PyErr_GivenExceptionMatches); + patch_64(data + 0x20, (uintptr_t)&_PyEval_CheckExceptTypeValid); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0xc); + patch_32r(code + 0x6b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x81, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + 0x4); + patch_32r(code + 0xa3, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xac, (uintptr_t)data + -0x4); + patch_32r(code + 0xb6, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 10 movq 0x10(%r12), %rax + // 9: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // f: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 15: 75 06 jne 0x1d <__JIT_ENTRY+0x1d> + // 17: 5d popq %rbp + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1d: 5d popq %rbp + // 1e: e9 00 00 00 00 jmp 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[35] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x10, 0x8b, 0x80, 0x90, 0x00, 0x00, 0x00, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, 0x06, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x1f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_EXACT_ARGS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 c9 movslq %ecx, %rcx + // 12: ba fe ff ff ff movl $0xfffffffe, %edx ## imm = 0xFFFFFFFE + // 17: 29 c2 subl %eax, %edx + // 19: 48 63 d2 movslq %edx, %rdx + // 1c: 49 8b 54 d5 00 movq (%r13,%rdx,8), %rdx + // 21: 48 8b 52 30 movq 0x30(%rdx), %rdx + // 25: 49 83 7c cd 00 01 cmpq $0x1, (%r13,%rcx,8) + // 2b: 83 d8 ff sbbl $-0x1, %eax + // 2e: 39 42 34 cmpl %eax, 0x34(%rdx) + // 31: 75 06 jne 0x39 <__JIT_ENTRY+0x39> + // 33: 5d popq %rbp + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[63] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xc9, 0xba, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc2, 0x48, 0x63, 0xd2, 0x49, 0x8b, 0x54, 0xd5, + 0x00, 0x48, 0x8b, 0x52, 0x30, 0x49, 0x83, 0x7c, + 0xcd, 0x00, 0x01, 0x83, 0xd8, 0xff, 0x39, 0x42, + 0x34, 0x75, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_32r(code + 0x35, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x3b, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // 12: 48 29 c1 subq %rax, %rcx + // 15: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 1a: 48 8b 48 08 movq 0x8(%rax), %rcx + // 1e: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyFunction_Type@GOTPCREL + // 25: 75 14 jne 0x3b <__JIT_ENTRY+0x3b> + // 27: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 2d: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x33 <__JIT_ENTRY+0x33> + // 000000000000002f: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 33: 75 06 jne 0x3b <__JIT_ENTRY+0x3b> + // 35: 5d popq %rbp + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 5d popq %rbp + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[65] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc1, 0xfe, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xc1, 0x49, 0x8b, 0x44, + 0xcd, 0x00, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x75, 0x14, 0x8b, + 0x80, 0x90, 0x00, 0x00, 0x00, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + -0x4); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x3d, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_VERSION_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_INLINE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPERAND1@GOTPCREL + // b: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 11: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 17: 75 06 jne 0x1f <__JIT_ENTRY+0x1f> + // 19: 5d popq %rbp + // 1a: e9 00 00 00 00 jmp 0x1f <__JIT_ENTRY+0x1f> + // 000000000000001b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1f: 5d popq %rbp + // 20: e9 00 00 00 00 jmp 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[37] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x80, 0x90, 0x00, 0x00, + 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: OPERAND1 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->operand1); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_32r(code + 0x1b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x21, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_FUNCTION_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_KW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 48 c7 c1 fd ff ff ff movq $-0x3, %rcx + // 12: 48 29 c1 subq %rax, %rcx + // 15: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 1a: 48 8b 48 08 movq 0x8(%rax), %rcx + // 1e: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyFunction_Type@GOTPCREL + // 25: 75 14 jne 0x3b <__JIT_ENTRY+0x3b> + // 27: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 2d: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x33 <__JIT_ENTRY+0x33> + // 000000000000002f: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 33: 75 06 jne 0x3b <__JIT_ENTRY+0x3b> + // 35: 5d popq %rbp + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 5d popq %rbp + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[65] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc1, 0xfd, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xc1, 0x49, 0x8b, 0x44, + 0xcd, 0x00, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x75, 0x14, 0x8b, + 0x80, 0x90, 0x00, 0x00, 0x00, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + -0x4); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x3d, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // 12: 48 29 c1 subq %rax, %rcx + // 15: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 1a: 48 8b 40 08 movq 0x8(%rax), %rax + // 1e: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyFunction_Type@GOTPCREL + // 25: 74 0f je 0x36 <__JIT_ENTRY+0x36> + // 27: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x2e <__JIT_ENTRY+0x2e> + // 000000000000002a: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 2e: 74 06 je 0x36 <__JIT_ENTRY+0x36> + // 30: 5d popq %rbp + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 36: 5d popq %rbp + // 37: e9 00 00 00 00 jmp 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[60] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc1, 0xfe, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xc1, 0x49, 0x8b, 0x44, + 0xcd, 0x00, 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0f, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyMethod_Type+0x0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + -0x4); + patch_32r(code + 0x32, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE_KW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 48 c7 c1 fd ff ff ff movq $-0x3, %rcx + // 12: 48 29 c1 subq %rax, %rcx + // 15: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 1a: 48 8b 40 08 movq 0x8(%rax), %rax + // 1e: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyFunction_Type@GOTPCREL + // 25: 74 0f je 0x36 <__JIT_ENTRY+0x36> + // 27: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x2e <__JIT_ENTRY+0x2e> + // 000000000000002a: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 2e: 74 06 je 0x36 <__JIT_ENTRY+0x36> + // 30: 5d popq %rbp + // 31: e9 00 00 00 00 jmp 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 36: 5d popq %rbp + // 37: e9 00 00 00 00 jmp 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[60] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc1, 0xfd, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xc1, 0x49, 0x8b, 0x44, + 0xcd, 0x00, 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0f, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyMethod_Type+0x0 + // 8: &PyFunction_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + -0x4); + patch_32r(code + 0x32, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_MANAGED_OBJECT_HAS_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_MANAGED_OBJECT_HAS_VALUES.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 10: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 15: 74 06 je 0x1d <__JIT_ENTRY+0x1d> + // 17: 5d popq %rbp + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1d: 5d popq %rbp + // 1e: e9 00 00 00 00 jmp 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[35] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x08, 0x48, 0x8b, 0x49, 0x20, + 0x80, 0x7c, 0x08, 0x03, 0x00, 0x74, 0x06, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x19, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x1f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_METHOD_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 10: 29 c1 subl %eax, %ecx + // 12: 48 63 c9 movslq %ecx, %rcx + // 15: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 1a: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1e: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 25: 75 2b jne 0x52 <__JIT_ENTRY+0x52> + // 27: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 2b: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2f: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT _PyFunction_Type@GOTPCREL + // 36: 75 1a jne 0x52 <__JIT_ENTRY+0x52> + // 38: 8b 89 90 00 00 00 movl 0x90(%rcx), %ecx + // 3e: 3b 0d 00 00 00 00 cmpl (%rip), %ecx ## 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 44: 75 0c jne 0x52 <__JIT_ENTRY+0x52> + // 46: f7 d0 notl %eax + // 48: 48 98 cltq + // 4a: 49 83 7c c5 00 00 cmpq $0x0, (%r13,%rax,8) + // 50: 74 06 je 0x58 <__JIT_ENTRY+0x58> + // 52: 5d popq %rbp + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 58: 5d popq %rbp + // 59: e9 00 00 00 00 jmp 0x5e <__JIT_ENTRY+0x5e> + // 000000000000005a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[89] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xc9, 0x49, 0x8b, 0x4c, + 0xcd, 0x00, 0x48, 0x8b, 0x51, 0x08, 0x48, 0x3b, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x75, 0x2b, 0x48, + 0x8b, 0x49, 0x10, 0x48, 0x8b, 0x51, 0x08, 0x48, + 0x3b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1a, + 0x8b, 0x89, 0x90, 0x00, 0x00, 0x00, 0x3b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x0c, 0xf7, 0xd0, + 0x48, 0x98, 0x49, 0x83, 0x7c, 0xc5, 0x00, 0x00, + 0x74, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x5d, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + -0x4); + patch_32r(code + 0x54, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_METHOD_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION_KW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: b9 fd ff ff ff movl $0xfffffffd, %ecx ## imm = 0xFFFFFFFD + // 10: 29 c1 subl %eax, %ecx + // 12: 48 63 c9 movslq %ecx, %rcx + // 15: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 1a: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1e: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 25: 75 31 jne 0x58 <__JIT_ENTRY+0x58> + // 27: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 2b: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2f: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT _PyFunction_Type@GOTPCREL + // 36: 75 20 jne 0x58 <__JIT_ENTRY+0x58> + // 38: 8b 89 90 00 00 00 movl 0x90(%rcx), %ecx + // 3e: 3b 0d 00 00 00 00 cmpl (%rip), %ecx ## 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 44: 75 12 jne 0x58 <__JIT_ENTRY+0x58> + // 46: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 4b: 29 c1 subl %eax, %ecx + // 4d: 48 63 c1 movslq %ecx, %rax + // 50: 49 83 7c c5 00 00 cmpq $0x0, (%r13,%rax,8) + // 56: 74 06 je 0x5e <__JIT_ENTRY+0x5e> + // 58: 5d popq %rbp + // 59: e9 00 00 00 00 jmp 0x5e <__JIT_ENTRY+0x5e> + // 000000000000005a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 5e: 5d popq %rbp + // 5f: e9 00 00 00 00 jmp 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[95] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xb9, 0xfd, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xc9, 0x49, 0x8b, 0x4c, + 0xcd, 0x00, 0x48, 0x8b, 0x51, 0x08, 0x48, 0x3b, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x75, 0x31, 0x48, + 0x8b, 0x49, 0x10, 0x48, 0x8b, 0x51, 0x08, 0x48, + 0x3b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x75, 0x20, + 0x8b, 0x89, 0x90, 0x00, 0x00, 0x00, 0x3b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x12, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xc1, + 0x49, 0x83, 0x7c, 0xc5, 0x00, 0x00, 0x74, 0x06, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: OPERAND0 + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + -0x4); + patch_32r(code + 0x5a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_PEP_523( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PEP_523.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 46 10 movq 0x10(%r14), %rax + // 8: 48 83 b8 48 21 00 00 00 cmpq $0x0, 0x2148(%rax) + // 10: 74 06 je 0x18 <__JIT_ENTRY+0x18> + // 12: 5d popq %rbp + // 13: e9 00 00 00 00 jmp 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[25] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x46, 0x10, + 0x48, 0x83, 0xb8, 0x48, 0x21, 0x00, 0x00, 0x00, + 0x74, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x14, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_PERIODIC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 46 18 movq 0x18(%r14), %rax + // 4: 84 c0 testb %al, %al + // 6: 0f 84 00 00 00 00 je 0xc <__JIT_ENTRY+0xc> + // 0000000000000008: X86_64_RELOC_BRANCH __JIT_CONTINUE + // c: 55 pushq %rbp + // d: 48 89 e5 movq %rsp, %rbp + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: 4c 89 f7 movq %r14, %rdi + // 18: ff 15 00 00 00 00 callq *(%rip) ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT __Py_HandlePending@GOTPCREL + // 1e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 23: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2c: 85 c0 testl %eax, %eax + // 2e: 5d popq %rbp + // 2f: 0f 84 00 00 00 00 je 0x35 <__JIT_ENTRY+0x35> + // 0000000000000031: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[58] = { + 0x49, 0x8b, 0x46, 0x18, 0x84, 0xc0, 0x0f, 0x84, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x5d, 0x0f, + 0x84, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_HandlePending+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_HandlePending); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_32r(code + 0x31, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x36, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC_IF_NOT_YIELD_FROM.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: a8 02 testb $0x2, %al + // 9: 0f 85 00 00 00 00 jne 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // f: 49 8b 46 18 movq 0x18(%r14), %rax + // 13: 84 c0 testb %al, %al + // 15: 0f 84 00 00 00 00 je 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1b: 55 pushq %rbp + // 1c: 48 89 e5 movq %rsp, %rbp + // 1f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 24: 4c 89 f7 movq %r14, %rdi + // 27: ff 15 00 00 00 00 callq *(%rip) ## 0x2d <__JIT_ENTRY+0x2d> + // 0000000000000029: X86_64_RELOC_GOT __Py_HandlePending@GOTPCREL + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 85 c0 testl %eax, %eax + // 3d: 5d popq %rbp + // 3e: 0f 84 00 00 00 00 je 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[73] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xa8, + 0x02, 0x0f, 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x46, 0x18, 0x84, 0xc0, 0x0f, 0x84, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x5d, 0x0f, 0x84, + 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_HandlePending+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_HandlePending); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x4); + patch_32r(code + 0xb, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x17, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + -0x4); + patch_32r(code + 0x40, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x45, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CHECK_STACK_SPACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // b: 48 85 c0 testq %rax, %rax + // e: 74 38 je 0x48 <__JIT_ENTRY+0x48> + // 10: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 17: 48 c7 c2 fe ff ff ff movq $-0x2, %rdx + // 1e: 48 29 ca subq %rcx, %rdx + // 21: 49 8b 4c d5 00 movq (%r13,%rdx,8), %rcx + // 26: 48 8b 49 30 movq 0x30(%rcx), %rcx + // 2a: 48 63 49 4c movslq 0x4c(%rcx), %rcx + // 2e: 49 8b 96 f8 00 00 00 movq 0xf8(%r14), %rdx + // 35: 48 29 c2 subq %rax, %rdx + // 38: 48 c1 fa 03 sarq $0x3, %rdx + // 3c: 48 39 ca cmpq %rcx, %rdx + // 3f: 7e 07 jle 0x48 <__JIT_ENTRY+0x48> + // 41: 41 83 7e 2c 01 cmpl $0x1, 0x2c(%r14) + // 46: 7f 06 jg 0x4e <__JIT_ENTRY+0x4e> + // 48: 5d popq %rbp + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[79] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x86, 0xf0, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x38, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc2, 0xfe, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xca, 0x49, 0x8b, 0x4c, 0xd5, 0x00, 0x48, 0x8b, + 0x49, 0x30, 0x48, 0x63, 0x49, 0x4c, 0x49, 0x8b, + 0x96, 0xf8, 0x00, 0x00, 0x00, 0x48, 0x29, 0xc2, + 0x48, 0xc1, 0xfa, 0x03, 0x48, 0x39, 0xca, 0x7e, + 0x07, 0x41, 0x83, 0x7e, 0x2c, 0x01, 0x7f, 0x06, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_32r(code + 0x4a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_STACK_SPACE_OPERAND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE_OPERAND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // b: 48 85 c0 testq %rax, %rax + // e: 74 21 je 0x31 <__JIT_ENTRY+0x31> + // 10: 48 63 0d 00 00 00 00 movslq (%rip), %rcx ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 17: 49 8b 96 f8 00 00 00 movq 0xf8(%r14), %rdx + // 1e: 48 29 c2 subq %rax, %rdx + // 21: 48 c1 fa 03 sarq $0x3, %rdx + // 25: 48 39 ca cmpq %rcx, %rdx + // 28: 7e 07 jle 0x31 <__JIT_ENTRY+0x31> + // 2a: 41 83 7e 2c 01 cmpl $0x1, 0x2c(%r14) + // 2f: 7f 06 jg 0x37 <__JIT_ENTRY+0x37> + // 31: 5d popq %rbp + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 0000000000000033: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 37: 5d popq %rbp + // 38: e9 00 00 00 00 jmp 0x3d <__JIT_ENTRY+0x3d> + // 0000000000000039: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[56] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x86, 0xf0, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x21, + 0x48, 0x63, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x96, 0xf8, 0x00, 0x00, 0x00, 0x48, 0x29, + 0xc2, 0x48, 0xc1, 0xfa, 0x03, 0x48, 0x39, 0xca, + 0x7e, 0x07, 0x41, 0x83, 0x7e, 0x2c, 0x01, 0x7f, + 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_32r(code + 0x33, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_VALIDITY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // b: f6 40 22 01 testb $0x1, 0x22(%rax) + // f: 75 06 jne 0x17 <__JIT_ENTRY+0x17> + // 11: 5d popq %rbp + // 12: e9 00 00 00 00 jmp 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 17: 5d popq %rbp + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[24] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xf6, 0x40, 0x22, 0x01, 0x75, + 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: EXECUTOR + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_32r(code + 0x13, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__CHECK_VALIDITY_AND_SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY_AND_SET_IP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // b: f6 40 22 01 testb $0x1, 0x22(%rax) + // f: 75 06 jne 0x17 <__JIT_ENTRY+0x17> + // 11: 5d popq %rbp + // 12: e9 00 00 00 00 jmp 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 17: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 1e: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 23: 5d popq %rbp + // 24: e9 00 00 00 00 jmp 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[36] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xf6, 0x40, 0x22, 0x01, 0x75, + 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x44, 0x24, 0x38, 0x5d, + }; + // 0: OPERAND0 + // 8: EXECUTOR + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_32r(code + 0x13, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); +} + +void +emit__COMPARE_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d ## 0x14 <__JIT_ENTRY+0x14> + // 0000000000000010: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 14: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 18: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 44 89 f2 movl %r14d, %edx + // 24: c1 ea 05 shrl $0x5, %edx + // 27: 48 89 df movq %rbx, %rdi + // 2a: 4c 89 fe movq %r15, %rsi + // 2d: ff 15 00 00 00 00 callq *(%rip) ## 0x33 <__JIT_ENTRY+0x33> + // 000000000000002f: X86_64_RELOC_GOT _PyObject_RichCompare@GOTPCREL + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 8b 0b movl (%rbx), %ecx + // 43: 85 c9 testl %ecx, %ecx + // 45: 78 17 js 0x5e <__JIT_ENTRY+0x5e> + // 47: ff c9 decl %ecx + // 49: 89 0b movl %ecx, (%rbx) + // 4b: 75 11 jne 0x5e <__JIT_ENTRY+0x5e> + // 4d: 48 89 45 f0 movq %rax, -0x10(%rbp) + // 51: 48 89 df movq %rbx, %rdi + // 54: ff 15 00 00 00 00 callq *(%rip) ## 0x5a <__JIT_ENTRY+0x5a> + // 0000000000000056: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5a: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 5e: 41 8b 0f movl (%r15), %ecx + // 61: 85 c9 testl %ecx, %ecx + // 63: 78 07 js 0x6c <__JIT_ENTRY+0x6c> + // 65: ff c9 decl %ecx + // 67: 41 89 0f movl %ecx, (%r15) + // 6a: 74 4d je 0xb9 <__JIT_ENTRY+0xb9> + // 6c: 49 83 c5 f0 addq $-0x10, %r13 + // 70: 48 85 c0 testq %rax, %rax + // 73: 0f 84 96 00 00 00 je 0x10f <__JIT_ENTRY+0x10f> + // 79: 41 f6 c6 10 testb $0x10, %r14b + // 7d: 74 5b je 0xda <__JIT_ENTRY+0xda> + // 7f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 84: 48 89 c3 movq %rax, %rbx + // 87: 48 89 c7 movq %rax, %rdi + // 8a: ff 15 00 00 00 00 callq *(%rip) ## 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_GOT _PyObject_IsTrue@GOTPCREL + // 90: 8b 0b movl (%rbx), %ecx + // 92: 85 c9 testl %ecx, %ecx + // 94: 78 06 js 0x9c <__JIT_ENTRY+0x9c> + // 96: ff c9 decl %ecx + // 98: 89 0b movl %ecx, (%rbx) + // 9a: 74 54 je 0xf0 <__JIT_ENTRY+0xf0> + // 9c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // aa: 85 c0 testl %eax, %eax + // ac: 78 61 js 0x10f <__JIT_ENTRY+0x10f> + // ae: 75 23 jne 0xd3 <__JIT_ENTRY+0xd3> + // b0: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb7 <__JIT_ENTRY+0xb7> + // 00000000000000b3: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // b7: eb 21 jmp 0xda <__JIT_ENTRY+0xda> + // b9: 48 89 c3 movq %rax, %rbx + // bc: 4c 89 ff movq %r15, %rdi + // bf: ff 15 00 00 00 00 callq *(%rip) ## 0xc5 <__JIT_ENTRY+0xc5> + // 00000000000000c1: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c5: 48 89 d8 movq %rbx, %rax + // c8: 49 83 c5 f0 addq $-0x10, %r13 + // cc: 48 85 c0 testq %rax, %rax + // cf: 75 a8 jne 0x79 <__JIT_ENTRY+0x79> + // d1: eb 3c jmp 0x10f <__JIT_ENTRY+0x10f> + // d3: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xda <__JIT_ENTRY+0xda> + // 00000000000000d6: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // da: 49 89 45 00 movq %rax, (%r13) + // de: 49 83 c5 08 addq $0x8, %r13 + // e2: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // e6: 48 83 c4 10 addq $0x10, %rsp + // ea: 5d popq %rbp + // eb: e9 00 00 00 00 jmp 0xf0 <__JIT_ENTRY+0xf0> + // 00000000000000ec: X86_64_RELOC_BRANCH __JIT_CONTINUE + // f0: 48 89 df movq %rbx, %rdi + // f3: 89 c3 movl %eax, %ebx + // f5: ff 15 00 00 00 00 callq *(%rip) ## 0xfb <__JIT_ENTRY+0xfb> + // 00000000000000f7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // fb: 89 d8 movl %ebx, %eax + // fd: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 102: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 10b: 85 c0 testl %eax, %eax + // 10d: 79 9f jns 0xae <__JIT_ENTRY+0xae> + // 10f: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 113: 48 83 c4 10 addq $0x10, %rsp + // 117: 5d popq %rbp + // 118: e9 00 00 00 00 jmp 0x11d <__JIT_ENTRY+0x11d> + // 0000000000000119: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[285] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x44, 0x0f, 0xb7, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x44, 0x89, 0xf2, 0xc1, 0xea, 0x05, 0x48, + 0x89, 0xdf, 0x4c, 0x89, 0xfe, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x17, 0xff, + 0xc9, 0x89, 0x0b, 0x75, 0x11, 0x48, 0x89, 0x45, + 0xf0, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf0, 0x41, 0x8b, + 0x0f, 0x85, 0xc9, 0x78, 0x07, 0xff, 0xc9, 0x41, + 0x89, 0x0f, 0x74, 0x4d, 0x49, 0x83, 0xc5, 0xf0, + 0x48, 0x85, 0xc0, 0x0f, 0x84, 0x96, 0x00, 0x00, + 0x00, 0x41, 0xf6, 0xc6, 0x10, 0x74, 0x5b, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xc3, 0x48, + 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0b, 0x74, 0x54, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x61, 0x75, 0x23, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x21, 0x48, 0x89, 0xc3, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, + 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x85, 0xc0, 0x75, + 0xa8, 0xeb, 0x3c, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x79, 0x9f, 0x4c, + 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &PyObject_IsTrue+0x0 + // 20: &PyObject_RichCompare+0x0 + // 28: OPARG + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x20, (uintptr_t)&PyObject_RichCompare); + patch_64(data + 0x28, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc1, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd6, (uintptr_t)data + 0x4); + patch_32r(code + 0xec, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)data + -0x4); + patch_32r(code + 0x119, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__COMPARE_OP_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: f2 41 0f 10 47 10 movsd 0x10(%r15), %xmm0 + // 16: f2 0f 10 4b 10 movsd 0x10(%rbx), %xmm1 + // 1b: 41 8b 07 movl (%r15), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 48 js 0x6a <__JIT_ENTRY+0x6a> + // 22: ff c8 decl %eax + // 24: 41 89 07 movl %eax, (%r15) + // 27: 75 41 jne 0x6a <__JIT_ENTRY+0x6a> + // 29: f2 0f 11 4d f8 movsd %xmm1, -0x8(%rbp) + // 2e: f2 0f 11 45 f0 movsd %xmm0, -0x10(%rbp) + // 33: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 3a: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 41: 48 85 c0 testq %rax, %rax + // 44: 74 11 je 0x57 <__JIT_ENTRY+0x57> + // 46: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 4d: 4c 89 ff movq %r15, %rdi + // 50: be 01 00 00 00 movl $0x1, %esi + // 55: ff d0 callq *%rax + // 57: 4c 89 ff movq %r15, %rdi + // 5a: ff 15 00 00 00 00 callq *(%rip) ## 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_GOT __PyFloat_ExactDealloc@GOTPCREL + // 60: f2 0f 10 45 f0 movsd -0x10(%rbp), %xmm0 + // 65: f2 0f 10 4d f8 movsd -0x8(%rbp), %xmm1 + // 6a: 8b 03 movl (%rbx), %eax + // 6c: 85 c0 testl %eax, %eax + // 6e: 78 47 js 0xb7 <__JIT_ENTRY+0xb7> + // 70: ff c8 decl %eax + // 72: 89 03 movl %eax, (%rbx) + // 74: 75 41 jne 0xb7 <__JIT_ENTRY+0xb7> + // 76: f2 0f 11 4d f8 movsd %xmm1, -0x8(%rbp) + // 7b: f2 0f 11 45 f0 movsd %xmm0, -0x10(%rbp) + // 80: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x87 <__JIT_ENTRY+0x87> + // 0000000000000083: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 87: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 8e: 48 85 c0 testq %rax, %rax + // 91: 74 11 je 0xa4 <__JIT_ENTRY+0xa4> + // 93: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 9a: 48 89 df movq %rbx, %rdi + // 9d: be 01 00 00 00 movl $0x1, %esi + // a2: ff d0 callq *%rax + // a4: 48 89 df movq %rbx, %rdi + // a7: ff 15 00 00 00 00 callq *(%rip) ## 0xad <__JIT_ENTRY+0xad> + // 00000000000000a9: X86_64_RELOC_GOT __PyFloat_ExactDealloc@GOTPCREL + // ad: f2 0f 10 45 f0 movsd -0x10(%rbp), %xmm0 + // b2: f2 0f 10 4d f8 movsd -0x8(%rbp), %xmm1 + // b7: 49 8d 45 f8 leaq -0x8(%r13), %rax + // bb: 31 c9 xorl %ecx, %ecx + // bd: 66 0f 2e c1 ucomisd %xmm1, %xmm0 + // c1: 0f 93 c1 setae %cl + // c4: 01 c9 addl %ecx, %ecx + // c6: 31 d2 xorl %edx, %edx + // c8: 66 0f 2e c8 ucomisd %xmm0, %xmm1 + // cc: 0f 93 c2 setae %dl + // cf: 09 ca orl %ecx, %edx + // d1: 8b 0d 00 00 00 00 movl (%rip), %ecx ## 0xd7 <__JIT_ENTRY+0xd7> + // 00000000000000d3: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // d7: 0f a3 d1 btl %edx, %ecx + // da: 72 09 jb 0xe5 <__JIT_ENTRY+0xe5> + // dc: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xe3 <__JIT_ENTRY+0xe3> + // 00000000000000df: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // e3: eb 07 jmp 0xec <__JIT_ENTRY+0xec> + // e5: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xec <__JIT_ENTRY+0xec> + // 00000000000000e8: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // ec: 49 89 4d f0 movq %rcx, -0x10(%r13) + // f0: 49 89 c5 movq %rax, %r13 + // f3: 48 83 c4 10 addq $0x10, %rsp + // f7: 5d popq %rbp + // f8: e9 00 00 00 00 jmp 0xfd <__JIT_ENTRY+0xfd> + // 00000000000000f9: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[248] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x5d, 0xf8, + 0xf2, 0x41, 0x0f, 0x10, 0x47, 0x10, 0xf2, 0x0f, + 0x10, 0x4b, 0x10, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x48, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, + 0x41, 0xf2, 0x0f, 0x11, 0x4d, 0xf8, 0xf2, 0x0f, + 0x11, 0x45, 0xf0, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x81, 0x40, 0x26, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, + 0x91, 0x48, 0x26, 0x00, 0x00, 0x4c, 0x89, 0xff, + 0xbe, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, + 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0xf2, 0x0f, 0x10, 0x45, 0xf0, 0xf2, 0x0f, 0x10, + 0x4d, 0xf8, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x47, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x41, 0xf2, 0x0f, + 0x11, 0x4d, 0xf8, 0xf2, 0x0f, 0x11, 0x45, 0xf0, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x0f, 0x10, + 0x45, 0xf0, 0xf2, 0x0f, 0x10, 0x4d, 0xf8, 0x49, + 0x8d, 0x45, 0xf8, 0x31, 0xc9, 0x66, 0x0f, 0x2e, + 0xc1, 0x0f, 0x93, 0xc1, 0x01, 0xc9, 0x31, 0xd2, + 0x66, 0x0f, 0x2e, 0xc8, 0x0f, 0x93, 0xc2, 0x09, + 0xca, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xa3, 0xd1, 0x72, 0x09, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x07, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: OPARG + // 18: &_PyFloat_ExactDealloc+0x0 + // 20: &_PyRuntime+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyFloat_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xdf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xe8, (uintptr_t)data + -0x4); +} + +void +emit__COMPARE_OP_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 4: 49 8b 5f 10 movq 0x10(%r15), %rbx + // 8: 48 83 fb 10 cmpq $0x10, %rbx + // c: 0f 83 00 00 00 00 jae 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 12: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 16: 48 8b 77 10 movq 0x10(%rdi), %rsi + // 1a: 48 83 fe 10 cmpq $0x10, %rsi + // 1e: 0f 83 00 00 00 00 jae 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 24: 55 pushq %rbp + // 25: 48 89 e5 movq %rsp, %rbp + // 28: 48 83 ec 20 subq $0x20, %rsp + // 2c: 41 8b 07 movl (%r15), %eax + // 2f: 45 8b 47 18 movl 0x18(%r15), %r8d + // 33: 44 8b 4f 18 movl 0x18(%rdi), %r9d + // 37: 85 c0 testl %eax, %eax + // 39: 78 54 js 0x8f <__JIT_ENTRY+0x8f> + // 3b: ff c8 decl %eax + // 3d: 41 89 07 movl %eax, (%r15) + // 40: 75 4d jne 0x8f <__JIT_ENTRY+0x8f> + // 42: 48 89 7d e0 movq %rdi, -0x20(%rbp) + // 46: 4c 89 45 f8 movq %r8, -0x8(%rbp) + // 4a: 4c 89 4d f0 movq %r9, -0x10(%rbp) + // 4e: 48 89 75 e8 movq %rsi, -0x18(%rbp) + // 52: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 59: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 60: 48 85 c0 testq %rax, %rax + // 63: 74 11 je 0x76 <__JIT_ENTRY+0x76> + // 65: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 6c: 4c 89 ff movq %r15, %rdi + // 6f: be 01 00 00 00 movl $0x1, %esi + // 74: ff d0 callq *%rax + // 76: 4c 89 ff movq %r15, %rdi + // 79: ff 15 00 00 00 00 callq *(%rip) ## 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // 7f: 48 8b 75 e8 movq -0x18(%rbp), %rsi + // 83: 4c 8b 4d f0 movq -0x10(%rbp), %r9 + // 87: 4c 8b 45 f8 movq -0x8(%rbp), %r8 + // 8b: 48 8b 7d e0 movq -0x20(%rbp), %rdi + // 8f: 8b 07 movl (%rdi), %eax + // 91: 85 c0 testl %eax, %eax + // 93: 78 4b js 0xe0 <__JIT_ENTRY+0xe0> + // 95: ff c8 decl %eax + // 97: 89 07 movl %eax, (%rdi) + // 99: 75 45 jne 0xe0 <__JIT_ENTRY+0xe0> + // 9b: 4c 89 45 f8 movq %r8, -0x8(%rbp) + // 9f: 4c 89 4d f0 movq %r9, -0x10(%rbp) + // a3: 48 89 75 e8 movq %rsi, -0x18(%rbp) + // a7: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xae <__JIT_ENTRY+0xae> + // 00000000000000aa: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // ae: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // b5: 48 85 c0 testq %rax, %rax + // b8: 74 14 je 0xce <__JIT_ENTRY+0xce> + // ba: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // c1: be 01 00 00 00 movl $0x1, %esi + // c6: 49 89 ff movq %rdi, %r15 + // c9: ff d0 callq *%rax + // cb: 4c 89 ff movq %r15, %rdi + // ce: ff 15 00 00 00 00 callq *(%rip) ## 0xd4 <__JIT_ENTRY+0xd4> + // 00000000000000d0: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // d4: 48 8b 75 e8 movq -0x18(%rbp), %rsi + // d8: 4c 8b 4d f0 movq -0x10(%rbp), %r9 + // dc: 4c 8b 45 f8 movq -0x8(%rbp), %r8 + // e0: 49 8d 45 f8 leaq -0x8(%r13), %rax + // e4: 83 e3 03 andl $0x3, %ebx + // e7: b9 01 00 00 00 movl $0x1, %ecx + // ec: ba 01 00 00 00 movl $0x1, %edx + // f1: 48 29 da subq %rbx, %rdx + // f4: 49 0f af d0 imulq %r8, %rdx + // f8: 83 e6 03 andl $0x3, %esi + // fb: 48 29 f1 subq %rsi, %rcx + // fe: 49 0f af c9 imulq %r9, %rcx + // 102: 31 f6 xorl %esi, %esi + // 104: 31 ff xorl %edi, %edi + // 106: 48 39 ca cmpq %rcx, %rdx + // 109: 40 0f 9d c6 setge %sil + // 10d: 40 0f 9e c7 setle %dil + // 111: 01 f6 addl %esi, %esi + // 113: 09 f7 orl %esi, %edi + // 115: 8b 0d 00 00 00 00 movl (%rip), %ecx ## 0x11b <__JIT_ENTRY+0x11b> + // 0000000000000117: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 11b: 0f a3 f9 btl %edi, %ecx + // 11e: 72 09 jb 0x129 <__JIT_ENTRY+0x129> + // 120: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x127 <__JIT_ENTRY+0x127> + // 0000000000000123: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 127: eb 07 jmp 0x130 <__JIT_ENTRY+0x130> + // 129: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x130 <__JIT_ENTRY+0x130> + // 000000000000012c: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 130: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 134: 49 89 c5 movq %rax, %r13 + // 137: 48 83 c4 20 addq $0x20, %rsp + // 13b: 5d popq %rbp + // 13c: e9 00 00 00 00 jmp 0x141 <__JIT_ENTRY+0x141> + // 000000000000013d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[316] = { + 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x5f, 0x10, + 0x48, 0x83, 0xfb, 0x10, 0x0f, 0x83, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, + 0x77, 0x10, 0x48, 0x83, 0xfe, 0x10, 0x0f, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0x48, 0x83, 0xec, 0x20, 0x41, 0x8b, 0x07, 0x45, + 0x8b, 0x47, 0x18, 0x44, 0x8b, 0x4f, 0x18, 0x85, + 0xc0, 0x78, 0x54, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x75, 0x4d, 0x48, 0x89, 0x7d, 0xe0, 0x4c, 0x89, + 0x45, 0xf8, 0x4c, 0x89, 0x4d, 0xf0, 0x48, 0x89, + 0x75, 0xe8, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, + 0x48, 0x26, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x75, 0xe8, 0x4c, 0x8b, 0x4d, 0xf0, 0x4c, + 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x7d, 0xe0, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x4b, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x45, 0x4c, 0x89, 0x45, 0xf8, 0x4c, + 0x89, 0x4d, 0xf0, 0x48, 0x89, 0x75, 0xe8, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x14, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x49, 0x89, + 0xff, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x75, 0xe8, + 0x4c, 0x8b, 0x4d, 0xf0, 0x4c, 0x8b, 0x45, 0xf8, + 0x49, 0x8d, 0x45, 0xf8, 0x83, 0xe3, 0x03, 0xb9, + 0x01, 0x00, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xda, 0x49, 0x0f, 0xaf, 0xd0, + 0x83, 0xe6, 0x03, 0x48, 0x29, 0xf1, 0x49, 0x0f, + 0xaf, 0xc9, 0x31, 0xf6, 0x31, 0xff, 0x48, 0x39, + 0xca, 0x40, 0x0f, 0x9d, 0xc6, 0x40, 0x0f, 0x9e, + 0xc7, 0x01, 0xf6, 0x09, 0xf7, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xa3, 0xf9, 0x72, 0x09, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x07, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, + 0x83, 0xc4, 0x20, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: OPARG + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_PyRuntime+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xe, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x20, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x117, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x123, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x12c, (uintptr_t)data + -0x4); +} + +void +emit__COMPARE_OP_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_STR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 10: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 14: 48 89 df movq %rbx, %rdi + // 17: 4c 89 fe movq %r15, %rsi + // 1a: ff 15 00 00 00 00 callq *(%rip) ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __PyUnicode_Equal@GOTPCREL + // 20: 41 89 c6 movl %eax, %r14d + // 23: 8b 03 movl (%rbx), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 33 js 0x5c <__JIT_ENTRY+0x5c> + // 29: ff c8 decl %eax + // 2b: 89 03 movl %eax, (%rbx) + // 2d: 75 2d jne 0x5c <__JIT_ENTRY+0x5c> + // 2f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 36: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 3d: 48 85 c0 testq %rax, %rax + // 40: 74 11 je 0x53 <__JIT_ENTRY+0x53> + // 42: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 49: 48 89 df movq %rbx, %rdi + // 4c: be 01 00 00 00 movl $0x1, %esi + // 51: ff d0 callq *%rax + // 53: 48 89 df movq %rbx, %rdi + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __PyUnicode_ExactDealloc@GOTPCREL + // 5c: 41 8b 07 movl (%r15), %eax + // 5f: 85 c0 testl %eax, %eax + // 61: 78 34 js 0x97 <__JIT_ENTRY+0x97> + // 63: ff c8 decl %eax + // 65: 41 89 07 movl %eax, (%r15) + // 68: 75 2d jne 0x97 <__JIT_ENTRY+0x97> + // 6a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x71 <__JIT_ENTRY+0x71> + // 000000000000006d: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 71: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 78: 48 85 c0 testq %rax, %rax + // 7b: 74 11 je 0x8e <__JIT_ENTRY+0x8e> + // 7d: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 84: 4c 89 ff movq %r15, %rdi + // 87: be 01 00 00 00 movl $0x1, %esi + // 8c: ff d0 callq *%rax + // 8e: 4c 89 ff movq %r15, %rdi + // 91: ff 15 00 00 00 00 callq *(%rip) ## 0x97 <__JIT_ENTRY+0x97> + // 0000000000000093: X86_64_RELOC_GOT __PyUnicode_ExactDealloc@GOTPCREL + // 97: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 9b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xa2 <__JIT_ENTRY+0xa2> + // 000000000000009e: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // a2: 41 83 c6 07 addl $0x7, %r14d + // a6: 66 44 85 f1 testw %r14w, %cx + // aa: 75 09 jne 0xb5 <__JIT_ENTRY+0xb5> + // ac: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xb3 <__JIT_ENTRY+0xb3> + // 00000000000000af: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // b3: eb 07 jmp 0xbc <__JIT_ENTRY+0xbc> + // b5: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xbc <__JIT_ENTRY+0xbc> + // 00000000000000b8: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // bc: 49 89 4d f0 movq %rcx, -0x10(%r13) + // c0: 49 89 c5 movq %rax, %r13 + // c3: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // c7: 48 83 c4 10 addq $0x10, %rsp + // cb: 5d popq %rbp + // cc: e9 00 00 00 00 jmp 0xd1 <__JIT_ENTRY+0xd1> + // 00000000000000cd: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[204] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x8b, 0x7d, 0xf8, 0x48, 0x89, 0xdf, 0x4c, + 0x89, 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x34, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, + 0x48, 0x26, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8d, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x83, 0xc6, 0x07, 0x66, 0x44, + 0x85, 0xf1, 0x75, 0x09, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x07, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, 0x4c, 0x8b, 0x75, 0xf8, 0x48, + 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: OPARG + // 18: &_PyUnicode_ExactDealloc+0x0 + // 20: &_PyRuntime+0x0 + // 28: &_PyUnicode_Equal+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_PyRuntime); + patch_64(data + 0x28, (uintptr_t)&_PyUnicode_Equal); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x9e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)data + -0x4); +} + +void +emit__CONTAINS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 10: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 4c 89 ff movq %r15, %rdi + // 1c: 48 89 de movq %rbx, %rsi + // 1f: ff 15 00 00 00 00 callq *(%rip) ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PySequence_Contains@GOTPCREL + // 25: 41 89 c6 movl %eax, %r14d + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: 8b 03 movl (%rbx), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 0f js 0x4b <__JIT_ENTRY+0x4b> + // 3c: ff c8 decl %eax + // 3e: 89 03 movl %eax, (%rbx) + // 40: 75 09 jne 0x4b <__JIT_ENTRY+0x4b> + // 42: 48 89 df movq %rbx, %rdi + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 41 8b 07 movl (%r15), %eax + // 4e: 85 c0 testl %eax, %eax + // 50: 78 07 js 0x59 <__JIT_ENTRY+0x59> + // 52: ff c8 decl %eax + // 54: 41 89 07 movl %eax, (%r15) + // 57: 74 37 je 0x90 <__JIT_ENTRY+0x90> + // 59: 45 85 f6 testl %r14d, %r14d + // 5c: 78 40 js 0x9e <__JIT_ENTRY+0x9e> + // 5e: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x65 <__JIT_ENTRY+0x65> + // 0000000000000061: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 65: 41 39 c6 cmpl %eax, %r14d + // 68: 75 09 jne 0x73 <__JIT_ENTRY+0x73> + // 6a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x71 <__JIT_ENTRY+0x71> + // 000000000000006d: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 71: eb 07 jmp 0x7a <__JIT_ENTRY+0x7a> + // 73: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x7a <__JIT_ENTRY+0x7a> + // 0000000000000076: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 7a: 49 89 45 f0 movq %rax, -0x10(%r13) + // 7e: 49 83 c5 f8 addq $-0x8, %r13 + // 82: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 86: 48 83 c4 10 addq $0x10, %rsp + // 8a: 5d popq %rbp + // 8b: e9 00 00 00 00 jmp 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 90: 4c 89 ff movq %r15, %rdi + // 93: ff 15 00 00 00 00 callq *(%rip) ## 0x99 <__JIT_ENTRY+0x99> + // 0000000000000095: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 99: 45 85 f6 testl %r14d, %r14d + // 9c: 79 c0 jns 0x5e <__JIT_ENTRY+0x5e> + // 9e: 49 83 c5 f0 addq $-0x10, %r13 + // a2: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // a6: 48 83 c4 10 addq $0x10, %rsp + // aa: 5d popq %rbp + // ab: e9 00 00 00 00 jmp 0xb0 <__JIT_ENTRY+0xb0> + // 00000000000000ac: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[176] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xde, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, 0xc6, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, + 0x75, 0x09, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, + 0x37, 0x45, 0x85, 0xf6, 0x78, 0x40, 0x0f, 0xb7, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x41, 0x39, 0xc6, + 0x75, 0x09, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0xeb, 0x07, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x45, 0x85, 0xf6, 0x79, 0xc0, 0x49, 0x83, + 0xc5, 0xf0, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: OPARG + // 20: &PySequence_Contains+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&PySequence_Contains); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0x4); + patch_32r(code + 0x8c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x95, (uintptr_t)data + -0x4); + patch_32r(code + 0xac, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CONTAINS_OP_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 48 8b 43 08 movq 0x8(%rbx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 1f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 24: 48 89 df movq %rbx, %rdi + // 27: 4c 89 fe movq %r15, %rsi + // 2a: ff 15 00 00 00 00 callq *(%rip) ## 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_GOT _PyDict_Contains@GOTPCREL + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 41 8b 0f movl (%r15), %ecx + // 41: 85 c9 testl %ecx, %ecx + // 43: 78 16 js 0x5b <__JIT_ENTRY+0x5b> + // 45: ff c9 decl %ecx + // 47: 41 89 0f movl %ecx, (%r15) + // 4a: 75 0f jne 0x5b <__JIT_ENTRY+0x5b> + // 4c: 4c 89 ff movq %r15, %rdi + // 4f: 41 89 c7 movl %eax, %r15d + // 52: ff 15 00 00 00 00 callq *(%rip) ## 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 58: 44 89 f8 movl %r15d, %eax + // 5b: 8b 0b movl (%rbx), %ecx + // 5d: 85 c9 testl %ecx, %ecx + // 5f: 78 06 js 0x67 <__JIT_ENTRY+0x67> + // 61: ff c9 decl %ecx + // 63: 89 0b movl %ecx, (%rbx) + // 65: 74 39 je 0xa0 <__JIT_ENTRY+0xa0> + // 67: 85 c0 testl %eax, %eax + // 69: 78 46 js 0xb1 <__JIT_ENTRY+0xb1> + // 6b: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x72 <__JIT_ENTRY+0x72> + // 000000000000006e: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 72: 39 c8 cmpl %ecx, %eax + // 74: 75 15 jne 0x8b <__JIT_ENTRY+0x8b> + // 76: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x7d <__JIT_ENTRY+0x7d> + // 0000000000000079: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 7d: 49 89 45 f0 movq %rax, -0x10(%r13) + // 81: 49 83 c5 f8 addq $-0x8, %r13 + // 85: 5d popq %rbp + // 86: e9 00 00 00 00 jmp 0x8b <__JIT_ENTRY+0x8b> + // 0000000000000087: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 8b: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x92 <__JIT_ENTRY+0x92> + // 000000000000008e: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 92: 49 89 45 f0 movq %rax, -0x10(%r13) + // 96: 49 83 c5 f8 addq $-0x8, %r13 + // 9a: 5d popq %rbp + // 9b: e9 00 00 00 00 jmp 0xa0 <__JIT_ENTRY+0xa0> + // 000000000000009c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // a0: 48 89 df movq %rbx, %rdi + // a3: 89 c3 movl %eax, %ebx + // a5: ff 15 00 00 00 00 callq *(%rip) ## 0xab <__JIT_ENTRY+0xab> + // 00000000000000a7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ab: 89 d8 movl %ebx, %eax + // ad: 85 c0 testl %eax, %eax + // af: 79 ba jns 0x6b <__JIT_ENTRY+0x6b> + // b1: 49 83 c5 f0 addq $-0x10, %r13 + // b5: 5d popq %rbp + // b6: e9 00 00 00 00 jmp 0xbb <__JIT_ENTRY+0xbb> + // 00000000000000b7: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[187] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x7d, 0xf0, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0x4c, + 0x89, 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, + 0x0f, 0x85, 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x41, + 0x89, 0x0f, 0x75, 0x0f, 0x4c, 0x89, 0xff, 0x41, + 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x89, 0xf8, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x39, 0x85, + 0xc0, 0x78, 0x46, 0x0f, 0xb7, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x39, 0xc8, 0x75, 0x15, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x85, 0xc0, 0x79, + 0xba, 0x49, 0x83, 0xc5, 0xf0, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: OPARG + // 20: &PyDict_Contains+0x0 + // 28: &PyDict_Type+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&PyDict_Contains); + patch_64(data + 0x28, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x24); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_32r(code + 0x87, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8e, (uintptr_t)data + 0x4); + patch_32r(code + 0x9c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xa7, (uintptr_t)data + -0x4); + patch_32r(code + 0xb7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CONTAINS_OP_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_SET.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 48 8b 43 08 movq 0x8(%rbx), %rax + // 10: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT _PySet_Type@GOTPCREL + // 17: 0f 94 c1 sete %cl + // 1a: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT _PyFrozenSet_Type@GOTPCREL + // 21: 0f 94 c0 sete %al + // 24: 08 c8 orb %cl, %al + // 26: 74 67 je 0x8f <__JIT_ENTRY+0x8f> + // 28: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // 2c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 30: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 35: 48 89 df movq %rbx, %rdi + // 38: 4c 89 fe movq %r15, %rsi + // 3b: ff 15 00 00 00 00 callq *(%rip) ## 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_GOT __PySet_Contains@GOTPCREL + // 41: 41 89 c6 movl %eax, %r14d + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 41 8b 07 movl (%r15), %eax + // 55: 85 c0 testl %eax, %eax + // 57: 78 10 js 0x69 <__JIT_ENTRY+0x69> + // 59: ff c8 decl %eax + // 5b: 41 89 07 movl %eax, (%r15) + // 5e: 75 09 jne 0x69 <__JIT_ENTRY+0x69> + // 60: 4c 89 ff movq %r15, %rdi + // 63: ff 15 00 00 00 00 callq *(%rip) ## 0x69 <__JIT_ENTRY+0x69> + // 0000000000000065: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 69: 8b 03 movl (%rbx), %eax + // 6b: 85 c0 testl %eax, %eax + // 6d: 78 06 js 0x75 <__JIT_ENTRY+0x75> + // 6f: ff c8 decl %eax + // 71: 89 03 movl %eax, (%rbx) + // 73: 74 41 je 0xb6 <__JIT_ENTRY+0xb6> + // 75: 45 85 f6 testl %r14d, %r14d + // 78: 78 4a js 0xc4 <__JIT_ENTRY+0xc4> + // 7a: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x81 <__JIT_ENTRY+0x81> + // 000000000000007d: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 81: 41 39 c6 cmpl %eax, %r14d + // 84: 75 13 jne 0x99 <__JIT_ENTRY+0x99> + // 86: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x8d <__JIT_ENTRY+0x8d> + // 0000000000000089: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 8d: eb 11 jmp 0xa0 <__JIT_ENTRY+0xa0> + // 8f: 48 83 c4 10 addq $0x10, %rsp + // 93: 5d popq %rbp + // 94: e9 00 00 00 00 jmp 0x99 <__JIT_ENTRY+0x99> + // 0000000000000095: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 99: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xa0 <__JIT_ENTRY+0xa0> + // 000000000000009c: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // a0: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // a4: 49 89 45 f0 movq %rax, -0x10(%r13) + // a8: 49 83 c5 f8 addq $-0x8, %r13 + // ac: 48 83 c4 10 addq $0x10, %rsp + // b0: 5d popq %rbp + // b1: e9 00 00 00 00 jmp 0xb6 <__JIT_ENTRY+0xb6> + // 00000000000000b2: X86_64_RELOC_BRANCH __JIT_CONTINUE + // b6: 48 89 df movq %rbx, %rdi + // b9: ff 15 00 00 00 00 callq *(%rip) ## 0xbf <__JIT_ENTRY+0xbf> + // 00000000000000bb: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // bf: 45 85 f6 testl %r14d, %r14d + // c2: 79 b6 jns 0x7a <__JIT_ENTRY+0x7a> + // c4: 49 83 c5 f0 addq $-0x10, %r13 + // c8: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // cc: 48 83 c4 10 addq $0x10, %rsp + // d0: 5d popq %rbp + // d1: e9 00 00 00 00 jmp 0xd6 <__JIT_ENTRY+0xd6> + // 00000000000000d2: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[214] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x43, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x94, 0xc1, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x94, 0xc0, 0x08, 0xc8, 0x74, 0x67, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0x4c, 0x89, 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x41, 0x45, 0x85, 0xf6, + 0x78, 0x4a, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x39, 0xc6, 0x75, 0x13, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x11, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x8b, 0x75, 0xf8, 0x49, 0x89, 0x45, 0xf0, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x85, 0xf6, 0x79, 0xb6, 0x49, 0x83, 0xc5, 0xf0, + 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: OPARG + // 20: &_PySet_Contains+0x0 + // 28: &PyFrozenSet_Type+0x0 + // 30: &PySet_Type+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_PySet_Contains); + patch_64(data + 0x28, (uintptr_t)&PyFrozenSet_Type); + patch_64(data + 0x30, (uintptr_t)&PySet_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0xc); + patch_32r(code + 0x95, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x9c, (uintptr_t)data + 0x4); + patch_32r(code + 0xb2, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + -0x4); + patch_32r(code + 0xd2, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__CONVERT_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONVERT_VALUE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT_LOAD __PyEval_ConversionFuncs@GOTPCREL + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 89 df movq %rbx, %rdi + // 1e: ff 14 c1 callq *(%rcx,%rax,8) + // 21: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 27: 8b 0b movl (%rbx), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 06 js 0x33 <__JIT_ENTRY+0x33> + // 2d: ff c9 decl %ecx + // 2f: 89 0b movl %ecx, (%rbx) + // 31: 74 21 je 0x54 <__JIT_ENTRY+0x54> + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 48 85 c0 testq %rax, %rax + // 44: 74 30 je 0x76 <__JIT_ENTRY+0x76> + // 46: 49 89 45 00 movq %rax, (%r13) + // 4a: 49 83 c5 08 addq $0x8, %r13 + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 54: 48 89 df movq %rbx, %rdi + // 57: 48 89 c3 movq %rax, %rbx + // 5a: ff 15 00 00 00 00 callq *(%rip) ## 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 60: 48 89 d8 movq %rbx, %rax + // 63: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 68: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 71: 48 85 c0 testq %rax, %rax + // 74: 75 d0 jne 0x46 <__JIT_ENTRY+0x46> + // 76: 5d popq %rbp + // 77: e9 00 00 00 00 jmp 0x7c <__JIT_ENTRY+0x7c> + // 0000000000000078: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[124] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x14, + 0xc1, 0x49, 0x83, 0x44, 0x24, 0x40, 0xf8, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0b, 0x74, 0x21, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x30, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x48, + 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x75, 0xd0, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_ConversionFuncs+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ConversionFuncs); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_32r(code + 0x50, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + -0x4); + patch_32r(code + 0x78, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__COPY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: c1 e0 03 shll $0x3, %eax + // e: 4c 89 e9 movq %r13, %rcx + // 11: 48 29 c1 subq %rax, %rcx + // 14: 48 8b 01 movq (%rcx), %rax + // 17: 8b 08 movl (%rax), %ecx + // 19: 85 c9 testl %ecx, %ecx + // 1b: 78 04 js 0x21 <__JIT_ENTRY+0x21> + // 1d: ff c1 incl %ecx + // 1f: 89 08 movl %ecx, (%rax) + // 21: 49 89 45 00 movq %rax, (%r13) + // 25: 49 83 c5 08 addq $0x8, %r13 + // 29: 5d popq %rbp + // 2a: e9 00 00 00 00 jmp 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[42] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, + 0xe9, 0x48, 0x29, 0xc1, 0x48, 0x8b, 0x01, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__COPY_FREE_VARS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY_FREE_VARS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 66 85 c0 testw %ax, %ax + // e: 74 45 je 0x55 <__JIT_ENTRY+0x55> + // 10: 49 8b 04 24 movq (%r12), %rax + // 14: 49 8b 4c 24 10 movq 0x10(%r12), %rcx + // 19: 8b 40 48 movl 0x48(%rax), %eax + // 1c: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 23: 0f b7 f2 movzwl %dx, %esi + // 26: 29 f0 subl %esi, %eax + // 28: 48 8b 49 48 movq 0x48(%rcx), %rcx + // 2c: 48 98 cltq + // 2e: 0f b7 d2 movzwl %dx, %edx + // 31: 66 83 fa 01 cmpw $0x1, %dx + // 35: 75 24 jne 0x5b <__JIT_ENTRY+0x5b> + // 37: 31 f6 xorl %esi, %esi + // 39: f6 c2 01 testb $0x1, %dl + // 3c: 74 17 je 0x55 <__JIT_ENTRY+0x55> + // 3e: 48 8b 4c f1 18 movq 0x18(%rcx,%rsi,8), %rcx + // 43: 48 01 f0 addq %rsi, %rax + // 46: 8b 11 movl (%rcx), %edx + // 48: 85 d2 testl %edx, %edx + // 4a: 78 04 js 0x50 <__JIT_ENTRY+0x50> + // 4c: ff c2 incl %edx + // 4e: 89 11 movl %edx, (%rcx) + // 50: 49 89 4c c4 50 movq %rcx, 0x50(%r12,%rax,8) + // 55: 5d popq %rbp + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5b: 89 d7 movl %edx, %edi + // 5d: 83 e7 fe andl $-0x2, %edi + // 60: 4d 8d 04 c4 leaq (%r12,%rax,8), %r8 + // 64: 49 83 c0 58 addq $0x58, %r8 + // 68: 31 f6 xorl %esi, %esi + // 6a: eb 11 jmp 0x7d <__JIT_ENTRY+0x7d> + // 6c: 0f 1f 40 00 nopl (%rax) + // 70: 4d 89 0c f0 movq %r9, (%r8,%rsi,8) + // 74: 48 83 c6 02 addq $0x2, %rsi + // 78: 48 39 f7 cmpq %rsi, %rdi + // 7b: 74 bc je 0x39 <__JIT_ENTRY+0x39> + // 7d: 4c 8b 4c f1 18 movq 0x18(%rcx,%rsi,8), %r9 + // 82: 41 8b 19 movl (%r9), %ebx + // 85: 85 db testl %ebx, %ebx + // 87: 78 05 js 0x8e <__JIT_ENTRY+0x8e> + // 89: ff c3 incl %ebx + // 8b: 41 89 19 movl %ebx, (%r9) + // 8e: 4d 89 4c f0 f8 movq %r9, -0x8(%r8,%rsi,8) + // 93: 4c 8b 4c f1 20 movq 0x20(%rcx,%rsi,8), %r9 + // 98: 41 8b 19 movl (%r9), %ebx + // 9b: 85 db testl %ebx, %ebx + // 9d: 78 d1 js 0x70 <__JIT_ENTRY+0x70> + // 9f: ff c3 incl %ebx + // a1: 41 89 19 movl %ebx, (%r9) + // a4: eb ca jmp 0x70 <__JIT_ENTRY+0x70> + const unsigned char code_body[166] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x45, + 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x4c, 0x24, + 0x10, 0x8b, 0x40, 0x48, 0x48, 0x8b, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf2, 0x29, 0xf0, + 0x48, 0x8b, 0x49, 0x48, 0x48, 0x98, 0x0f, 0xb7, + 0xd2, 0x66, 0x83, 0xfa, 0x01, 0x75, 0x24, 0x31, + 0xf6, 0xf6, 0xc2, 0x01, 0x74, 0x17, 0x48, 0x8b, + 0x4c, 0xf1, 0x18, 0x48, 0x01, 0xf0, 0x8b, 0x11, + 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, 0x11, + 0x49, 0x89, 0x4c, 0xc4, 0x50, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd7, 0x83, 0xe7, 0xfe, + 0x4d, 0x8d, 0x04, 0xc4, 0x49, 0x83, 0xc0, 0x58, + 0x31, 0xf6, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x4d, 0x89, 0x0c, 0xf0, 0x48, 0x83, 0xc6, 0x02, + 0x48, 0x39, 0xf7, 0x74, 0xbc, 0x4c, 0x8b, 0x4c, + 0xf1, 0x18, 0x41, 0x8b, 0x19, 0x85, 0xdb, 0x78, + 0x05, 0xff, 0xc3, 0x41, 0x89, 0x19, 0x4d, 0x89, + 0x4c, 0xf0, 0xf8, 0x4c, 0x8b, 0x4c, 0xf1, 0x20, + 0x41, 0x8b, 0x19, 0x85, 0xdb, 0x78, 0xd1, 0xff, + 0xc3, 0x41, 0x89, 0x19, 0xeb, 0xca, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + -0x4); + patch_32r(code + 0x57, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__CREATE_INIT_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CREATE_INIT_FRAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 e8 movq %r13, %rax + // b: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 13: 42 8d 14 c5 00 00 00 00 leal (,%r8,8), %edx + // 1b: 4c 89 e9 movq %r13, %rcx + // 1e: 48 29 d1 subq %rdx, %rcx + // 21: 44 89 c2 movl %r8d, %edx + // 24: f7 d2 notl %edx + // 26: 48 63 f2 movslq %edx, %rsi + // 29: ba fe ff ff ff movl $0xfffffffe, %edx ## imm = 0xFFFFFFFE + // 2e: 44 29 c2 subl %r8d, %edx + // 31: 4c 63 ea movslq %edx, %r13 + // 34: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 39: 49 8b 9e f0 00 00 00 movq 0xf0(%r14), %rbx + // 40: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x47 <__JIT_ENTRY+0x47> + // 0000000000000043: X86_64_RELOC_GOT_LOAD __Py_InitCleanup@GOTPCREL + // 47: 48 63 7a 4c movslq 0x4c(%rdx), %rdi + // 4b: 48 8d 3c fb leaq (%rbx,%rdi,8), %rdi + // 4f: 49 89 be f0 00 00 00 movq %rdi, 0xf0(%r14) + // 56: 4c 89 63 08 movq %r12, 0x8(%rbx) + // 5a: 48 8b 3d 00 00 00 00 movq (%rip), %rdi ## 0x61 <__JIT_ENTRY+0x61> + // 000000000000005d: X86_64_RELOC_GOT_LOAD __Py_NoneStruct@GOTPCREL + // 61: 48 89 7b 10 movq %rdi, 0x10(%rbx) + // 65: 48 89 13 movq %rdx, (%rbx) + // 68: 0f 57 c0 xorps %xmm0, %xmm0 + // 6b: 0f 11 43 28 movups %xmm0, 0x28(%rbx) + // 6f: 48 63 7a 48 movslq 0x48(%rdx), %rdi + // 73: 48 8d 3c fb leaq (%rbx,%rdi,8), %rdi + // 77: 48 83 c7 58 addq $0x58, %rdi + // 7b: 48 89 7b 40 movq %rdi, 0x40(%rbx) + // 7f: 48 81 c2 d0 00 00 00 addq $0xd0, %rdx + // 86: 48 89 53 38 movq %rdx, 0x38(%rbx) + // 8a: c7 43 48 00 00 00 00 movl $0x0, 0x48(%rbx) + // 91: 49 8b 54 24 40 movq 0x40(%r12), %rdx + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: 48 8b 34 f0 movq (%rax,%rsi,8), %rsi + // a3: 8b 3e movl (%rsi), %edi + // a5: 85 ff testl %edi, %edi + // a7: 78 04 js 0xad <__JIT_ENTRY+0xad> + // a9: ff c7 incl %edi + // ab: 89 3e movl %edi, (%rsi) + // ad: 48 89 73 50 movq %rsi, 0x50(%rbx) + // b1: 49 89 54 24 40 movq %rdx, 0x40(%r12) + // b6: 48 83 c1 f8 addq $-0x8, %rcx + // ba: 41 ff c0 incl %r8d + // bd: 4a 8b 34 e8 movq (%rax,%r13,8), %rsi + // c1: 49 c1 e5 03 shlq $0x3, %r13 + // c5: 48 89 1c 24 movq %rbx, (%rsp) + // c9: 4c 89 f7 movq %r14, %rdi + // cc: 31 d2 xorl %edx, %edx + // ce: 45 31 c9 xorl %r9d, %r9d + // d1: ff 15 00 00 00 00 callq *(%rip) ## 0xd7 <__JIT_ENTRY+0xd7> + // 00000000000000d3: X86_64_RELOC_GOT __PyEvalFramePushAndInit@GOTPCREL + // d7: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // dc: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // e5: 48 85 c0 testq %rax, %rax + // e8: 74 1e je 0x108 <__JIT_ENTRY+0x108> + // ea: 66 41 c7 44 24 48 04 00 movw $0x4, 0x48(%r12) + // f2: 41 ff 4e 2c decl 0x2c(%r14) + // f6: 49 89 45 00 movq %rax, (%r13) + // fa: 49 83 c5 08 addq $0x8, %r13 + // fe: 48 83 c4 10 addq $0x10, %rsp + // 102: 5d popq %rbp + // 103: e9 00 00 00 00 jmp 0x108 <__JIT_ENTRY+0x108> + // 0000000000000104: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 108: 4c 89 f7 movq %r14, %rdi + // 10b: 48 89 de movq %rbx, %rsi + // 10e: ff 15 00 00 00 00 callq *(%rip) ## 0x114 <__JIT_ENTRY+0x114> + // 0000000000000110: X86_64_RELOC_GOT __PyEval_FrameClearAndPop@GOTPCREL + // 114: 48 83 c4 10 addq $0x10, %rsp + // 118: 5d popq %rbp + // 119: e9 00 00 00 00 jmp 0x11e <__JIT_ENTRY+0x11e> + // 000000000000011a: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[286] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xe8, 0x44, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x42, 0x8d, 0x14, 0xc5, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xe9, 0x48, 0x29, + 0xd1, 0x44, 0x89, 0xc2, 0xf7, 0xd2, 0x48, 0x63, + 0xf2, 0xba, 0xfe, 0xff, 0xff, 0xff, 0x44, 0x29, + 0xc2, 0x4c, 0x63, 0xea, 0x49, 0x89, 0x44, 0x24, + 0x40, 0x49, 0x8b, 0x9e, 0xf0, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x7a, 0x4c, 0x48, 0x8d, 0x3c, 0xfb, 0x49, + 0x89, 0xbe, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x63, 0x08, 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x7b, 0x10, 0x48, 0x89, 0x13, + 0x0f, 0x57, 0xc0, 0x0f, 0x11, 0x43, 0x28, 0x48, + 0x63, 0x7a, 0x48, 0x48, 0x8d, 0x3c, 0xfb, 0x48, + 0x83, 0xc7, 0x58, 0x48, 0x89, 0x7b, 0x40, 0x48, + 0x81, 0xc2, 0xd0, 0x00, 0x00, 0x00, 0x48, 0x89, + 0x53, 0x38, 0xc7, 0x43, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x54, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x34, 0xf0, 0x8b, 0x3e, 0x85, 0xff, 0x78, + 0x04, 0xff, 0xc7, 0x89, 0x3e, 0x48, 0x89, 0x73, + 0x50, 0x49, 0x89, 0x54, 0x24, 0x40, 0x48, 0x83, + 0xc1, 0xf8, 0x41, 0xff, 0xc0, 0x4a, 0x8b, 0x34, + 0xe8, 0x49, 0xc1, 0xe5, 0x03, 0x48, 0x89, 0x1c, + 0x24, 0x4c, 0x89, 0xf7, 0x31, 0xd2, 0x45, 0x31, + 0xc9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x03, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x1e, 0x66, 0x41, 0xc7, 0x44, 0x24, 0x48, + 0x04, 0x00, 0x41, 0xff, 0x4e, 0x2c, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xde, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_FrameClearAndPop+0x0 + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &_Py_InitCleanup+0x0 + // 20: OPARG + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FrameClearAndPop); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x20, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0x4); + patch_32r(code + 0x104, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x110, (uintptr_t)data + -0x4); + patch_32r(code + 0x11a, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_ATTR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 48 8b 40 20 movq 0x20(%rax), %rax + // 10: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 17: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 48 89 df movq %rbx, %rdi + // 24: ff 15 00 00 00 00 callq *(%rip) ## 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_GOT _PyObject_DelAttr@GOTPCREL + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 8b 0b movl (%rbx), %ecx + // 3a: 85 c9 testl %ecx, %ecx + // 3c: 78 06 js 0x44 <__JIT_ENTRY+0x44> + // 3e: ff c9 decl %ecx + // 40: 89 0b movl %ecx, (%rbx) + // 42: 74 0e je 0x52 <__JIT_ENTRY+0x52> + // 44: 49 83 c5 f8 addq $-0x8, %r13 + // 48: 85 c0 testl %eax, %eax + // 4a: 74 1b je 0x67 <__JIT_ENTRY+0x67> + // 4c: 5d popq %rbp + // 4d: e9 00 00 00 00 jmp 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 52: 48 89 df movq %rbx, %rdi + // 55: 89 c3 movl %eax, %ebx + // 57: ff 15 00 00 00 00 callq *(%rip) ## 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5d: 89 d8 movl %ebx, %eax + // 5f: 49 83 c5 f8 addq $-0x8, %r13 + // 63: 85 c0 testl %eax, %eax + // 65: 75 e5 jne 0x4c <__JIT_ENTRY+0x4c> + // 67: 5d popq %rbp + // 68: e9 00 00 00 00 jmp 0x6d <__JIT_ENTRY+0x6d> + // 0000000000000069: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[104] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x20, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x74, 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0b, 0x74, 0x0e, 0x49, 0x83, 0xc5, 0xf8, + 0x85, 0xc0, 0x74, 0x1b, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x49, + 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x75, 0xe5, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_DelAttr+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_DelAttr); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x4); + patch_32r(code + 0x4e, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + -0x4); +} + +void +emit__DELETE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_DEREF.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 10: 48 8b 78 10 movq 0x10(%rax), %rdi + // 14: 48 c7 40 10 00 00 00 00 movq $0x0, 0x10(%rax) + // 1c: 48 85 ff testq %rdi, %rdi + // 1f: 74 25 je 0x46 <__JIT_ENTRY+0x46> + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 8b 07 movl (%rdi), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 06 js 0x32 <__JIT_ENTRY+0x32> + // 2c: ff c8 decl %eax + // 2e: 89 07 movl %eax, (%rdi) + // 30: 74 41 je 0x73 <__JIT_ENTRY+0x73> + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 5d popq %rbp + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 0000000000000042: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 46: 0f b7 15 00 00 00 00 movzwl (%rip), %edx ## 0x4d <__JIT_ENTRY+0x4d> + // 0000000000000049: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 4d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 52: 49 8b 34 24 movq (%r12), %rsi + // 56: 4c 89 f7 movq %r14, %rdi + // 59: ff 15 00 00 00 00 callq *(%rip) ## 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_GOT __PyEval_FormatExcUnbound@GOTPCREL + // 5f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 64: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6d: 5d popq %rbp + // 6e: e9 00 00 00 00 jmp 0x73 <__JIT_ENTRY+0x73> + // 000000000000006f: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 73: ff 15 00 00 00 00 callq *(%rip) ## 0x79 <__JIT_ENTRY+0x79> + // 0000000000000075: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 79: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 87: 5d popq %rbp + // 88: e9 00 00 00 00 jmp 0x8d <__JIT_ENTRY+0x8d> + // 0000000000000089: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[136] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x44, 0xc4, 0x50, + 0x48, 0x8b, 0x78, 0x10, 0x48, 0xc7, 0x40, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x25, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x41, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x49, 0x8b, 0x34, 0x24, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_FormatExcUnbound+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_32r(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x49, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0x4); + patch_32r(code + 0x6f, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + -0x4); +} + +void +emit__DELETE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_FAST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 0f b7 f0 movzwl %ax, %esi + // e: 0f b7 c0 movzwl %ax, %eax + // 11: 49 8b 7c c4 50 movq 0x50(%r12,%rax,8), %rdi + // 16: 48 85 ff testq %rdi, %rdi + // 19: 74 2e je 0x49 <__JIT_ENTRY+0x49> + // 1b: 49 c7 44 f4 50 00 00 00 00 movq $0x0, 0x50(%r12,%rsi,8) + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 8b 07 movl (%rdi), %eax + // 2b: 85 c0 testl %eax, %eax + // 2d: 78 06 js 0x35 <__JIT_ENTRY+0x35> + // 2f: ff c8 decl %eax + // 31: 89 07 movl %eax, (%rdi) + // 33: 74 5b je 0x90 <__JIT_ENTRY+0x90> + // 35: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 43: 5d popq %rbp + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 49: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4e: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x55 <__JIT_ENTRY+0x55> + // 0000000000000051: X86_64_RELOC_GOT_LOAD _PyExc_UnboundLocalError@GOTPCREL + // 55: 48 8b 18 movq (%rax), %rbx + // 58: 49 8b 04 24 movq (%r12), %rax + // 5c: 48 8b 78 60 movq 0x60(%rax), %rdi + // 60: ff 15 00 00 00 00 callq *(%rip) ## 0x66 <__JIT_ENTRY+0x66> + // 0000000000000062: X86_64_RELOC_GOT _PyTuple_GetItem@GOTPCREL + // 66: 48 8d 15 3d 00 00 00 leaq 0x3d(%rip), %rdx ## 0xaa <__JIT_ENTRY+0xaa> + // 0000000000000069: X86_64_RELOC_SIGNED __cstring + // 6d: 4c 89 f7 movq %r14, %rdi + // 70: 48 89 de movq %rbx, %rsi + // 73: 48 89 c1 movq %rax, %rcx + // 76: ff 15 00 00 00 00 callq *(%rip) ## 0x7c <__JIT_ENTRY+0x7c> + // 0000000000000078: X86_64_RELOC_GOT __PyEval_FormatExcCheckArg@GOTPCREL + // 7c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 81: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8a: 5d popq %rbp + // 8b: e9 00 00 00 00 jmp 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 90: ff 15 00 00 00 00 callq *(%rip) ## 0x96 <__JIT_ENTRY+0x96> + // 0000000000000092: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 96: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a4: 5d popq %rbp + // a5: e9 00 00 00 00 jmp 0xaa <__JIT_ENTRY+0xaa> + // 00000000000000a6: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[165] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf0, 0x0f, 0xb7, + 0xc0, 0x49, 0x8b, 0x7c, 0xc4, 0x50, 0x48, 0x85, + 0xff, 0x74, 0x2e, 0x49, 0xc7, 0x44, 0xf4, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x07, 0x74, 0x5b, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x18, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x78, 0x60, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, + 0x15, 0x3d, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, + 0x48, 0x89, 0xde, 0x48, 0x89, 0xc1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: &_Py_Dealloc+0x0 + // 58: &_PyEval_FormatExcCheckArg+0x0 + // 60: &PyTuple_GetItem+0x0 + // 68: &PyExc_UnboundLocalError+0x0 + // 70: OPARG + const unsigned char data_body[120] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x58, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x60, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x68, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x70, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x6c); + patch_32r(code + 0x45, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x62, (uintptr_t)data + 0x5c); + patch_32r(code + 0x69, (uintptr_t)data + 0xe3); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x54); + patch_32r(code + 0x8c, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x92, (uintptr_t)data + 0x4c); +} + +void +emit__DELETE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_GLOBAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 49 8b 7c 24 18 movq 0x18(%r12), %rdi + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 18: 48 8b 5c c8 18 movq 0x18(%rax,%rcx,8), %rbx + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 89 de movq %rbx, %rsi + // 25: 31 d2 xorl %edx, %edx + // 27: ff 15 00 00 00 00 callq *(%rip) ## 0x2d <__JIT_ENTRY+0x2d> + // 0000000000000029: X86_64_RELOC_GOT _PyDict_Pop@GOTPCREL + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 85 c0 testl %eax, %eax + // 3d: 78 08 js 0x47 <__JIT_ENTRY+0x47> + // 3f: 74 0c je 0x4d <__JIT_ENTRY+0x4d> + // 41: 5d popq %rbp + // 42: e9 00 00 00 00 jmp 0x47 <__JIT_ENTRY+0x47> + // 0000000000000043: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 47: 5d popq %rbp + // 48: e9 00 00 00 00 jmp 0x4d <__JIT_ENTRY+0x4d> + // 0000000000000049: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 4d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 52: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_GOT_LOAD _PyExc_NameError@GOTPCREL + // 59: 48 8b 30 movq (%rax), %rsi + // 5c: 48 8d 15 20 00 00 00 leaq 0x20(%rip), %rdx ## 0x83 <__JIT_ENTRY+0x83> + // 000000000000005f: X86_64_RELOC_SIGNED __cstring + // 63: 4c 89 f7 movq %r14, %rdi + // 66: 48 89 d9 movq %rbx, %rcx + // 69: ff 15 00 00 00 00 callq *(%rip) ## 0x6f <__JIT_ENTRY+0x6f> + // 000000000000006b: X86_64_RELOC_GOT __PyEval_FormatExcCheckArg@GOTPCREL + // 6f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 74: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7d: 5d popq %rbp + // 7e: e9 00 00 00 00 jmp 0x83 <__JIT_ENTRY+0x83> + // 000000000000007f: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[131] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x7c, 0x24, 0x18, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x5c, 0xc8, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xde, 0x31, 0xd2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x08, 0x74, + 0x0c, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x20, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x48, 0x89, + 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: "name '%.200s' is not defined\x00" + // 1d: 00 00 00 + // 20: &_PyEval_FormatExcCheckArg+0x0 + // 28: &PyExc_NameError+0x0 + // 30: &PyDict_Pop+0x0 + // 38: OPARG + const unsigned char data_body[64] = { + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 0x2e, + 0x32, 0x30, 0x30, 0x73, 0x27, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x28, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x30, (uintptr_t)&PyDict_Pop); + patch_64(data + 0x38, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x2c); + patch_32r(code + 0x43, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x49, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0x24); + patch_32r(code + 0x5f, (uintptr_t)data + 0x9f); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)data + 0x1c); + patch_32r(code + 0x7f, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_NAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 18: 48 8b 5c c8 18 movq 0x18(%rax,%rcx,8), %rbx + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 85 ff testq %rdi, %rdi + // 25: 74 51 je 0x78 <__JIT_ENTRY+0x78> + // 27: 48 89 de movq %rbx, %rsi + // 2a: ff 15 00 00 00 00 callq *(%rip) ## 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_GOT _PyObject_DelItem@GOTPCREL + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 85 c0 testl %eax, %eax + // 40: 74 69 je 0xab <__JIT_ENTRY+0xab> + // 42: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 47: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_GOT_LOAD _PyExc_NameError@GOTPCREL + // 4e: 48 8b 30 movq (%rax), %rsi + // 51: 48 8d 15 74 00 00 00 leaq 0x74(%rip), %rdx ## 0xcc <__JIT_ENTRY+0xcc> + // 0000000000000054: X86_64_RELOC_SIGNED __cstring + // 58: 4c 89 f7 movq %r14, %rdi + // 5b: 48 89 d9 movq %rbx, %rcx + // 5e: ff 15 00 00 00 00 callq *(%rip) ## 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_GOT __PyEval_FormatExcCheckArg@GOTPCREL + // 64: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 69: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 72: 5d popq %rbp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 0000000000000074: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 78: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_GOT_LOAD _PyExc_SystemError@GOTPCREL + // 7f: 48 8b 30 movq (%rax), %rsi + // 82: 48 8d 15 28 00 00 00 leaq 0x28(%rip), %rdx ## 0xb1 <__JIT_ENTRY+0xb1> + // 0000000000000085: X86_64_RELOC_SIGNED __cstring + // 89: 4c 89 f7 movq %r14, %rdi + // 8c: 48 89 d9 movq %rbx, %rcx + // 8f: 31 c0 xorl %eax, %eax + // 91: ff 15 00 00 00 00 callq *(%rip) ## 0x97 <__JIT_ENTRY+0x97> + // 0000000000000093: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // 97: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a5: 5d popq %rbp + // a6: e9 00 00 00 00 jmp 0xab <__JIT_ENTRY+0xab> + // 00000000000000a7: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // ab: 5d popq %rbp + // ac: e9 00 00 00 00 jmp 0xb1 <__JIT_ENTRY+0xb1> + // 00000000000000ad: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[172] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x7c, 0x24, 0x28, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x5c, 0xc8, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x85, 0xff, 0x74, 0x51, 0x48, + 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x69, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x30, 0x48, 0x8d, 0x15, 0x74, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x28, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xd9, 0x31, + 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: "no locals when deleting %R\x00name '%.200s' is not defined\x00" + // 38: &_PyErr_Format+0x0 + // 40: &PyExc_SystemError+0x0 + // 48: &_PyEval_FormatExcCheckArg+0x0 + // 50: &PyExc_NameError+0x0 + // 58: &PyObject_DelItem+0x0 + // 60: OPARG + const unsigned char data_body[104] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x52, 0x00, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x38, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x40, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x48, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x50, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x58, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x60, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x4c); + patch_32r(code + 0x54, (uintptr_t)data + 0x121); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x44); + patch_32r(code + 0x74, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x3c); + patch_32r(code + 0x85, (uintptr_t)data + 0xd5); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + 0x34); + patch_32r(code + 0xa7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DELETE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_SUBSCR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 4c 89 ff movq %r15, %rdi + // 1c: 48 89 de movq %rbx, %rsi + // 1f: ff 15 00 00 00 00 callq *(%rip) ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyObject_DelItem@GOTPCREL + // 25: 41 89 c6 movl %eax, %r14d + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: 41 8b 07 movl (%r15), %eax + // 39: 85 c0 testl %eax, %eax + // 3b: 78 10 js 0x4d <__JIT_ENTRY+0x4d> + // 3d: ff c8 decl %eax + // 3f: 41 89 07 movl %eax, (%r15) + // 42: 75 09 jne 0x4d <__JIT_ENTRY+0x4d> + // 44: 4c 89 ff movq %r15, %rdi + // 47: ff 15 00 00 00 00 callq *(%rip) ## 0x4d <__JIT_ENTRY+0x4d> + // 0000000000000049: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4d: 8b 03 movl (%rbx), %eax + // 4f: 85 c0 testl %eax, %eax + // 51: 78 06 js 0x59 <__JIT_ENTRY+0x59> + // 53: ff c8 decl %eax + // 55: 89 03 movl %eax, (%rbx) + // 57: 74 17 je 0x70 <__JIT_ENTRY+0x70> + // 59: 49 83 c5 f0 addq $-0x10, %r13 + // 5d: 45 85 f6 testl %r14d, %r14d + // 60: 74 20 je 0x82 <__JIT_ENTRY+0x82> + // 62: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 66: 48 83 c4 10 addq $0x10, %rsp + // 6a: 5d popq %rbp + // 6b: e9 00 00 00 00 jmp 0x70 <__JIT_ENTRY+0x70> + // 000000000000006c: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 70: 48 89 df movq %rbx, %rdi + // 73: ff 15 00 00 00 00 callq *(%rip) ## 0x79 <__JIT_ENTRY+0x79> + // 0000000000000075: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 79: 49 83 c5 f0 addq $-0x10, %r13 + // 7d: 45 85 f6 testl %r14d, %r14d + // 80: 75 e0 jne 0x62 <__JIT_ENTRY+0x62> + // 82: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 86: 48 83 c4 10 addq $0x10, %rsp + // 8a: 5d popq %rbp + // 8b: e9 00 00 00 00 jmp 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[139] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xde, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, 0xc6, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x17, 0x49, 0x83, 0xc5, 0xf0, 0x45, 0x85, 0xf6, + 0x74, 0x20, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x45, 0x85, 0xf6, + 0x75, 0xe0, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_DelItem+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_DelItem); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x49, (uintptr_t)data + -0x4); + patch_32r(code + 0x6c, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + -0x4); +} + +void +emit__DEOPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DEOPT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // b: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 49 8b 04 24 movq (%r12), %rax + // 1b: 8b 0d 00 00 00 00 movl (%rip), %ecx ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __JIT_TARGET@GOTPCREL + // 21: 48 8d 04 48 leaq (%rax,%rcx,2), %rax + // 25: 48 05 d0 00 00 00 addq $0xd0, %rax + // 2b: 5d popq %rbp + // 2c: c3 retq + const unsigned char code_body[45] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, 0x10, 0x01, + 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, + 0x8b, 0x04, 0x24, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8d, 0x04, 0x48, 0x48, 0x05, 0xd0, + 0x00, 0x00, 0x00, 0x5d, 0xc3, + }; + // 0: TARGET + // 8: EXECUTOR + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->target); + patch_64(data + 0x8, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); +} + +void +emit__DICT_MERGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_MERGE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 5d f8 movq -0x8(%r13), %rbx + // f: b9 fc ff ff ff movl $0xfffffffc, %ecx ## imm = 0xFFFFFFFC + // 14: 29 c1 subl %eax, %ecx + // 16: f7 d0 notl %eax + // 18: 48 98 cltq + // 1a: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 1f: 48 63 c1 movslq %ecx, %rax + // 22: 4d 8b 7c c5 00 movq (%r13,%rax,8), %r15 + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 48 89 de movq %rbx, %rsi + // 2f: ba 02 00 00 00 movl $0x2, %edx + // 34: ff 15 00 00 00 00 callq *(%rip) ## 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_GOT __PyDict_MergeEx@GOTPCREL + // 3a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 48: 85 c0 testl %eax, %eax + // 4a: 78 16 js 0x62 <__JIT_ENTRY+0x62> + // 4c: 8b 03 movl (%rbx), %eax + // 4e: 85 c0 testl %eax, %eax + // 50: 78 06 js 0x58 <__JIT_ENTRY+0x58> + // 52: ff c8 decl %eax + // 54: 89 03 movl %eax, (%rbx) + // 56: 74 42 je 0x9a <__JIT_ENTRY+0x9a> + // 58: 49 83 c5 f8 addq $-0x8, %r13 + // 5c: 5d popq %rbp + // 5d: e9 00 00 00 00 jmp 0x62 <__JIT_ENTRY+0x62> + // 000000000000005e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 62: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 67: 4c 89 f7 movq %r14, %rdi + // 6a: 4c 89 fe movq %r15, %rsi + // 6d: 48 89 da movq %rbx, %rdx + // 70: ff 15 00 00 00 00 callq *(%rip) ## 0x76 <__JIT_ENTRY+0x76> + // 0000000000000072: X86_64_RELOC_GOT __PyEval_FormatKwargsError@GOTPCREL + // 76: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 84: 8b 03 movl (%rbx), %eax + // 86: 85 c0 testl %eax, %eax + // 88: 78 06 js 0x90 <__JIT_ENTRY+0x90> + // 8a: ff c8 decl %eax + // 8c: 89 03 movl %eax, (%rbx) + // 8e: 74 1d je 0xad <__JIT_ENTRY+0xad> + // 90: 49 83 c5 f8 addq $-0x8, %r13 + // 94: 5d popq %rbp + // 95: e9 00 00 00 00 jmp 0x9a <__JIT_ENTRY+0x9a> + // 0000000000000096: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 9a: 48 89 df movq %rbx, %rdi + // 9d: ff 15 00 00 00 00 callq *(%rip) ## 0xa3 <__JIT_ENTRY+0xa3> + // 000000000000009f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a3: 49 83 c5 f8 addq $-0x8, %r13 + // a7: 5d popq %rbp + // a8: e9 00 00 00 00 jmp 0xad <__JIT_ENTRY+0xad> + // 00000000000000a9: X86_64_RELOC_BRANCH __JIT_CONTINUE + // ad: 48 89 df movq %rbx, %rdi + // b0: ff 15 00 00 00 00 callq *(%rip) ## 0xb6 <__JIT_ENTRY+0xb6> + // 00000000000000b2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b6: 49 83 c5 f8 addq $-0x8, %r13 + // ba: 5d popq %rbp + // bb: e9 00 00 00 00 jmp 0xc0 <__JIT_ENTRY+0xc0> + // 00000000000000bc: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[192] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, 0xb9, + 0xfc, 0xff, 0xff, 0xff, 0x29, 0xc1, 0xf7, 0xd0, + 0x48, 0x98, 0x49, 0x8b, 0x7c, 0xc5, 0x00, 0x48, + 0x63, 0xc1, 0x4d, 0x8b, 0x7c, 0xc5, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xde, 0xba, + 0x02, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x16, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x42, + 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, + 0x89, 0xf7, 0x4c, 0x89, 0xfe, 0x48, 0x89, 0xda, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x1d, + 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_FormatKwargsError+0x0 + // 10: &_PyDict_MergeEx+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_FormatKwargsError); + patch_64(data + 0x10, (uintptr_t)&_PyDict_MergeEx); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0xc); + patch_32r(code + 0x5e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0x4); + patch_32r(code + 0x96, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x9f, (uintptr_t)data + -0x4); + patch_32r(code + 0xa9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + -0x4); + patch_32r(code + 0xbc, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__DICT_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_UPDATE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax ## 0xa <__JIT_ENTRY+0xa> + // 0000000000000006: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // a: f7 d0 notl %eax + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax ## imm = 0xFFF80000 + // 19: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 de movq %rbx, %rsi + // 26: ff 15 00 00 00 00 callq *(%rip) ## 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_GOT _PyDict_Update@GOTPCREL + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 1a js 0x58 <__JIT_ENTRY+0x58> + // 3e: 8b 03 movl (%rbx), %eax + // 40: 85 c0 testl %eax, %eax + // 42: 78 0a js 0x4e <__JIT_ENTRY+0x4e> + // 44: ff c8 decl %eax + // 46: 89 03 movl %eax, (%rbx) + // 48: 0f 84 81 00 00 00 je 0xcf <__JIT_ENTRY+0xcf> + // 4e: 49 83 c5 f8 addq $-0x8, %r13 + // 52: 5d popq %rbp + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 58: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_GOT_LOAD _PyExc_AttributeError@GOTPCREL + // 64: 48 8b 30 movq (%rax), %rsi + // 67: 4c 89 f7 movq %r14, %rdi + // 6a: ff 15 00 00 00 00 callq *(%rip) ## 0x70 <__JIT_ENTRY+0x70> + // 000000000000006c: X86_64_RELOC_GOT __PyErr_ExceptionMatches@GOTPCREL + // 70: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 75: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7e: 85 c0 testl %eax, %eax + // 80: 74 37 je 0xb9 <__JIT_ENTRY+0xb9> + // 82: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 87: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x8e <__JIT_ENTRY+0x8e> + // 000000000000008a: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // 8e: 48 8b 30 movq (%rax), %rsi + // 91: 48 8b 43 08 movq 0x8(%rbx), %rax + // 95: 48 8b 48 18 movq 0x18(%rax), %rcx + // 99: 48 8d 15 55 00 00 00 leaq 0x55(%rip), %rdx ## 0xf5 <__JIT_ENTRY+0xf5> + // 000000000000009c: X86_64_RELOC_SIGNED __cstring + // a0: 4c 89 f7 movq %r14, %rdi + // a3: 31 c0 xorl %eax, %eax + // a5: ff 15 00 00 00 00 callq *(%rip) ## 0xab <__JIT_ENTRY+0xab> + // 00000000000000a7: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // ab: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b0: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b9: 8b 03 movl (%rbx), %eax + // bb: 85 c0 testl %eax, %eax + // bd: 78 06 js 0xc5 <__JIT_ENTRY+0xc5> + // bf: ff c8 decl %eax + // c1: 89 03 movl %eax, (%rbx) + // c3: 74 1d je 0xe2 <__JIT_ENTRY+0xe2> + // c5: 49 83 c5 f8 addq $-0x8, %r13 + // c9: 5d popq %rbp + // ca: e9 00 00 00 00 jmp 0xcf <__JIT_ENTRY+0xcf> + // 00000000000000cb: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // cf: 48 89 df movq %rbx, %rdi + // d2: ff 15 00 00 00 00 callq *(%rip) ## 0xd8 <__JIT_ENTRY+0xd8> + // 00000000000000d4: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // d8: 49 83 c5 f8 addq $-0x8, %r13 + // dc: 5d popq %rbp + // dd: e9 00 00 00 00 jmp 0xe2 <__JIT_ENTRY+0xe2> + // 00000000000000de: X86_64_RELOC_BRANCH __JIT_CONTINUE + // e2: 48 89 df movq %rbx, %rdi + // e5: ff 15 00 00 00 00 callq *(%rip) ## 0xeb <__JIT_ENTRY+0xeb> + // 00000000000000e7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // eb: 49 83 c5 f8 addq $-0x8, %r13 + // ef: 5d popq %rbp + // f0: e9 00 00 00 00 jmp 0xf5 <__JIT_ENTRY+0xf5> + // 00000000000000f1: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[245] = { + 0x55, 0x48, 0x89, 0xe5, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x5d, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x7c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xde, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x1a, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x0a, 0xff, 0xc8, 0x89, 0x03, + 0x0f, 0x84, 0x81, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x37, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x30, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x8b, 0x48, + 0x18, 0x48, 0x8d, 0x15, 0x55, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x1d, 0x49, 0x83, 0xc5, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'%.200s' object is not a mapping\x00" + // 21: 00 00 00 00 00 00 00 + // 28: &_Py_Dealloc+0x0 + // 30: &_PyErr_Format+0x0 + // 38: &PyExc_TypeError+0x0 + // 40: &_PyErr_ExceptionMatches+0x0 + // 48: &PyExc_AttributeError+0x0 + // 50: &PyDict_Update+0x0 + // 58: OPARG + const unsigned char data_body[96] = { + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x30, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x38, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x40, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x48, (uintptr_t)&PyExc_AttributeError); + patch_64(data + 0x50, (uintptr_t)&PyDict_Update); + patch_64(data + 0x58, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4c); + patch_32r(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0x34); + patch_32r(code + 0x9c, (uintptr_t)data + 0x146); + patch_x86_64_32rx(code + 0xa7, (uintptr_t)data + 0x2c); + patch_32r(code + 0xcb, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xd4, (uintptr_t)data + 0x24); + patch_32r(code + 0xde, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xe7, (uintptr_t)data + 0x24); + patch_32r(code + 0xf1, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__END_FOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_FOR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 8b 07 movl (%rdi), %eax + // f: 85 c0 testl %eax, %eax + // 11: 78 06 js 0x19 <__JIT_ENTRY+0x19> + // 13: ff c8 decl %eax + // 15: 89 07 movl %eax, (%rdi) + // 17: 74 13 je 0x2c <__JIT_ENTRY+0x2c> + // 19: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2c: 55 pushq %rbp + // 2d: 48 89 e5 movq %rsp, %rbp + // 30: ff 15 00 00 00 00 callq *(%rip) ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 36: 5d popq %rbp + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: e9 00 00 00 00 jmp 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[69] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x13, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x28, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + -0x4); +} + +void +emit__END_SEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_SEND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4c 89 eb movq %r13, %rbx + // 3: 49 83 c5 f8 addq $-0x8, %r13 + // 7: 48 8b 7b f0 movq -0x10(%rbx), %rdi + // b: 4c 8b 7b f8 movq -0x8(%rbx), %r15 + // f: 8b 07 movl (%rdi), %eax + // 11: 85 c0 testl %eax, %eax + // 13: 78 06 js 0x1b <__JIT_ENTRY+0x1b> + // 15: ff c8 decl %eax + // 17: 89 07 movl %eax, (%rdi) + // 19: 74 09 je 0x24 <__JIT_ENTRY+0x24> + // 1b: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // 1f: e9 00 00 00 00 jmp 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 24: 55 pushq %rbp + // 25: 48 89 e5 movq %rsp, %rbp + // 28: ff 15 00 00 00 00 callq *(%rip) ## 0x2e <__JIT_ENTRY+0x2e> + // 000000000000002a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 2e: 5d popq %rbp + // 2f: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // 33: e9 00 00 00 00 jmp 0x38 <__JIT_ENTRY+0x38> + // 0000000000000034: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[51] = { + 0x4c, 0x89, 0xeb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x8b, 0x7b, 0xf0, 0x4c, 0x8b, 0x7b, 0xf8, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x07, 0x74, 0x09, 0x4c, 0x89, 0x7b, 0xf0, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4c, + 0x89, 0x7b, 0xf0, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x20, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + -0x4); +} + +void +emit__ERROR_POP_N( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ERROR_POP_N.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // b: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 12: 49 8b 04 24 movq (%r12), %rax + // 16: 8b 0d 00 00 00 00 movl (%rip), %ecx ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 1c: 48 8d 04 48 leaq (%rax,%rcx,2), %rax + // 20: 48 05 d0 00 00 00 addq $0xd0, %rax + // 26: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 2b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 30: 31 c0 xorl %eax, %eax + // 32: 5d popq %rbp + // 33: c3 retq + const unsigned char code_body[52] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, 0x10, 0x01, + 0x00, 0x00, 0x49, 0x8b, 0x04, 0x24, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x04, 0x48, + 0x48, 0x05, 0xd0, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x44, 0x24, 0x38, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x31, 0xc0, 0x5d, 0xc3, + }; + // 0: OPERAND0 + // 8: EXECUTOR + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + -0x4); +} + +void +emit__EXIT_INIT_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_INIT_CHECK.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // b: 74 3e je 0x4b <__JIT_ENTRY+0x4b> + // d: 55 pushq %rbp + // e: 48 89 e5 movq %rsp, %rbp + // 11: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 16: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // 1d: 48 8b 39 movq (%rcx), %rdi + // 20: 48 8b 40 08 movq 0x8(%rax), %rax + // 24: 48 8b 50 18 movq 0x18(%rax), %rdx + // 28: 48 8d 35 25 00 00 00 leaq 0x25(%rip), %rsi ## 0x54 <__JIT_ENTRY+0x54> + // 000000000000002b: X86_64_RELOC_SIGNED __cstring + // 2f: 31 c0 xorl %eax, %eax + // 31: ff 15 00 00 00 00 callq *(%rip) ## 0x37 <__JIT_ENTRY+0x37> + // 0000000000000033: X86_64_RELOC_GOT _PyErr_Format@GOTPCREL + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 5d popq %rbp + // 46: e9 00 00 00 00 jmp 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 4b: 49 83 c5 f8 addq $-0x8, %r13 + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[79] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x3e, 0x55, 0x48, 0x89, + 0xe5, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x39, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x8b, 0x50, 0x18, + 0x48, 0x8d, 0x35, 0x25, 0x00, 0x00, 0x00, 0x31, + 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, + }; + // 0: "__init__() should return None, not '%.200s'\x00" + // 2c: 00 00 00 00 + // 30: &PyErr_Format+0x0 + // 38: &PyExc_TypeError+0x0 + // 40: &_Py_NoneStruct+0x0 + const unsigned char data_body[72] = { + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x5f, + 0x28, 0x29, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x27, 0x25, 0x2e, 0x32, 0x30, + 0x30, 0x73, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&PyErr_Format); + patch_64(data + 0x38, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x40, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x34); + patch_32r(code + 0x2b, (uintptr_t)data + 0x75); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x2c); + patch_32r(code + 0x47, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__EXIT_TRACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_TRACE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4d 8b 3c 24 movq (%r12), %r15 + // c: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 13: 8b 1a movl (%rdx), %ebx + // 15: 48 8b 7a 08 movq 0x8(%rdx), %rdi + // 19: 48 85 ff testq %rdi, %rdi + // 1c: 0f 84 0c 01 00 00 je 0x12e <__JIT_ENTRY+0x12e> + // 22: f6 47 22 01 testb $0x1, 0x22(%rdi) + // 26: 0f 85 cd 00 00 00 jne 0xf9 <__JIT_ENTRY+0xf9> + // 2c: 66 c7 42 04 fc ff movw $0xfffc, 0x4(%rdx) ## imm = 0xFFFC + // 32: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 37: 48 c7 42 08 00 00 00 00 movq $0x0, 0x8(%rdx) + // 3f: 8b 07 movl (%rdi), %eax + // 41: 85 c0 testl %eax, %eax + // 43: 0f 88 d7 00 00 00 js 0x120 <__JIT_ENTRY+0x120> + // 49: ff c8 decl %eax + // 4b: 89 07 movl %eax, (%rdi) + // 4d: 75 0c jne 0x5b <__JIT_ENTRY+0x5b> + // 4f: 49 89 d5 movq %rdx, %r13 + // 52: ff 15 00 00 00 00 callq *(%rip) ## 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 58: 4c 89 ea movq %r13, %rdx + // 5b: 48 8b 7a 08 movq 0x8(%rdx), %rdi + // 5f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 64: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // 74: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 7b: 48 85 ff testq %rdi, %rdi + // 7e: 0f 85 83 00 00 00 jne 0x107 <__JIT_ENTRY+0x107> + // 84: 49 8d 04 5f leaq (%r15,%rbx,2), %rax + // 88: 48 05 d0 00 00 00 addq $0xd0, %rax + // 8e: 0f b7 5a 04 movzwl 0x4(%rdx), %ebx + // 92: 83 fb 0f cmpl $0xf, %ebx + // 95: 0f 83 b8 00 00 00 jae 0x153 <__JIT_ENTRY+0x153> + // 9b: 80 38 ff cmpb $-0x1, (%rax) + // 9e: 0f 84 c1 00 00 00 je 0x165 <__JIT_ENTRY+0x165> + // a4: 49 89 d7 movq %rdx, %r15 + // a7: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xae <__JIT_ENTRY+0xae> + // 00000000000000aa: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // ae: 0f b6 49 22 movzbl 0x22(%rcx), %ecx + // b2: c1 e9 02 shrl $0x2, %ecx + // b5: ff c1 incl %ecx + // b7: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // bc: 48 8d 55 f0 leaq -0x10(%rbp), %rdx + // c0: 4c 89 e7 movq %r12, %rdi + // c3: 48 89 45 f8 movq %rax, -0x8(%rbp) + // c7: 48 89 c6 movq %rax, %rsi + // ca: ff 15 00 00 00 00 callq *(%rip) ## 0xd0 <__JIT_ENTRY+0xd0> + // 00000000000000cc: X86_64_RELOC_GOT __PyOptimizer_Optimize@GOTPCREL + // d0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // de: 85 c0 testl %eax, %eax + // e0: 0f 8e a5 00 00 00 jle 0x18b <__JIT_ENTRY+0x18b> + // e6: 4c 89 fa movq %r15, %rdx + // e9: 66 41 c7 47 04 fc ff movw $0xfffc, 0x4(%r15) ## imm = 0xFFFC + // f0: 48 8b 7d f0 movq -0x10(%rbp), %rdi + // f4: e9 86 00 00 00 jmp 0x17f <__JIT_ENTRY+0x17f> + // f9: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x100 <__JIT_ENTRY+0x100> + // 00000000000000fc: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // 100: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 107: 8b 07 movl (%rdi), %eax + // 109: 85 c0 testl %eax, %eax + // 10b: 78 08 js 0x115 <__JIT_ENTRY+0x115> + // 10d: ff c0 incl %eax + // 10f: 89 07 movl %eax, (%rdi) + // 111: 48 8b 7a 08 movq 0x8(%rdx), %rdi + // 115: 48 8b 47 78 movq 0x78(%rdi), %rax + // 119: 48 83 c4 10 addq $0x10, %rsp + // 11d: 5d popq %rbp + // 11e: ff e0 jmpq *%rax + // 120: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 125: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 12e: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x135 <__JIT_ENTRY+0x135> + // 0000000000000131: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // 135: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 13c: 49 8d 04 5f leaq (%r15,%rbx,2), %rax + // 140: 48 05 d0 00 00 00 addq $0xd0, %rax + // 146: 0f b7 5a 04 movzwl 0x4(%rdx), %ebx + // 14a: 83 fb 0f cmpl $0xf, %ebx + // 14d: 0f 82 48 ff ff ff jb 0x9b <__JIT_ENTRY+0x9b> + // 153: 83 c3 f0 addl $-0x10, %ebx + // 156: 66 89 5a 04 movw %bx, 0x4(%rdx) + // 15a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15f: 48 83 c4 10 addq $0x10, %rsp + // 163: 5d popq %rbp + // 164: c3 retq + // 165: 49 8b 8f 98 00 00 00 movq 0x98(%r15), %rcx + // 16c: 0f b6 40 01 movzbl 0x1(%rax), %eax + // 170: 48 8b 7c c1 08 movq 0x8(%rcx,%rax,8), %rdi + // 175: 8b 07 movl (%rdi), %eax + // 177: 85 c0 testl %eax, %eax + // 179: 78 04 js 0x17f <__JIT_ENTRY+0x17f> + // 17b: ff c0 incl %eax + // 17d: 89 07 movl %eax, (%rdi) + // 17f: 48 89 7a 08 movq %rdi, 0x8(%rdx) + // 183: 8b 07 movl (%rdi), %eax + // 185: 85 c0 testl %eax, %eax + // 187: 79 84 jns 0x10d <__JIT_ENTRY+0x10d> + // 189: eb 8a jmp 0x115 <__JIT_ENTRY+0x115> + // 18b: 66 ba fc ff movw $0xfffc, %dx ## imm = 0xFFFC + // 18f: 66 83 fb 0b cmpw $0xb, %bx + // 193: 77 12 ja 0x1a7 <__JIT_ENTRY+0x1a7> + // 195: ff c3 incl %ebx + // 197: ba ff ff ff ff movl $0xffffffff, %edx ## imm = 0xFFFFFFFF + // 19c: 89 d9 movl %ebx, %ecx + // 19e: d3 e2 shll %cl, %edx + // 1a0: f7 d2 notl %edx + // 1a2: c1 e2 04 shll $0x4, %edx + // 1a5: 09 da orl %ebx, %edx + // 1a7: 66 41 89 57 04 movw %dx, 0x4(%r15) + // 1ac: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b1: 31 c9 xorl %ecx, %ecx + // 1b3: 85 c0 testl %eax, %eax + // 1b5: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 1b9: 48 0f 45 c1 cmovneq %rcx, %rax + // 1bd: 48 83 c4 10 addq $0x10, %rsp + // 1c1: 5d popq %rbp + // 1c2: c3 retq + const unsigned char code_body[451] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4d, 0x8b, 0x3c, 0x24, 0x48, 0x8b, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x1a, 0x48, 0x8b, 0x7a, + 0x08, 0x48, 0x85, 0xff, 0x0f, 0x84, 0x0c, 0x01, + 0x00, 0x00, 0xf6, 0x47, 0x22, 0x01, 0x0f, 0x85, + 0xcd, 0x00, 0x00, 0x00, 0x66, 0xc7, 0x42, 0x04, + 0xfc, 0xff, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0xc7, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x07, 0x85, 0xc0, 0x0f, 0x88, 0xd7, 0x00, 0x00, + 0x00, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x0c, 0x49, + 0x89, 0xd5, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xea, 0x48, 0x8b, 0x7a, 0x08, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, 0x10, + 0x01, 0x00, 0x00, 0x48, 0x85, 0xff, 0x0f, 0x85, + 0x83, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x04, 0x5f, + 0x48, 0x05, 0xd0, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0x5a, 0x04, 0x83, 0xfb, 0x0f, 0x0f, 0x83, 0xb8, + 0x00, 0x00, 0x00, 0x80, 0x38, 0xff, 0x0f, 0x84, + 0xc1, 0x00, 0x00, 0x00, 0x49, 0x89, 0xd7, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb6, + 0x49, 0x22, 0xc1, 0xe9, 0x02, 0xff, 0xc1, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8d, 0x55, 0xf0, + 0x4c, 0x89, 0xe7, 0x48, 0x89, 0x45, 0xf8, 0x48, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x0f, 0x8e, 0xa5, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xfa, 0x66, 0x41, 0xc7, 0x47, 0x04, 0xfc, 0xff, + 0x48, 0x8b, 0x7d, 0xf0, 0xe9, 0x86, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x86, 0x10, 0x01, 0x00, 0x00, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x08, 0xff, 0xc0, 0x89, + 0x07, 0x48, 0x8b, 0x7a, 0x08, 0x48, 0x8b, 0x47, + 0x78, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0xe0, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, + 0x10, 0x01, 0x00, 0x00, 0x49, 0x8d, 0x04, 0x5f, + 0x48, 0x05, 0xd0, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0x5a, 0x04, 0x83, 0xfb, 0x0f, 0x0f, 0x82, 0x48, + 0xff, 0xff, 0xff, 0x83, 0xc3, 0xf0, 0x66, 0x89, + 0x5a, 0x04, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xc3, 0x49, 0x8b, 0x8f, + 0x98, 0x00, 0x00, 0x00, 0x0f, 0xb6, 0x40, 0x01, + 0x48, 0x8b, 0x7c, 0xc1, 0x08, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x07, 0x48, + 0x89, 0x7a, 0x08, 0x8b, 0x07, 0x85, 0xc0, 0x79, + 0x84, 0xeb, 0x8a, 0x66, 0xba, 0xfc, 0xff, 0x66, + 0x83, 0xfb, 0x0b, 0x77, 0x12, 0xff, 0xc3, 0xba, + 0xff, 0xff, 0xff, 0xff, 0x89, 0xd9, 0xd3, 0xe2, + 0xf7, 0xd2, 0xc1, 0xe2, 0x04, 0x09, 0xda, 0x66, + 0x41, 0x89, 0x57, 0x04, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x31, 0xc9, 0x85, 0xc0, 0x48, 0x8b, 0x45, + 0xf8, 0x48, 0x0f, 0x45, 0xc1, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xc3, + }; + // 0: EXECUTOR + // 8: &_PyOptimizer_Optimize+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: OPERAND0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, (uintptr_t)&_PyOptimizer_Optimize); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xfc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x131, (uintptr_t)data + -0x4); +} + +void +emit__EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: ba fe ff ff ff movl $0xfffffffe, %edx ## imm = 0xFFFFFFFE + // c: 29 c2 subl %eax, %edx + // e: f7 d0 notl %eax + // 10: 48 63 c8 movslq %eax, %rcx + // 13: 48 63 c2 movslq %edx, %rax + // 16: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1b: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 1f: 8b 3e movl (%rsi), %edi + // 21: 85 ff testl %edi, %edi + // 23: 78 04 js 0x29 <__JIT_ENTRY+0x29> + // 25: ff c7 incl %edi + // 27: 89 3e movl %edi, (%rsi) + // 29: 49 89 74 cd 00 movq %rsi, (%r13,%rcx,8) + // 2e: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 33: 48 8b 4a 10 movq 0x10(%rdx), %rcx + // 37: 8b 11 movl (%rcx), %edx + // 39: 85 d2 testl %edx, %edx + // 3b: 78 04 js 0x41 <__JIT_ENTRY+0x41> + // 3d: ff c2 incl %edx + // 3f: 89 11 movl %edx, (%rcx) + // 41: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 46: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4b: 8b 07 movl (%rdi), %eax + // 4d: 85 c0 testl %eax, %eax + // 4f: 78 06 js 0x57 <__JIT_ENTRY+0x57> + // 51: ff c8 decl %eax + // 53: 89 07 movl %eax, (%rdi) + // 55: 74 13 je 0x6a <__JIT_ENTRY+0x6a> + // 57: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 0000000000000066: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6a: 55 pushq %rbp + // 6b: 48 89 e5 movq %rsp, %rbp + // 6e: ff 15 00 00 00 00 callq *(%rip) ## 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 74: 5d popq %rbp + // 75: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[131] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xba, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc2, 0xf7, 0xd0, + 0x48, 0x63, 0xc8, 0x48, 0x63, 0xc2, 0x49, 0x8b, + 0x54, 0xc5, 0x00, 0x48, 0x8b, 0x72, 0x18, 0x8b, + 0x3e, 0x85, 0xff, 0x78, 0x04, 0xff, 0xc7, 0x89, + 0x3e, 0x49, 0x89, 0x74, 0xcd, 0x00, 0x49, 0x8b, + 0x7c, 0xc5, 0x00, 0x48, 0x8b, 0x4a, 0x10, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x4); + patch_32r(code + 0x66, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + -0x4); +} + +void +emit__EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD_KW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // c: 29 c1 subl %eax, %ecx + // e: 48 63 c9 movslq %ecx, %rcx + // 11: ba fd ff ff ff movl $0xfffffffd, %edx ## imm = 0xFFFFFFFD + // 16: 29 c2 subl %eax, %edx + // 18: 48 63 c2 movslq %edx, %rax + // 1b: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 20: 48 8b 57 18 movq 0x18(%rdi), %rdx + // 24: 8b 32 movl (%rdx), %esi + // 26: 85 f6 testl %esi, %esi + // 28: 78 04 js 0x2e <__JIT_ENTRY+0x2e> + // 2a: ff c6 incl %esi + // 2c: 89 32 movl %esi, (%rdx) + // 2e: 49 89 54 cd 00 movq %rdx, (%r13,%rcx,8) + // 33: 48 8b 4f 10 movq 0x10(%rdi), %rcx + // 37: 8b 11 movl (%rcx), %edx + // 39: 85 d2 testl %edx, %edx + // 3b: 78 04 js 0x41 <__JIT_ENTRY+0x41> + // 3d: ff c2 incl %edx + // 3f: 89 11 movl %edx, (%rcx) + // 41: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 46: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4b: 8b 07 movl (%rdi), %eax + // 4d: 85 c0 testl %eax, %eax + // 4f: 78 06 js 0x57 <__JIT_ENTRY+0x57> + // 51: ff c8 decl %eax + // 53: 89 07 movl %eax, (%rdi) + // 55: 74 13 je 0x6a <__JIT_ENTRY+0x6a> + // 57: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 0000000000000066: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6a: 55 pushq %rbp + // 6b: 48 89 e5 movq %rsp, %rbp + // 6e: ff 15 00 00 00 00 callq *(%rip) ## 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 74: 5d popq %rbp + // 75: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[131] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, + 0xc9, 0xba, 0xfd, 0xff, 0xff, 0xff, 0x29, 0xc2, + 0x48, 0x63, 0xc2, 0x49, 0x8b, 0x7c, 0xc5, 0x00, + 0x48, 0x8b, 0x57, 0x18, 0x8b, 0x32, 0x85, 0xf6, + 0x78, 0x04, 0xff, 0xc6, 0x89, 0x32, 0x49, 0x89, + 0x54, 0xcd, 0x00, 0x48, 0x8b, 0x4f, 0x10, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x4); + patch_32r(code + 0x66, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + -0x4); +} + +void +emit__FATAL_ERROR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FATAL_ERROR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8d 3d 0d 00 00 00 leaq 0xd(%rip), %rdi ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000007: X86_64_RELOC_SIGNED __cstring + // b: 48 8d 35 11 00 00 00 leaq 0x11(%rip), %rsi ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000000e: X86_64_RELOC_SIGNED __cstring + // 12: ff 15 00 00 00 00 callq *(%rip) ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT __Py_FatalErrorFunc@GOTPCREL + const unsigned char code_body[24] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8d, 0x3d, 0x0d, + 0x00, 0x00, 0x00, 0x48, 0x8d, 0x35, 0x11, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '_JIT_ENTRY\x00Fatal error uop executed.\x00' + // 25: 00 00 00 + // 28: &_Py_FatalErrorFunc+0x0 + const unsigned char data_body[48] = { + 0x5f, 0x4a, 0x49, 0x54, 0x5f, 0x45, 0x4e, 0x54, + 0x52, 0x59, 0x00, 0x46, 0x61, 0x74, 0x61, 0x6c, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x75, + 0x6f, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_FatalErrorFunc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x7, (uintptr_t)data + 0x21); + patch_32r(code + 0xe, (uintptr_t)data + 0x25); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x24); +} + +void +emit__FORMAT_SIMPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_SIMPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 48 8b 43 08 movq 0x8(%rbx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyUnicode_Type@GOTPCREL + // 13: 74 46 je 0x5b <__JIT_ENTRY+0x5b> + // 15: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1a: 48 89 df movq %rbx, %rdi + // 1d: 31 f6 xorl %esi, %esi + // 1f: ff 15 00 00 00 00 callq *(%rip) ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyObject_Format@GOTPCREL + // 25: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 2b: 8b 0b movl (%rbx), %ecx + // 2d: 85 c9 testl %ecx, %ecx + // 2f: 78 06 js 0x37 <__JIT_ENTRY+0x37> + // 31: ff c9 decl %ecx + // 33: 89 0b movl %ecx, (%rbx) + // 35: 74 36 je 0x6d <__JIT_ENTRY+0x6d> + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 48 85 c0 testq %rax, %rax + // 48: 74 45 je 0x8f <__JIT_ENTRY+0x8f> + // 4a: 48 89 c3 movq %rax, %rbx + // 4d: 49 89 5d 00 movq %rbx, (%r13) + // 51: 49 83 c5 08 addq $0x8, %r13 + // 55: 5d popq %rbp + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5b: 49 83 c5 f8 addq $-0x8, %r13 + // 5f: 49 89 5d 00 movq %rbx, (%r13) + // 63: 49 83 c5 08 addq $0x8, %r13 + // 67: 5d popq %rbp + // 68: e9 00 00 00 00 jmp 0x6d <__JIT_ENTRY+0x6d> + // 0000000000000069: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6d: 48 89 df movq %rbx, %rdi + // 70: 48 89 c3 movq %rax, %rbx + // 73: ff 15 00 00 00 00 callq *(%rip) ## 0x79 <__JIT_ENTRY+0x79> + // 0000000000000075: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 79: 48 89 d8 movq %rbx, %rax + // 7c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 81: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8a: 48 85 c0 testq %rax, %rax + // 8d: 75 bb jne 0x4a <__JIT_ENTRY+0x4a> + // 8f: 5d popq %rbp + // 90: e9 00 00 00 00 jmp 0x95 <__JIT_ENTRY+0x95> + // 0000000000000091: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[149] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x46, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0x31, 0xf6, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xf8, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x36, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x45, 0x48, 0x89, 0xc3, 0x49, 0x89, 0x5d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x89, 0x5d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x75, 0xbb, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_Format+0x0 + // 10: &PyUnicode_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_Format); + patch_64(data + 0x10, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_32r(code + 0x57, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x69, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + -0x4); + patch_32r(code + 0x91, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__FORMAT_WITH_SPEC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_WITH_SPEC.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 10: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 48 89 df movq %rbx, %rdi + // 1c: 4c 89 fe movq %r15, %rsi + // 1f: ff 15 00 00 00 00 callq *(%rip) ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT _PyObject_Format@GOTPCREL + // 25: 49 89 c6 movq %rax, %r14 + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: 8b 03 movl (%rbx), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 0f js 0x4b <__JIT_ENTRY+0x4b> + // 3c: ff c8 decl %eax + // 3e: 89 03 movl %eax, (%rbx) + // 40: 75 09 jne 0x4b <__JIT_ENTRY+0x4b> + // 42: 48 89 df movq %rbx, %rdi + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 41 8b 07 movl (%r15), %eax + // 4e: 85 c0 testl %eax, %eax + // 50: 78 07 js 0x59 <__JIT_ENTRY+0x59> + // 52: ff c8 decl %eax + // 54: 41 89 07 movl %eax, (%r15) + // 57: 74 1b je 0x74 <__JIT_ENTRY+0x74> + // 59: 4d 85 f6 testq %r14, %r14 + // 5c: 74 24 je 0x82 <__JIT_ENTRY+0x82> + // 5e: 4d 89 75 f0 movq %r14, -0x10(%r13) + // 62: 49 83 c5 f8 addq $-0x8, %r13 + // 66: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 6a: 48 83 c4 10 addq $0x10, %rsp + // 6e: 5d popq %rbp + // 6f: e9 00 00 00 00 jmp 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 74: 4c 89 ff movq %r15, %rdi + // 77: ff 15 00 00 00 00 callq *(%rip) ## 0x7d <__JIT_ENTRY+0x7d> + // 0000000000000079: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 7d: 4d 85 f6 testq %r14, %r14 + // 80: 75 dc jne 0x5e <__JIT_ENTRY+0x5e> + // 82: 49 83 c5 f0 addq $-0x10, %r13 + // 86: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 8a: 48 83 c4 10 addq $0x10, %rsp + // 8e: 5d popq %rbp + // 8f: e9 00 00 00 00 jmp 0x94 <__JIT_ENTRY+0x94> + // 0000000000000090: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[148] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xdf, 0x4c, 0x89, 0xfe, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc6, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, + 0x75, 0x09, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, + 0x1b, 0x4d, 0x85, 0xf6, 0x74, 0x24, 0x4d, 0x89, + 0x75, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x4c, 0x8b, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, 0xf6, + 0x75, 0xdc, 0x49, 0x83, 0xc5, 0xf0, 0x4c, 0x8b, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_Format+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_32r(code + 0x70, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + -0x4); + patch_32r(code + 0x90, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__FOR_ITER_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_GEN_FRAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyGen_Type@GOTPCREL + // 13: 75 06 jne 0x1b <__JIT_ENTRY+0x1b> + // 15: 80 78 43 00 cmpb $0x0, 0x43(%rax) + // 19: 78 06 js 0x21 <__JIT_ENTRY+0x21> + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 21: 48 8b 88 88 00 00 00 movq 0x88(%rax), %rcx + // 28: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_GOT_LOAD __Py_NoneStruct@GOTPCREL + // 2f: 48 89 11 movq %rdx, (%rcx) + // 32: 48 83 80 88 00 00 00 08 addq $0x8, 0x88(%rax) + // 3a: 48 8d 48 48 leaq 0x48(%rax), %rcx + // 3e: c6 40 43 00 movb $0x0, 0x43(%rax) + // 42: 49 8b 56 78 movq 0x78(%r14), %rdx + // 46: 48 8d 70 28 leaq 0x28(%rax), %rsi + // 4a: 48 89 50 30 movq %rdx, 0x30(%rax) + // 4e: 49 89 76 78 movq %rsi, 0x78(%r14) + // 52: 4c 89 60 50 movq %r12, 0x50(%rax) + // 56: 8b 05 00 00 00 00 movl (%rip), %eax ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 5c: 83 c0 02 addl $0x2, %eax + // 5f: 66 41 89 44 24 48 movw %ax, 0x48(%r12) + // 65: 49 89 4d 00 movq %rcx, (%r13) + // 69: 49 83 c5 08 addq $0x8, %r13 + // 6d: 5d popq %rbp + // 6e: e9 00 00 00 00 jmp 0x73 <__JIT_ENTRY+0x73> + // 000000000000006f: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[110] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x06, 0x80, 0x78, 0x43, + 0x00, 0x78, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x88, 0x88, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0x11, 0x48, 0x83, 0x80, 0x88, 0x00, 0x00, + 0x00, 0x08, 0x48, 0x8d, 0x48, 0x48, 0xc6, 0x40, + 0x43, 0x00, 0x49, 0x8b, 0x56, 0x78, 0x48, 0x8d, + 0x70, 0x28, 0x48, 0x89, 0x50, 0x30, 0x49, 0x89, + 0x76, 0x78, 0x4c, 0x89, 0x60, 0x50, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc0, 0x02, 0x66, + 0x41, 0x89, 0x44, 0x24, 0x48, 0x49, 0x89, 0x4d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: OPARG + // 8: &_Py_NoneStruct+0x0 + // 10: &PyGen_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x10, (uintptr_t)&PyGen_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0xc); + patch_32r(code + 0x1d, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); +} + +void +emit__FOR_ITER_TIER_TWO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_TIER_TWO.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 8b 47 08 movq 0x8(%rdi), %rax + // 11: ff 90 e0 00 00 00 callq *0xe0(%rax) + // 17: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 25: 48 85 c0 testq %rax, %rax + // 28: 74 0e je 0x38 <__JIT_ENTRY+0x38> + // 2a: 49 89 45 00 movq %rax, (%r13) + // 2e: 49 83 c5 08 addq $0x8, %r13 + // 32: 5d popq %rbp + // 33: e9 00 00 00 00 jmp 0x38 <__JIT_ENTRY+0x38> + // 0000000000000034: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 38: 49 8b 46 70 movq 0x70(%r14), %rax + // 3c: 48 85 c0 testq %rax, %rax + // 3f: 74 5e je 0x9f <__JIT_ENTRY+0x9f> + // 41: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // 46: 74 57 je 0x9f <__JIT_ENTRY+0x9f> + // 48: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_GOT_LOAD _PyExc_StopIteration@GOTPCREL + // 54: 48 8b 30 movq (%rax), %rsi + // 57: 4c 89 f7 movq %r14, %rdi + // 5a: ff 15 00 00 00 00 callq *(%rip) ## 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_GOT __PyErr_ExceptionMatches@GOTPCREL + // 60: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 65: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6e: 85 c0 testl %eax, %eax + // 70: 74 33 je 0xa5 <__JIT_ENTRY+0xa5> + // 72: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 77: 49 8b 54 24 38 movq 0x38(%r12), %rdx + // 7c: 4c 89 f7 movq %r14, %rdi + // 7f: 4c 89 e6 movq %r12, %rsi + // 82: ff 15 00 00 00 00 callq *(%rip) ## 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_GOT __PyEval_MonitorRaise@GOTPCREL + // 88: 4c 89 f7 movq %r14, %rdi + // 8b: ff 15 00 00 00 00 callq *(%rip) ## 0x91 <__JIT_ENTRY+0x91> + // 000000000000008d: X86_64_RELOC_GOT __PyErr_Clear@GOTPCREL + // 91: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: 5d popq %rbp + // a0: e9 00 00 00 00 jmp 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // a5: 5d popq %rbp + // a6: e9 00 00 00 00 jmp 0xab <__JIT_ENTRY+0xab> + // 00000000000000a7: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[171] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x47, + 0x08, 0xff, 0x90, 0xe0, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0e, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x46, 0x70, 0x48, 0x85, 0xc0, 0x74, + 0x5e, 0x48, 0x83, 0x78, 0x08, 0x00, 0x74, 0x57, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x33, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, + 0x8b, 0x54, 0x24, 0x38, 0x4c, 0x89, 0xf7, 0x4c, + 0x89, 0xe6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyErr_Clear+0x0 + // 8: &_PyEval_MonitorRaise+0x0 + // 10: &_PyErr_ExceptionMatches+0x0 + // 18: &PyExc_StopIteration+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x8, (uintptr_t)&_PyEval_MonitorRaise); + patch_64(data + 0x10, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x18, (uintptr_t)&PyExc_StopIteration); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x34, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + -0x4); + patch_32r(code + 0xa1, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0xa7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_AITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AITER.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 8: 49 8b 47 08 movq 0x8(%r15), %rax + // c: 48 8b 48 50 movq 0x50(%rax), %rcx + // 10: 48 85 c9 testq %rcx, %rcx + // 13: 74 59 je 0x6e <__JIT_ENTRY+0x6e> + // 15: 48 8b 49 08 movq 0x8(%rcx), %rcx + // 19: 48 85 c9 testq %rcx, %rcx + // 1c: 74 50 je 0x6e <__JIT_ENTRY+0x6e> + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 4c 89 ff movq %r15, %rdi + // 26: ff d1 callq *%rcx + // 28: 48 89 c3 movq %rax, %rbx + // 2b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 30: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 39: 41 8b 07 movl (%r15), %eax + // 3c: 85 c0 testl %eax, %eax + // 3e: 78 0b js 0x4b <__JIT_ENTRY+0x4b> + // 40: ff c8 decl %eax + // 42: 41 89 07 movl %eax, (%r15) + // 45: 0f 84 ca 00 00 00 je 0x115 <__JIT_ENTRY+0x115> + // 4b: 48 85 db testq %rbx, %rbx + // 4e: 74 5f je 0xaf <__JIT_ENTRY+0xaf> + // 50: 48 8b 43 08 movq 0x8(%rbx), %rax + // 54: 48 8b 48 50 movq 0x50(%rax), %rcx + // 58: 48 85 c9 testq %rcx, %rcx + // 5b: 74 5c je 0xb9 <__JIT_ENTRY+0xb9> + // 5d: 48 83 79 10 00 cmpq $0x0, 0x10(%rcx) + // 62: 74 55 je 0xb9 <__JIT_ENTRY+0xb9> + // 64: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 68: 5d popq %rbp + // 69: e9 00 00 00 00 jmp 0x6e <__JIT_ENTRY+0x6e> + // 000000000000006a: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 73: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x7a <__JIT_ENTRY+0x7a> + // 0000000000000076: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // 7a: 48 8b 31 movq (%rcx), %rsi + // 7d: 48 8b 48 18 movq 0x18(%rax), %rcx + // 81: 48 8d 15 be 00 00 00 leaq 0xbe(%rip), %rdx ## 0x146 <__JIT_ENTRY+0x146> + // 0000000000000084: X86_64_RELOC_SIGNED __cstring + // 88: 4c 89 f7 movq %r14, %rdi + // 8b: 31 c0 xorl %eax, %eax + // 8d: ff 15 00 00 00 00 callq *(%rip) ## 0x93 <__JIT_ENTRY+0x93> + // 000000000000008f: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // 93: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 98: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a1: 41 8b 07 movl (%r15), %eax + // a4: 85 c0 testl %eax, %eax + // a6: 78 07 js 0xaf <__JIT_ENTRY+0xaf> + // a8: ff c8 decl %eax + // aa: 41 89 07 movl %eax, (%r15) + // ad: 74 53 je 0x102 <__JIT_ENTRY+0x102> + // af: 49 83 c5 f8 addq $-0x8, %r13 + // b3: 5d popq %rbp + // b4: e9 00 00 00 00 jmp 0xb9 <__JIT_ENTRY+0xb9> + // 00000000000000b5: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // b9: 49 83 c5 f8 addq $-0x8, %r13 + // bd: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // c2: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xc9 <__JIT_ENTRY+0xc9> + // 00000000000000c5: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // c9: 48 8b 31 movq (%rcx), %rsi + // cc: 48 8b 48 18 movq 0x18(%rax), %rcx + // d0: 48 8d 15 b0 00 00 00 leaq 0xb0(%rip), %rdx ## 0x187 <__JIT_ENTRY+0x187> + // 00000000000000d3: X86_64_RELOC_SIGNED __cstring + // d7: 4c 89 f7 movq %r14, %rdi + // da: 31 c0 xorl %eax, %eax + // dc: ff 15 00 00 00 00 callq *(%rip) ## 0xe2 <__JIT_ENTRY+0xe2> + // 00000000000000de: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // e2: 8b 03 movl (%rbx), %eax + // e4: 85 c0 testl %eax, %eax + // e6: 78 06 js 0xee <__JIT_ENTRY+0xee> + // e8: ff c8 decl %eax + // ea: 89 03 movl %eax, (%rbx) + // ec: 74 3b je 0x129 <__JIT_ENTRY+0x129> + // ee: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fc: 5d popq %rbp + // fd: e9 00 00 00 00 jmp 0x102 <__JIT_ENTRY+0x102> + // 00000000000000fe: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 102: 4c 89 ff movq %r15, %rdi + // 105: ff 15 00 00 00 00 callq *(%rip) ## 0x10b <__JIT_ENTRY+0x10b> + // 0000000000000107: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 10b: 49 83 c5 f8 addq $-0x8, %r13 + // 10f: 5d popq %rbp + // 110: e9 00 00 00 00 jmp 0x115 <__JIT_ENTRY+0x115> + // 0000000000000111: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 115: 4c 89 ff movq %r15, %rdi + // 118: ff 15 00 00 00 00 callq *(%rip) ## 0x11e <__JIT_ENTRY+0x11e> + // 000000000000011a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 11e: 48 85 db testq %rbx, %rbx + // 121: 0f 85 29 ff ff ff jne 0x50 <__JIT_ENTRY+0x50> + // 127: eb 86 jmp 0xaf <__JIT_ENTRY+0xaf> + // 129: 48 89 df movq %rbx, %rdi + // 12c: ff 15 00 00 00 00 callq *(%rip) ## 0x132 <__JIT_ENTRY+0x132> + // 000000000000012e: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 132: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 137: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 140: 5d popq %rbp + // 141: e9 00 00 00 00 jmp 0x146 <__JIT_ENTRY+0x146> + // 0000000000000142: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[326] = { + 0x55, 0x48, 0x89, 0xe5, 0x4d, 0x8b, 0x7d, 0xf8, + 0x49, 0x8b, 0x47, 0x08, 0x48, 0x8b, 0x48, 0x50, + 0x48, 0x85, 0xc9, 0x74, 0x59, 0x48, 0x8b, 0x49, + 0x08, 0x48, 0x85, 0xc9, 0x74, 0x50, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xff, 0xff, 0xd1, + 0x48, 0x89, 0xc3, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0b, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x0f, 0x84, 0xca, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x74, 0x5f, + 0x48, 0x8b, 0x43, 0x08, 0x48, 0x8b, 0x48, 0x50, + 0x48, 0x85, 0xc9, 0x74, 0x5c, 0x48, 0x83, 0x79, + 0x10, 0x00, 0x74, 0x55, 0x49, 0x89, 0x5d, 0xf8, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x31, 0x48, 0x8b, 0x48, + 0x18, 0x48, 0x8d, 0x15, 0xbe, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x07, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, 0x53, 0x49, + 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x31, 0x48, 0x8b, 0x48, 0x18, + 0x48, 0x8d, 0x15, 0xb0, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x03, 0x74, 0x3b, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xdb, 0x0f, 0x85, 0x29, 0xff, 0xff, 0xff, 0xeb, + 0x86, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'async for' requires an object with __aiter__ method, got %.100s\x00'async for' received an object from __aiter__ that does not implement __anext__: %.100s\x00" + // 99: 00 00 00 00 00 00 00 + // a0: &_Py_Dealloc+0x0 + // a8: &_PyErr_Format+0x0 + // b0: &PyExc_TypeError+0x0 + const unsigned char data_body[184] = { + 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x5f, 0x5f, 0x61, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x5f, 0x5f, 0x61, + 0x69, 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, + 0x3a, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0xa0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0xa8, (uintptr_t)&_PyErr_Format); + patch_64(data + 0xb0, (uintptr_t)&PyExc_TypeError); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x6a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xac); + patch_32r(code + 0x84, (uintptr_t)data + 0x200); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0xa4); + patch_32r(code + 0xb5, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + 0xac); + patch_32r(code + 0xd3, (uintptr_t)data + 0x1f2); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + 0xa4); + patch_32r(code + 0xfe, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x107, (uintptr_t)data + 0x9c); + patch_32r(code + 0x111, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x11a, (uintptr_t)data + 0x9c); + patch_x86_64_32rx(code + 0x12e, (uintptr_t)data + 0x9c); + patch_32r(code + 0x142, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_ANEXT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ANEXT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: ff 15 00 00 00 00 callq *(%rip) ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __PyEval_GetANext@GOTPCREL + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 48 85 c0 testq %rax, %rax + // 24: 74 0e je 0x34 <__JIT_ENTRY+0x34> + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: 5d popq %rbp + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 34: 5d popq %rbp + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[58] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_PyEval_GetANext+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_GetANext); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x30, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x36, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_AWAITABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AWAITABLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 35 00 00 00 00 movzwl (%rip), %esi ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 5d f8 movq -0x8(%r13), %rbx + // f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 14: 48 89 df movq %rbx, %rdi + // 17: ff 15 00 00 00 00 callq *(%rip) ## 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_GOT __PyEval_GetAwaitable@GOTPCREL + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 8b 0b movl (%rbx), %ecx + // 2d: 85 c9 testl %ecx, %ecx + // 2f: 78 06 js 0x37 <__JIT_ENTRY+0x37> + // 31: ff c9 decl %ecx + // 33: 89 0b movl %ecx, (%rbx) + // 35: 74 0f je 0x46 <__JIT_ENTRY+0x46> + // 37: 48 85 c0 testq %rax, %rax + // 3a: 74 1e je 0x5a <__JIT_ENTRY+0x5a> + // 3c: 49 89 45 f8 movq %rax, -0x8(%r13) + // 40: 5d popq %rbp + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 0000000000000042: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 46: 48 89 df movq %rbx, %rdi + // 49: 48 89 c3 movq %rax, %rbx + // 4c: ff 15 00 00 00 00 callq *(%rip) ## 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 52: 48 89 d8 movq %rbx, %rax + // 55: 48 85 c0 testq %rax, %rax + // 58: 75 e2 jne 0x3c <__JIT_ENTRY+0x3c> + // 5a: 49 83 c5 f8 addq $-0x8, %r13 + // 5e: 5d popq %rbp + // 5f: e9 00 00 00 00 jmp 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[100] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0f, 0x48, + 0x85, 0xc0, 0x74, 0x1e, 0x49, 0x89, 0x45, 0xf8, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, + 0x75, 0xe2, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_GetAwaitable+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_GetAwaitable); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_32r(code + 0x42, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + -0x4); + patch_32r(code + 0x60, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ITER.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 df movq %rbx, %rdi + // 10: ff 15 00 00 00 00 callq *(%rip) ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyObject_GetIter@GOTPCREL + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0b movl (%rbx), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <__JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0b movl %ecx, (%rbx) + // 2e: 74 0f je 0x3f <__JIT_ENTRY+0x3f> + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 1e je 0x53 <__JIT_ENTRY+0x53> + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: 48 89 df movq %rbx, %rdi + // 42: 48 89 c3 movq %rax, %rbx + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 48 89 d8 movq %rbx, %rax + // 4e: 48 85 c0 testq %rax, %rax + // 51: 75 e2 jne 0x35 <__JIT_ENTRY+0x35> + // 53: 49 83 c5 f8 addq $-0x8, %r13 + // 57: 5d popq %rbp + // 58: e9 00 00 00 00 jmp 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[93] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0f, + 0x48, 0x85, 0xc0, 0x74, 0x1e, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, + 0xc0, 0x75, 0xe2, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_GetIter+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetIter); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_32r(code + 0x59, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_LEN.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: ff 15 00 00 00 00 callq *(%rip) ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyObject_Size@GOTPCREL + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 48 85 c0 testq %rax, %rax + // 24: 78 1c js 0x42 <__JIT_ENTRY+0x42> + // 26: 48 89 c7 movq %rax, %rdi + // 29: ff 15 00 00 00 00 callq *(%rip) ## 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_GOT _PyLong_FromSsize_t@GOTPCREL + // 2f: 48 85 c0 testq %rax, %rax + // 32: 74 0e je 0x42 <__JIT_ENTRY+0x42> + // 34: 49 89 45 00 movq %rax, (%r13) + // 38: 49 83 c5 08 addq $0x8, %r13 + // 3c: 5d popq %rbp + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 000000000000003e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 42: 5d popq %rbp + // 43: e9 00 00 00 00 jmp 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[72] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x78, 0x1c, 0x48, 0x89, + 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_FromSsize_t+0x0 + // 8: &PyObject_Size+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x8, (uintptr_t)&PyObject_Size); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + -0x4); + patch_32r(code + 0x3e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x44, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__GET_YIELD_FROM_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_YIELD_FROM_ITER.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 48 8b 43 08 movq 0x8(%rbx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyCoro_Type@GOTPCREL + // 13: 74 43 je 0x58 <__JIT_ENTRY+0x58> + // 15: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT _PyGen_Type@GOTPCREL + // 1c: 74 49 je 0x67 <__JIT_ENTRY+0x67> + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 df movq %rbx, %rdi + // 26: ff 15 00 00 00 00 callq *(%rip) ## 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_GOT _PyObject_GetIter@GOTPCREL + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 85 c0 testq %rax, %rax + // 3d: 74 5f je 0x9e <__JIT_ENTRY+0x9e> + // 3f: 8b 0b movl (%rbx), %ecx + // 41: 85 c9 testl %ecx, %ecx + // 43: 78 5f js 0xa4 <__JIT_ENTRY+0xa4> + // 45: ff c9 decl %ecx + // 47: 89 0b movl %ecx, (%rbx) + // 49: 74 66 je 0xb1 <__JIT_ENTRY+0xb1> + // 4b: 48 89 c3 movq %rax, %rbx + // 4e: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 52: 5d popq %rbp + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 58: 49 8b 04 24 movq (%r12), %rax + // 5c: 0f b7 40 30 movzwl 0x30(%rax), %eax + // 60: a9 80 01 00 00 testl $0x180, %eax ## imm = 0x180 + // 65: 74 0a je 0x71 <__JIT_ENTRY+0x71> + // 67: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 6b: 5d popq %rbp + // 6c: e9 00 00 00 00 jmp 0x71 <__JIT_ENTRY+0x71> + // 000000000000006d: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 71: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 76: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x7d <__JIT_ENTRY+0x7d> + // 0000000000000079: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // 7d: 48 8b 30 movq (%rax), %rsi + // 80: 48 8d 15 40 00 00 00 leaq 0x40(%rip), %rdx ## 0xc7 <__JIT_ENTRY+0xc7> + // 0000000000000083: X86_64_RELOC_SIGNED __cstring + // 87: 4c 89 f7 movq %r14, %rdi + // 8a: ff 15 00 00 00 00 callq *(%rip) ## 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_GOT __PyErr_SetString@GOTPCREL + // 90: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 95: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9e: 5d popq %rbp + // 9f: e9 00 00 00 00 jmp 0xa4 <__JIT_ENTRY+0xa4> + // 00000000000000a0: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // a4: 48 89 c3 movq %rax, %rbx + // a7: 49 89 5d f8 movq %rbx, -0x8(%r13) + // ab: 5d popq %rbp + // ac: e9 00 00 00 00 jmp 0xb1 <__JIT_ENTRY+0xb1> + // 00000000000000ad: X86_64_RELOC_BRANCH __JIT_CONTINUE + // b1: 48 89 df movq %rbx, %rdi + // b4: 48 89 c3 movq %rax, %rbx + // b7: ff 15 00 00 00 00 callq *(%rip) ## 0xbd <__JIT_ENTRY+0xbd> + // 00000000000000b9: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // bd: 49 89 5d f8 movq %rbx, -0x8(%r13) + // c1: 5d popq %rbp + // c2: e9 00 00 00 00 jmp 0xc7 <__JIT_ENTRY+0xc7> + // 00000000000000c3: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[194] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x43, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x49, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x5f, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x5f, 0xff, 0xc9, 0x89, + 0x0b, 0x74, 0x66, 0x48, 0x89, 0xc3, 0x49, 0x89, + 0x5d, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x04, 0x24, 0x0f, 0xb7, 0x40, 0x30, + 0xa9, 0x80, 0x01, 0x00, 0x00, 0x74, 0x0a, 0x49, + 0x89, 0x5d, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, + 0x48, 0x8d, 0x15, 0x40, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, 0x49, + 0x89, 0x5d, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, + 0xf8, 0x5d, + }; + // 0: "cannot 'yield from' a coroutine object in a non-coroutine generator\x00" + // 44: 00 00 00 00 + // 48: &_Py_Dealloc+0x0 + // 50: &_PyErr_SetString+0x0 + // 58: &PyExc_TypeError+0x0 + // 60: &PyObject_GetIter+0x0 + // 68: &PyGen_Type+0x0 + // 70: &PyCoro_Type+0x0 + const unsigned char data_body[120] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x27, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x48, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x50, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x58, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x60, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x68, (uintptr_t)&PyGen_Type); + patch_64(data + 0x70, (uintptr_t)&PyCoro_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x5c); + patch_32r(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x6d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0x54); + patch_32r(code + 0x83, (uintptr_t)data + 0x103); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + 0x4c); + patch_32r(code + 0xa0, state->instruction_starts[instruction->error_target] + -0x4); + patch_32r(code + 0xad, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xb9, (uintptr_t)data + 0x44); +} + +void +emit__GUARD_BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BINARY_OP_EXTEND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 18: ff 50 08 callq *0x8(%rax) + // 1b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 20: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 29: 85 c0 testl %eax, %eax + // 2b: 74 06 je 0x33 <__JIT_ENTRY+0x33> + // 2d: 5d popq %rbp + // 2e: e9 00 00 00 00 jmp 0x33 <__JIT_ENTRY+0x33> + // 000000000000002f: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 33: 5d popq %rbp + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[57] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x50, 0x08, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_32r(code + 0x2f, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x35, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BOTH_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyFloat_Type@GOTPCREL + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 49 8b 45 f8 movq -0x8(%r13), %rax + // 19: 48 8b 40 08 movq 0x8(%rax), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyFloat_Type@GOTPCREL + // 24: 74 06 je 0x2c <__JIT_ENTRY+0x2c> + // 26: 5d popq %rbp + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[45] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x11, 0x49, 0x8b, 0x45, + 0xf8, 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + -0x4); + patch_32r(code + 0x28, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BOTH_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 49 8b 45 f8 movq -0x8(%r13), %rax + // 19: 48 8b 40 08 movq 0x8(%rax), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // 24: 74 06 je 0x2c <__JIT_ENTRY+0x2c> + // 26: 5d popq %rbp + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[45] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x11, 0x49, 0x8b, 0x45, + 0xf8, 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + -0x4); + patch_32r(code + 0x28, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BOTH_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_UNICODE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyUnicode_Type@GOTPCREL + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 49 8b 45 f8 movq -0x8(%r13), %rax + // 19: 48 8b 40 08 movq 0x8(%rax), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyUnicode_Type@GOTPCREL + // 24: 74 06 je 0x2c <__JIT_ENTRY+0x2c> + // 26: 5d popq %rbp + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[45] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x11, 0x49, 0x8b, 0x45, + 0xf8, 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyUnicode_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + -0x4); + patch_32r(code + 0x28, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_BUILTINS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BUILTINS_VERSION_PUSH_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 20 movq 0x20(%r12), %rax + // 9: 48 8b 48 08 movq 0x8(%rax), %rcx + // d: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x14 <__JIT_ENTRY+0x14> + // 0000000000000010: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // 14: 75 1e jne 0x34 <__JIT_ENTRY+0x34> + // 16: 48 8b 40 20 movq 0x20(%rax), %rax + // 1a: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 21: 39 48 0c cmpl %ecx, 0xc(%rax) + // 24: 75 0e jne 0x34 <__JIT_ENTRY+0x34> + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: 5d popq %rbp + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 34: 5d popq %rbp + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[58] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x20, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x1e, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x39, 0x48, 0x0c, 0x75, 0x0e, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyDict_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); + patch_32r(code + 0x30, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x36, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_DORV_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_NO_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 83 78 e8 00 cmpq $0x0, -0x18(%rax) + // d: 74 06 je 0x15 <__JIT_ENTRY+0x15> + // f: 5d popq %rbp + // 10: e9 00 00 00 00 jmp 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 48 8b 48 08 movq 0x8(%rax), %rcx + // 19: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 1d: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 22: 74 eb je 0xf <__JIT_ENTRY+0xf> + // 24: 5d popq %rbp + // 25: e9 00 00 00 00 jmp 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[37] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x83, 0x78, 0xe8, 0x00, 0x74, 0x06, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x8b, 0x49, 0x20, 0x80, 0x7c, 0x08, + 0x03, 0x00, 0x74, 0xeb, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 10: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 15: 74 06 je 0x1d <__JIT_ENTRY+0x1d> + // 17: 5d popq %rbp + // 18: e9 00 00 00 00 jmp 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1d: 5d popq %rbp + // 1e: e9 00 00 00 00 jmp 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[35] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x08, 0x48, 0x8b, 0x49, 0x20, + 0x80, 0x7c, 0x08, 0x03, 0x00, 0x74, 0x06, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x19, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x1f, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_GLOBALS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 9: 48 8b 48 08 movq 0x8(%rax), %rcx + // d: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x14 <__JIT_ENTRY+0x14> + // 0000000000000010: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // 14: 75 16 jne 0x2c <__JIT_ENTRY+0x2c> + // 16: 48 8b 40 20 movq 0x20(%rax), %rax + // 1a: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 21: 39 48 0c cmpl %ecx, 0xc(%rax) + // 24: 75 06 jne 0x2c <__JIT_ENTRY+0x2c> + // 26: 5d popq %rbp + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2c: 5d popq %rbp + // 2d: e9 00 00 00 00 jmp 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[50] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x18, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x16, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x39, 0x48, 0x0c, 0x75, 0x06, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyDict_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); + patch_32r(code + 0x28, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x2e, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_GLOBALS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION_PUSH_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 9: 48 8b 48 08 movq 0x8(%rax), %rcx + // d: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x14 <__JIT_ENTRY+0x14> + // 0000000000000010: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // 14: 75 1e jne 0x34 <__JIT_ENTRY+0x34> + // 16: 48 8b 40 20 movq 0x20(%rax), %rax + // 1a: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 21: 39 48 0c cmpl %ecx, 0xc(%rax) + // 24: 75 0e jne 0x34 <__JIT_ENTRY+0x34> + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: 5d popq %rbp + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 34: 5d popq %rbp + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[58] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x18, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x1e, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x39, 0x48, 0x0c, 0x75, 0x0e, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: &PyDict_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); + patch_32r(code + 0x30, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x36, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_FALSE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_FALSE_POP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __Py_FalseStruct@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &_Py_FalseStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NONE_POP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // f: 0f 84 00 00 00 00 je 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 15: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1a: 8b 07 movl (%rdi), %eax + // 1c: 85 c0 testl %eax, %eax + // 1e: 78 06 js 0x26 <__JIT_ENTRY+0x26> + // 20: ff c8 decl %eax + // 22: 89 07 movl %eax, (%rdi) + // 24: 74 13 je 0x39 <__JIT_ENTRY+0x39> + // 26: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 39: 55 pushq %rbp + // 3a: 48 89 e5 movq %rsp, %rbp + // 3d: ff 15 00 00 00 00 callq *(%rip) ## 0x43 <__JIT_ENTRY+0x43> + // 000000000000003f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 43: 5d popq %rbp + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: e9 00 00 00 00 jmp 0x57 <__JIT_ENTRY+0x57> + // 0000000000000053: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[87] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x84, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_NoneStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_32r(code + 0x11, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x35, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + -0x4); + patch_32r(code + 0x53, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_NOT_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NOT_NONE_POP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 8b 03 movl (%rbx), %eax + // 13: 85 c0 testl %eax, %eax + // 15: 78 06 js 0x1d <__JIT_ENTRY+0x1d> + // 17: ff c8 decl %eax + // 19: 89 03 movl %eax, (%rbx) + // 1b: 74 1d je 0x3a <__JIT_ENTRY+0x3a> + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 48 3b 1d 00 00 00 00 cmpq (%rip), %rbx ## 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // 32: 74 26 je 0x5a <__JIT_ENTRY+0x5a> + // 34: 5d popq %rbp + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3a: 48 89 df movq %rbx, %rdi + // 3d: ff 15 00 00 00 00 callq *(%rip) ## 0x43 <__JIT_ENTRY+0x43> + // 000000000000003f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 43: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 48: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 51: 48 3b 1d 00 00 00 00 cmpq (%rip), %rbx ## 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // 58: 75 da jne 0x34 <__JIT_ENTRY+0x34> + // 5a: 5d popq %rbp + // 5b: e9 00 00 00 00 jmp 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[96] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x1d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x3b, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x26, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x3b, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0xda, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + -0x4); + patch_32r(code + 0x36, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + -0x4); + patch_32r(code + 0x5c, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_IS_TRUE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_TRUE_POP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __Py_TrueStruct@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_KEYS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_KEYS_VERSION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 8b 80 70 03 00 00 movq 0x370(%rax), %rax + // 13: 8b 40 0c movl 0xc(%rax), %eax + // 16: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 1c: 75 06 jne 0x24 <__JIT_ENTRY+0x24> + // 1e: 5d popq %rbp + // 1f: e9 00 00 00 00 jmp 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 24: 5d popq %rbp + // 25: e9 00 00 00 00 jmp 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[42] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x8b, 0x80, 0x70, + 0x03, 0x00, 0x00, 0x8b, 0x40, 0x0c, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x06, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + -0x4); + patch_32r(code + 0x20, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyFloat_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_LIST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 18 movq 0x18(%rax), %rcx + // c: 48 85 c9 testq %rcx, %rcx + // f: 74 10 je 0x21 <__JIT_ENTRY+0x21> + // 11: 48 8b 50 10 movq 0x10(%rax), %rdx + // 15: 48 3b 51 10 cmpq 0x10(%rcx), %rdx + // 19: 73 0c jae 0x27 <__JIT_ENTRY+0x27> + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 21: 5d popq %rbp + // 22: e9 00 00 00 00 jmp 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 27: 48 c7 40 10 ff ff ff ff movq $-0x1, 0x10(%rax) + // 2f: 5d popq %rbp + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 0000000000000031: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[53] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x18, 0x48, 0x85, 0xc9, 0x74, + 0x10, 0x48, 0x8b, 0x50, 0x10, 0x48, 0x3b, 0x51, + 0x10, 0x73, 0x0c, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0x40, 0x10, 0xff, 0xff, 0xff, 0xff, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x23, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x31, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_RANGE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 83 78 20 00 cmpq $0x0, 0x20(%rax) + // d: 7e 06 jle 0x15 <__JIT_ENTRY+0x15> + // f: 5d popq %rbp + // 10: e9 00 00 00 00 jmp 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[27] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x83, 0x78, 0x20, 0x00, 0x7e, 0x06, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 18 movq 0x18(%rax), %rcx + // c: 48 85 c9 testq %rcx, %rcx + // f: 74 10 je 0x21 <__JIT_ENTRY+0x21> + // 11: 48 8b 40 10 movq 0x10(%rax), %rax + // 15: 48 3b 41 10 cmpq 0x10(%rcx), %rax + // 19: 7d 06 jge 0x21 <__JIT_ENTRY+0x21> + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 21: 5d popq %rbp + // 22: e9 00 00 00 00 jmp 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[39] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x18, 0x48, 0x85, 0xc9, 0x74, + 0x10, 0x48, 0x8b, 0x40, 0x10, 0x48, 0x3b, 0x41, + 0x10, 0x7d, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x23, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_FLOAT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyFloat_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyFloat_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyLong_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TYPE_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // 12: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 18: 75 06 jne 0x20 <__JIT_ENTRY+0x20> + // 1a: 5d popq %rbp + // 1b: e9 00 00 00 00 jmp 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 20: 5d popq %rbp + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 0000000000000022: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[38] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x8b, 0x80, 0x80, 0x01, + 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_32r(code + 0x1c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__GUARD_TYPE_VERSION_AND_LOCK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION_AND_LOCK.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // 12: 3b 05 00 00 00 00 cmpl (%rip), %eax ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 18: 75 06 jne 0x20 <__JIT_ENTRY+0x20> + // 1a: 5d popq %rbp + // 1b: e9 00 00 00 00 jmp 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 20: 5d popq %rbp + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 0000000000000022: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[38] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x8b, 0x80, 0x80, 0x01, + 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_32r(code + 0x1c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__IMPORT_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_FROM.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 48 8b 40 20 movq 0x20(%rax), %rax + // 10: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 17: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 4c 89 f7 movq %r14, %rdi + // 24: ff 15 00 00 00 00 callq *(%rip) ## 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_GOT __PyEval_ImportFrom@GOTPCREL + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 48 85 c0 testq %rax, %rax + // 3b: 74 0e je 0x4b <__JIT_ENTRY+0x4b> + // 3d: 49 89 45 00 movq %rax, (%r13) + // 41: 49 83 c5 08 addq $0x8, %r13 + // 45: 5d popq %rbp + // 46: e9 00 00 00 00 jmp 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 4b: 5d popq %rbp + // 4c: e9 00 00 00 00 jmp 0x51 <__JIT_ENTRY+0x51> + // 000000000000004d: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[81] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x20, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x54, 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_PyEval_ImportFrom+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_ImportFrom); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + -0x4); + patch_32r(code + 0x47, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x4d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__IMPORT_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_NAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 f7 movq %r14, %rdi + // b: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // f: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 13: 49 8b 04 24 movq (%r12), %rax + // 17: 48 8b 40 20 movq 0x20(%rax), %rax + // 1b: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x22 <__JIT_ENTRY+0x22> + // 000000000000001e: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 22: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // 30: 4c 89 e6 movq %r12, %rsi + // 33: 48 89 d9 movq %rbx, %rcx + // 36: 4d 89 f8 movq %r15, %r8 + // 39: ff 15 00 00 00 00 callq *(%rip) ## 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_GOT __PyEval_ImportName@GOTPCREL + // 3f: 49 89 c6 movq %rax, %r14 + // 42: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 47: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 50: 41 8b 07 movl (%r15), %eax + // 53: 85 c0 testl %eax, %eax + // 55: 78 10 js 0x67 <__JIT_ENTRY+0x67> + // 57: ff c8 decl %eax + // 59: 41 89 07 movl %eax, (%r15) + // 5c: 75 09 jne 0x67 <__JIT_ENTRY+0x67> + // 5e: 4c 89 ff movq %r15, %rdi + // 61: ff 15 00 00 00 00 callq *(%rip) ## 0x67 <__JIT_ENTRY+0x67> + // 0000000000000063: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 67: 8b 03 movl (%rbx), %eax + // 69: 85 c0 testl %eax, %eax + // 6b: 78 06 js 0x73 <__JIT_ENTRY+0x73> + // 6d: ff c8 decl %eax + // 6f: 89 03 movl %eax, (%rbx) + // 71: 74 1b je 0x8e <__JIT_ENTRY+0x8e> + // 73: 4d 85 f6 testq %r14, %r14 + // 76: 74 24 je 0x9c <__JIT_ENTRY+0x9c> + // 78: 4d 89 75 f0 movq %r14, -0x10(%r13) + // 7c: 49 83 c5 f8 addq $-0x8, %r13 + // 80: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 84: 48 83 c4 10 addq $0x10, %rsp + // 88: 5d popq %rbp + // 89: e9 00 00 00 00 jmp 0x8e <__JIT_ENTRY+0x8e> + // 000000000000008a: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 8e: 48 89 df movq %rbx, %rdi + // 91: ff 15 00 00 00 00 callq *(%rip) ## 0x97 <__JIT_ENTRY+0x97> + // 0000000000000093: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 97: 4d 85 f6 testq %r14, %r14 + // 9a: 75 dc jne 0x78 <__JIT_ENTRY+0x78> + // 9c: 49 83 c5 f0 addq $-0x10, %r13 + // a0: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // a4: 48 83 c4 10 addq $0x10, %rsp + // a8: 5d popq %rbp + // a9: e9 00 00 00 00 jmp 0xae <__JIT_ENTRY+0xae> + // 00000000000000aa: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[174] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xf7, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, + 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, + 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x54, 0xc8, 0x18, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0x75, 0xf8, + 0x4c, 0x89, 0xe6, 0x48, 0x89, 0xd9, 0x4d, 0x89, + 0xf8, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x03, 0x74, 0x1b, 0x4d, 0x85, 0xf6, 0x74, 0x24, + 0x4d, 0x89, 0x75, 0xf0, 0x49, 0x83, 0xc5, 0xf8, + 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x85, 0xf6, 0x75, 0xdc, 0x49, 0x83, 0xc5, 0xf0, + 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_ImportName+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportName); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + -0x4); + patch_32r(code + 0x8a, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + -0x4); + patch_32r(code + 0xaa, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_BOUND_METHOD_EXACT_ARGS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: ba fe ff ff ff movl $0xfffffffe, %edx ## imm = 0xFFFFFFFE + // c: 29 c2 subl %eax, %edx + // e: f7 d0 notl %eax + // 10: 48 63 c8 movslq %eax, %rcx + // 13: 48 63 c2 movslq %edx, %rax + // 16: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1b: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 1f: 8b 3e movl (%rsi), %edi + // 21: 85 ff testl %edi, %edi + // 23: 78 04 js 0x29 <__JIT_ENTRY+0x29> + // 25: ff c7 incl %edi + // 27: 89 3e movl %edi, (%rsi) + // 29: 49 89 74 cd 00 movq %rsi, (%r13,%rcx,8) + // 2e: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 33: 48 8b 4a 10 movq 0x10(%rdx), %rcx + // 37: 8b 11 movl (%rcx), %edx + // 39: 85 d2 testl %edx, %edx + // 3b: 78 04 js 0x41 <__JIT_ENTRY+0x41> + // 3d: ff c2 incl %edx + // 3f: 89 11 movl %edx, (%rcx) + // 41: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 46: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4b: 8b 07 movl (%rdi), %eax + // 4d: 85 c0 testl %eax, %eax + // 4f: 78 06 js 0x57 <__JIT_ENTRY+0x57> + // 51: ff c8 decl %eax + // 53: 89 07 movl %eax, (%rdi) + // 55: 74 13 je 0x6a <__JIT_ENTRY+0x6a> + // 57: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 0000000000000066: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6a: 55 pushq %rbp + // 6b: 48 89 e5 movq %rsp, %rbp + // 6e: ff 15 00 00 00 00 callq *(%rip) ## 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 74: 5d popq %rbp + // 75: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[131] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xba, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc2, 0xf7, 0xd0, + 0x48, 0x63, 0xc8, 0x48, 0x63, 0xc2, 0x49, 0x8b, + 0x54, 0xc5, 0x00, 0x48, 0x8b, 0x72, 0x18, 0x8b, + 0x3e, 0x85, 0xff, 0x78, 0x04, 0xff, 0xc7, 0x89, + 0x3e, 0x49, 0x89, 0x74, 0xcd, 0x00, 0x49, 0x8b, + 0x7c, 0xc5, 0x00, 0x48, 0x8b, 0x4a, 0x10, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x4); + patch_32r(code + 0x66, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + -0x4); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 35 00 00 00 00 movzwl (%rip), %esi ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: 89 f0 movl %esi, %eax + // 9: f7 d0 notl %eax + // b: 48 98 cltq + // d: b9 fe ff ff ff movl $0xfffffffe, %ecx ## imm = 0xFFFFFFFE + // 12: 29 f1 subl %esi, %ecx + // 14: 48 63 c9 movslq %ecx, %rcx + // 17: 4d 8b 54 c5 00 movq (%r13,%rax,8), %r10 + // 1c: 49 83 fa 01 cmpq $0x1, %r10 + // 20: 89 f3 movl %esi, %ebx + // 22: 83 db ff sbbl $-0x1, %ebx + // 25: 4d 8b 44 cd 00 movq (%r13,%rcx,8), %r8 + // 2a: 49 8b 78 30 movq 0x30(%r8), %rdi + // 2e: 49 8b 96 f0 00 00 00 movq 0xf0(%r14), %rdx + // 35: 4c 63 4f 4c movslq 0x4c(%rdi), %r9 + // 39: 4e 8d 0c ca leaq (%rdx,%r9,8), %r9 + // 3d: 4d 89 8e f0 00 00 00 movq %r9, 0xf0(%r14) + // 44: 4c 89 62 08 movq %r12, 0x8(%rdx) + // 48: 4c 89 42 10 movq %r8, 0x10(%rdx) + // 4c: 44 8b 0f movl (%rdi), %r9d + // 4f: 45 85 c9 testl %r9d, %r9d + // 52: 78 06 js 0x5a <__JIT_ENTRY+0x5a> + // 54: 41 ff c1 incl %r9d + // 57: 44 89 0f movl %r9d, (%rdi) + // 5a: 55 pushq %rbp + // 5b: 48 89 e5 movq %rsp, %rbp + // 5e: 48 8d 04 c5 00 00 00 00 leaq (,%rax,8), %rax + // 66: 4c 01 e8 addq %r13, %rax + // 69: 48 89 3a movq %rdi, (%rdx) + // 6c: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 71: 0f 11 42 18 movups %xmm0, 0x18(%rdx) + // 75: 48 c7 42 28 00 00 00 00 movq $0x0, 0x28(%rdx) + // 7d: 4c 8d 4a 50 leaq 0x50(%rdx), %r9 + // 81: 4c 63 47 48 movslq 0x48(%rdi), %r8 + // 85: 4e 8d 5c c2 50 leaq 0x50(%rdx,%r8,8), %r11 + // 8a: 4c 89 5a 40 movq %r11, 0x40(%rdx) + // 8e: 48 c7 42 30 00 00 00 00 movq $0x0, 0x30(%rdx) + // 96: 4c 8d 9f d0 00 00 00 leaq 0xd0(%rdi), %r11 + // 9d: 4c 89 5a 38 movq %r11, 0x38(%rdx) + // a1: c7 42 48 00 00 00 00 movl $0x0, 0x48(%rdx) + // a8: 41 39 d8 cmpl %ebx, %r8d + // ab: 7e 17 jle 0xc4 <__JIT_ENTRY+0xc4> + // ad: 41 89 d8 movl %ebx, %r8d + // b0: 4b c7 04 c1 00 00 00 00 movq $0x0, (%r9,%r8,8) + // b8: 49 ff c0 incq %r8 + // bb: 4c 63 5f 48 movslq 0x48(%rdi), %r11 + // bf: 4d 39 d8 cmpq %r11, %r8 + // c2: 7c ec jl 0xb0 <__JIT_ENTRY+0xb0> + // c4: 45 31 c0 xorl %r8d, %r8d + // c7: 4d 85 d2 testq %r10, %r10 + // ca: 0f 95 c3 setne %bl + // cd: 48 8b 38 movq (%rax), %rdi + // d0: 49 89 39 movq %rdi, (%r9) + // d3: 48 8b 3d 00 00 00 00 movq (%rip), %rdi ## 0xda <__JIT_ENTRY+0xda> + // 00000000000000d6: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // da: 66 85 ff testw %di, %di + // dd: 0f 84 15 01 00 00 je 0x1f8 <__JIT_ENTRY+0x1f8> + // e3: 41 88 d8 movb %bl, %r8b + // e6: 48 8b 3d 00 00 00 00 movq (%rip), %rdi ## 0xed <__JIT_ENTRY+0xed> + // 00000000000000e9: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // ed: 0f b7 ff movzwl %di, %edi + // f0: 66 83 ff 11 cmpw $0x11, %di + // f4: 76 2a jbe 0x120 <__JIT_ENTRY+0x120> + // f6: 45 31 db xorl %r11d, %r11d + // f9: 4d 85 d2 testq %r10, %r10 + // fc: 41 0f 95 c3 setne %r11b + // 100: 4e 8d 14 da leaq (%rdx,%r11,8), %r10 + // 104: 44 8d 3c fd 00 00 00 00 leal (,%rdi,8), %r15d + // 10c: 4d 01 fa addq %r15, %r10 + // 10f: 4d 29 ea subq %r13, %r10 + // 112: 49 83 c2 50 addq $0x50, %r10 + // 116: 49 83 fa 20 cmpq $0x20, %r10 + // 11a: 0f 83 91 00 00 00 jae 0x1b1 <__JIT_ENTRY+0x1b1> + // 120: 45 31 d2 xorl %r10d, %r10d + // 123: 48 89 fb movq %rdi, %rbx + // 126: 4d 89 d3 movq %r10, %r11 + // 129: 48 83 e3 03 andq $0x3, %rbx + // 12d: 74 21 je 0x150 <__JIT_ENTRY+0x150> + // 12f: c1 e6 03 shll $0x3, %esi + // 132: 4d 89 ef movq %r13, %r15 + // 135: 49 29 f7 subq %rsi, %r15 + // 138: 4b 8d 34 c1 leaq (%r9,%r8,8), %rsi + // 13c: 4d 89 d3 movq %r10, %r11 + // 13f: 90 nop + // 140: 4f 8b 0c df movq (%r15,%r11,8), %r9 + // 144: 4e 89 0c de movq %r9, (%rsi,%r11,8) + // 148: 49 ff c3 incq %r11 + // 14b: 48 ff cb decq %rbx + // 14e: 75 f0 jne 0x140 <__JIT_ENTRY+0x140> + // 150: 49 29 fa subq %rdi, %r10 + // 153: 49 83 fa fc cmpq $-0x4, %r10 + // 157: 0f 87 9b 00 00 00 ja 0x1f8 <__JIT_ENTRY+0x1f8> + // 15d: 44 8d 0c fd 00 00 00 00 leal (,%rdi,8), %r9d + // 165: 4c 89 ee movq %r13, %rsi + // 168: 4c 29 ce subq %r9, %rsi + // 16b: 48 83 c6 18 addq $0x18, %rsi + // 16f: 4e 8d 04 c2 leaq (%rdx,%r8,8), %r8 + // 173: 49 83 c0 68 addq $0x68, %r8 + // 177: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 180: 4e 8b 4c de e8 movq -0x18(%rsi,%r11,8), %r9 + // 185: 4f 89 4c d8 e8 movq %r9, -0x18(%r8,%r11,8) + // 18a: 4e 8b 4c de f0 movq -0x10(%rsi,%r11,8), %r9 + // 18f: 4f 89 4c d8 f0 movq %r9, -0x10(%r8,%r11,8) + // 194: 4e 8b 4c de f8 movq -0x8(%rsi,%r11,8), %r9 + // 199: 4f 89 4c d8 f8 movq %r9, -0x8(%r8,%r11,8) + // 19e: 4e 8b 0c de movq (%rsi,%r11,8), %r9 + // 1a2: 4f 89 0c d8 movq %r9, (%r8,%r11,8) + // 1a6: 49 83 c3 04 addq $0x4, %r11 + // 1aa: 4c 39 df cmpq %r11, %rdi + // 1ad: 75 d1 jne 0x180 <__JIT_ENTRY+0x180> + // 1af: eb 47 jmp 0x1f8 <__JIT_ENTRY+0x1f8> + // 1b1: 41 89 fa movl %edi, %r10d + // 1b4: 41 83 e2 fc andl $-0x4, %r10d + // 1b8: 4e 8d 1c c2 leaq (%rdx,%r8,8), %r11 + // 1bc: 49 83 c3 60 addq $0x60, %r11 + // 1c0: 4c 89 eb movq %r13, %rbx + // 1c3: 4c 29 fb subq %r15, %rbx + // 1c6: 48 83 c3 10 addq $0x10, %rbx + // 1ca: 45 31 ff xorl %r15d, %r15d + // 1cd: 0f 1f 00 nopl (%rax) + // 1d0: 42 0f 10 44 fb f0 movups -0x10(%rbx,%r15,8), %xmm0 + // 1d6: 42 0f 10 0c fb movups (%rbx,%r15,8), %xmm1 + // 1db: 43 0f 11 44 fb f0 movups %xmm0, -0x10(%r11,%r15,8) + // 1e1: 43 0f 11 0c fb movups %xmm1, (%r11,%r15,8) + // 1e6: 49 83 c7 04 addq $0x4, %r15 + // 1ea: 4d 39 fa cmpq %r15, %r10 + // 1ed: 75 e1 jne 0x1d0 <__JIT_ENTRY+0x1d0> + // 1ef: 41 39 fa cmpl %edi, %r10d + // 1f2: 0f 85 2b ff ff ff jne 0x123 <__JIT_ENTRY+0x123> + // 1f8: 49 89 54 cd 00 movq %rdx, (%r13,%rcx,8) + // 1fd: 49 89 c5 movq %rax, %r13 + // 200: 5d popq %rbp + // 201: e9 00 00 00 00 jmp 0x206 <__JIT_ENTRY+0x206> + // 0000000000000202: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[513] = { + 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0xf7, 0xd0, 0x48, 0x98, 0xb9, 0xfe, 0xff, + 0xff, 0xff, 0x29, 0xf1, 0x48, 0x63, 0xc9, 0x4d, + 0x8b, 0x54, 0xc5, 0x00, 0x49, 0x83, 0xfa, 0x01, + 0x89, 0xf3, 0x83, 0xdb, 0xff, 0x4d, 0x8b, 0x44, + 0xcd, 0x00, 0x49, 0x8b, 0x78, 0x30, 0x49, 0x8b, + 0x96, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x4f, + 0x4c, 0x4e, 0x8d, 0x0c, 0xca, 0x4d, 0x89, 0x8e, + 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x62, 0x08, + 0x4c, 0x89, 0x42, 0x10, 0x44, 0x8b, 0x0f, 0x45, + 0x85, 0xc9, 0x78, 0x06, 0x41, 0xff, 0xc1, 0x44, + 0x89, 0x0f, 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8d, + 0x04, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x01, + 0xe8, 0x48, 0x89, 0x3a, 0x41, 0x0f, 0x10, 0x40, + 0x10, 0x0f, 0x11, 0x42, 0x18, 0x48, 0xc7, 0x42, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x4a, + 0x50, 0x4c, 0x63, 0x47, 0x48, 0x4e, 0x8d, 0x5c, + 0xc2, 0x50, 0x4c, 0x89, 0x5a, 0x40, 0x48, 0xc7, + 0x42, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, + 0x9f, 0xd0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x5a, + 0x38, 0xc7, 0x42, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x39, 0xd8, 0x7e, 0x17, 0x41, 0x89, 0xd8, + 0x4b, 0xc7, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc0, 0x4c, 0x63, 0x5f, 0x48, 0x4d, + 0x39, 0xd8, 0x7c, 0xec, 0x45, 0x31, 0xc0, 0x4d, + 0x85, 0xd2, 0x0f, 0x95, 0xc3, 0x48, 0x8b, 0x38, + 0x49, 0x89, 0x39, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xff, 0x0f, 0x84, 0x15, + 0x01, 0x00, 0x00, 0x41, 0x88, 0xd8, 0x48, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xff, + 0x66, 0x83, 0xff, 0x11, 0x76, 0x2a, 0x45, 0x31, + 0xdb, 0x4d, 0x85, 0xd2, 0x41, 0x0f, 0x95, 0xc3, + 0x4e, 0x8d, 0x14, 0xda, 0x44, 0x8d, 0x3c, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0xfa, 0x4d, + 0x29, 0xea, 0x49, 0x83, 0xc2, 0x50, 0x49, 0x83, + 0xfa, 0x20, 0x0f, 0x83, 0x91, 0x00, 0x00, 0x00, + 0x45, 0x31, 0xd2, 0x48, 0x89, 0xfb, 0x4d, 0x89, + 0xd3, 0x48, 0x83, 0xe3, 0x03, 0x74, 0x21, 0xc1, + 0xe6, 0x03, 0x4d, 0x89, 0xef, 0x49, 0x29, 0xf7, + 0x4b, 0x8d, 0x34, 0xc1, 0x4d, 0x89, 0xd3, 0x90, + 0x4f, 0x8b, 0x0c, 0xdf, 0x4e, 0x89, 0x0c, 0xde, + 0x49, 0xff, 0xc3, 0x48, 0xff, 0xcb, 0x75, 0xf0, + 0x49, 0x29, 0xfa, 0x49, 0x83, 0xfa, 0xfc, 0x0f, + 0x87, 0x9b, 0x00, 0x00, 0x00, 0x44, 0x8d, 0x0c, + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, + 0x4c, 0x29, 0xce, 0x48, 0x83, 0xc6, 0x18, 0x4e, + 0x8d, 0x04, 0xc2, 0x49, 0x83, 0xc0, 0x68, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x8b, 0x4c, 0xde, 0xe8, 0x4f, 0x89, 0x4c, + 0xd8, 0xe8, 0x4e, 0x8b, 0x4c, 0xde, 0xf0, 0x4f, + 0x89, 0x4c, 0xd8, 0xf0, 0x4e, 0x8b, 0x4c, 0xde, + 0xf8, 0x4f, 0x89, 0x4c, 0xd8, 0xf8, 0x4e, 0x8b, + 0x0c, 0xde, 0x4f, 0x89, 0x0c, 0xd8, 0x49, 0x83, + 0xc3, 0x04, 0x4c, 0x39, 0xdf, 0x75, 0xd1, 0xeb, + 0x47, 0x41, 0x89, 0xfa, 0x41, 0x83, 0xe2, 0xfc, + 0x4e, 0x8d, 0x1c, 0xc2, 0x49, 0x83, 0xc3, 0x60, + 0x4c, 0x89, 0xeb, 0x4c, 0x29, 0xfb, 0x48, 0x83, + 0xc3, 0x10, 0x45, 0x31, 0xff, 0x0f, 0x1f, 0x00, + 0x42, 0x0f, 0x10, 0x44, 0xfb, 0xf0, 0x42, 0x0f, + 0x10, 0x0c, 0xfb, 0x43, 0x0f, 0x11, 0x44, 0xfb, + 0xf0, 0x43, 0x0f, 0x11, 0x0c, 0xfb, 0x49, 0x83, + 0xc7, 0x04, 0x4d, 0x39, 0xfa, 0x75, 0xe1, 0x41, + 0x39, 0xfa, 0x0f, 0x85, 0x2b, 0xff, 0xff, 0xff, + 0x49, 0x89, 0x54, 0xcd, 0x00, 0x49, 0x89, 0xc5, + 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + -0x4); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_0.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 45 f0 movq -0x10(%r13), %r8 + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 31 ff xorl %edi, %edi + // a: 48 85 f6 testq %rsi, %rsi + // d: 40 0f 95 c7 setne %dil + // 11: 49 8b 50 30 movq 0x30(%r8), %rdx + // 15: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1c: 48 63 42 4c movslq 0x4c(%rdx), %rax + // 20: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 24: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2b: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 2f: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 33: 8b 02 movl (%rdx), %eax + // 35: 85 c0 testl %eax, %eax + // 37: 78 04 js 0x3d <__JIT_ENTRY+0x3d> + // 39: ff c0 incl %eax + // 3b: 89 02 movl %eax, (%rdx) + // 3d: 55 pushq %rbp + // 3e: 48 89 e5 movq %rsp, %rbp + // 41: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 45: 48 89 11 movq %rdx, (%rcx) + // 48: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 4d: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 51: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 59: 4c 63 42 48 movslq 0x48(%rdx), %r8 + // 5d: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 62: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 66: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 6e: 4c 8d 8a d0 00 00 00 leaq 0xd0(%rdx), %r9 + // 75: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 79: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 80: 41 39 f8 cmpl %edi, %r8d + // 83: 7e 2f jle 0xb4 <__JIT_ENTRY+0xb4> + // 85: 48 8d 79 50 leaq 0x50(%rcx), %rdi + // 89: 45 31 c0 xorl %r8d, %r8d + // 8c: 48 85 f6 testq %rsi, %rsi + // 8f: 41 0f 95 c0 setne %r8b + // 93: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // a0: 4a c7 04 c7 00 00 00 00 movq $0x0, (%rdi,%r8,8) + // a8: 49 ff c0 incq %r8 + // ab: 48 63 72 48 movslq 0x48(%rdx), %rsi + // af: 49 39 f0 cmpq %rsi, %r8 + // b2: 7c ec jl 0xa0 <__JIT_ENTRY+0xa0> + // b4: 49 8b 55 f8 movq -0x8(%r13), %rdx + // b8: 48 89 51 50 movq %rdx, 0x50(%rcx) + // bc: 49 89 4d f0 movq %rcx, -0x10(%r13) + // c0: 49 89 c5 movq %rax, %r13 + // c3: 5d popq %rbp + // c4: e9 00 00 00 00 jmp 0xc9 <__JIT_ENTRY+0xc9> + // 00000000000000c5: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[196] = { + 0x4d, 0x8b, 0x45, 0xf0, 0x49, 0x8b, 0x75, 0xf8, + 0x31, 0xff, 0x48, 0x85, 0xf6, 0x40, 0x0f, 0x95, + 0xc7, 0x49, 0x8b, 0x50, 0x30, 0x49, 0x8b, 0x8e, + 0xf0, 0x00, 0x00, 0x00, 0x48, 0x63, 0x42, 0x4c, + 0x48, 0x8d, 0x04, 0xc1, 0x49, 0x89, 0x86, 0xf0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x61, 0x08, 0x4c, + 0x89, 0x41, 0x10, 0x8b, 0x02, 0x85, 0xc0, 0x78, + 0x04, 0xff, 0xc0, 0x89, 0x02, 0x55, 0x48, 0x89, + 0xe5, 0x49, 0x8d, 0x45, 0xf8, 0x48, 0x89, 0x11, + 0x41, 0x0f, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x41, + 0x18, 0x48, 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x63, 0x42, 0x48, 0x4e, 0x8d, 0x4c, + 0xc1, 0x50, 0x4c, 0x89, 0x49, 0x40, 0x48, 0xc7, + 0x41, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, + 0x8a, 0xd0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x49, + 0x38, 0xc7, 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x39, 0xf8, 0x7e, 0x2f, 0x48, 0x8d, 0x79, + 0x50, 0x45, 0x31, 0xc0, 0x48, 0x85, 0xf6, 0x41, + 0x0f, 0x95, 0xc0, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0xc7, 0x04, 0xc7, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc0, 0x48, 0x63, 0x72, 0x48, 0x49, + 0x39, 0xf0, 0x7c, 0xec, 0x49, 0x8b, 0x55, 0xf8, + 0x48, 0x89, 0x51, 0x50, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 45 e8 movq -0x18(%r13), %r8 + // 4: 49 8b 55 f0 movq -0x10(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 01 00 00 00 movl $0x1, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <__JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 55 pushq %rbp + // 41: 48 89 e5 movq %rsp, %rbp + // 44: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 48: 48 89 31 movq %rsi, (%rcx) + // 4b: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 50: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 54: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5c: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 60: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 65: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 69: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 71: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 78: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 7c: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 83: 41 39 f8 cmpl %edi, %r8d + // 86: 7e 1c jle 0xa4 <__JIT_ENTRY+0xa4> + // 88: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8c: 89 ff movl %edi, %edi + // 8e: 66 90 nop + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <__JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 f0 movq -0x10(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 f8 movq -0x8(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 89 4d e8 movq %rcx, -0x18(%r13) + // c2: 49 89 c5 movq %rax, %r13 + // c5: 5d popq %rbp + // c6: e9 00 00 00 00 jmp 0xcb <__JIT_ENTRY+0xcb> + // 00000000000000c7: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[198] = { + 0x4d, 0x8b, 0x45, 0xe8, 0x49, 0x8b, 0x55, 0xf0, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x01, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8d, 0x45, 0xf0, + 0x48, 0x89, 0x31, 0x41, 0x0f, 0x10, 0x40, 0x10, + 0x0f, 0x11, 0x41, 0x18, 0x48, 0xc7, 0x41, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x46, 0x48, + 0x4e, 0x8d, 0x4c, 0xc1, 0x50, 0x4c, 0x89, 0x49, + 0x40, 0x48, 0xc7, 0x41, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x8e, 0xd0, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x49, 0x38, 0xc7, 0x41, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x39, 0xf8, 0x7e, 0x1c, + 0x4c, 0x8d, 0x41, 0x50, 0x89, 0xff, 0x66, 0x90, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xf0, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x89, + 0x4d, 0xe8, 0x49, 0x89, 0xc5, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_2.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 45 e0 movq -0x20(%r13), %r8 + // 4: 49 8b 55 e8 movq -0x18(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 02 00 00 00 movl $0x2, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <__JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 55 pushq %rbp + // 41: 48 89 e5 movq %rsp, %rbp + // 44: 49 8d 45 e8 leaq -0x18(%r13), %rax + // 48: 48 89 31 movq %rsi, (%rcx) + // 4b: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 50: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 54: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5c: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 60: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 65: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 69: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 71: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 78: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 7c: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 83: 41 39 f8 cmpl %edi, %r8d + // 86: 7e 1c jle 0xa4 <__JIT_ENTRY+0xa4> + // 88: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8c: 89 ff movl %edi, %edi + // 8e: 66 90 nop + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <__JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 e8 movq -0x18(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 f0 movq -0x10(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // c7: 49 89 4d e0 movq %rcx, -0x20(%r13) + // cb: 49 89 c5 movq %rax, %r13 + // ce: 5d popq %rbp + // cf: e9 00 00 00 00 jmp 0xd4 <__JIT_ENTRY+0xd4> + // 00000000000000d0: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[207] = { + 0x4d, 0x8b, 0x45, 0xe0, 0x49, 0x8b, 0x55, 0xe8, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x02, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8d, 0x45, 0xe8, + 0x48, 0x89, 0x31, 0x41, 0x0f, 0x10, 0x40, 0x10, + 0x0f, 0x11, 0x41, 0x18, 0x48, 0xc7, 0x41, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x46, 0x48, + 0x4e, 0x8d, 0x4c, 0xc1, 0x50, 0x4c, 0x89, 0x49, + 0x40, 0x48, 0xc7, 0x41, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x8e, 0xd0, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x49, 0x38, 0xc7, 0x41, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x39, 0xf8, 0x7e, 0x1c, + 0x4c, 0x8d, 0x41, 0x50, 0x89, 0xff, 0x66, 0x90, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xe8, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x89, 0x4d, 0xe0, 0x49, 0x89, 0xc5, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_3.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 45 d8 movq -0x28(%r13), %r8 + // 4: 49 8b 55 e0 movq -0x20(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 03 00 00 00 movl $0x3, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <__JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 55 pushq %rbp + // 41: 48 89 e5 movq %rsp, %rbp + // 44: 49 8d 45 e0 leaq -0x20(%r13), %rax + // 48: 48 89 31 movq %rsi, (%rcx) + // 4b: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 50: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 54: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5c: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 60: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 65: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 69: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 71: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 78: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 7c: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 83: 41 39 f8 cmpl %edi, %r8d + // 86: 7e 1c jle 0xa4 <__JIT_ENTRY+0xa4> + // 88: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8c: 89 ff movl %edi, %edi + // 8e: 66 90 nop + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <__JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 e0 movq -0x20(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 e8 movq -0x18(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 8b 55 f0 movq -0x10(%r13), %rdx + // c2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // c7: 49 8b 55 f8 movq -0x8(%r13), %rdx + // cb: 48 89 54 f1 60 movq %rdx, 0x60(%rcx,%rsi,8) + // d0: 49 89 4d d8 movq %rcx, -0x28(%r13) + // d4: 49 89 c5 movq %rax, %r13 + // d7: 5d popq %rbp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 00000000000000d9: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[216] = { + 0x4d, 0x8b, 0x45, 0xd8, 0x49, 0x8b, 0x55, 0xe0, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x03, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8d, 0x45, 0xe0, + 0x48, 0x89, 0x31, 0x41, 0x0f, 0x10, 0x40, 0x10, + 0x0f, 0x11, 0x41, 0x18, 0x48, 0xc7, 0x41, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x46, 0x48, + 0x4e, 0x8d, 0x4c, 0xc1, 0x50, 0x4c, 0x89, 0x49, + 0x40, 0x48, 0xc7, 0x41, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x8e, 0xd0, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x49, 0x38, 0xc7, 0x41, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x39, 0xf8, 0x7e, 0x1c, + 0x4c, 0x8d, 0x41, 0x50, 0x89, 0xff, 0x66, 0x90, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xe0, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xe8, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x60, + 0x49, 0x89, 0x4d, 0xd8, 0x49, 0x89, 0xc5, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_4.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 45 d0 movq -0x30(%r13), %r8 + // 4: 49 8b 55 d8 movq -0x28(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 04 00 00 00 movl $0x4, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <__JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 55 pushq %rbp + // 41: 48 89 e5 movq %rsp, %rbp + // 44: 49 8d 45 d8 leaq -0x28(%r13), %rax + // 48: 48 89 31 movq %rsi, (%rcx) + // 4b: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 50: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 54: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5c: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 60: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 65: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 69: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 71: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 78: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 7c: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 83: 41 39 f8 cmpl %edi, %r8d + // 86: 7e 1c jle 0xa4 <__JIT_ENTRY+0xa4> + // 88: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8c: 89 ff movl %edi, %edi + // 8e: 66 90 nop + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <__JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 d8 movq -0x28(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 e0 movq -0x20(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 8b 55 e8 movq -0x18(%r13), %rdx + // c2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // c7: 49 8b 55 f0 movq -0x10(%r13), %rdx + // cb: 48 89 54 f1 60 movq %rdx, 0x60(%rcx,%rsi,8) + // d0: 49 8b 55 f8 movq -0x8(%r13), %rdx + // d4: 48 89 54 f1 68 movq %rdx, 0x68(%rcx,%rsi,8) + // d9: 49 89 4d d0 movq %rcx, -0x30(%r13) + // dd: 49 89 c5 movq %rax, %r13 + // e0: 5d popq %rbp + // e1: e9 00 00 00 00 jmp 0xe6 <__JIT_ENTRY+0xe6> + // 00000000000000e2: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[225] = { + 0x4d, 0x8b, 0x45, 0xd0, 0x49, 0x8b, 0x55, 0xd8, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x04, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8d, 0x45, 0xd8, + 0x48, 0x89, 0x31, 0x41, 0x0f, 0x10, 0x40, 0x10, + 0x0f, 0x11, 0x41, 0x18, 0x48, 0xc7, 0x41, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x46, 0x48, + 0x4e, 0x8d, 0x4c, 0xc1, 0x50, 0x4c, 0x89, 0x49, + 0x40, 0x48, 0xc7, 0x41, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x8e, 0xd0, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x49, 0x38, 0xc7, 0x41, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x39, 0xf8, 0x7e, 0x1c, + 0x4c, 0x8d, 0x41, 0x50, 0x89, 0xff, 0x66, 0x90, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xd8, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xe0, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xe8, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x8b, 0x55, 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x60, + 0x49, 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, + 0x68, 0x49, 0x89, 0x4d, 0xd0, 0x49, 0x89, 0xc5, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__IS_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_NONE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // b: 74 1c je 0x29 <__JIT_ENTRY+0x29> + // d: 8b 07 movl (%rdi), %eax + // f: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 16: 85 c0 testl %eax, %eax + // 18: 78 06 js 0x20 <__JIT_ENTRY+0x20> + // 1a: ff c8 decl %eax + // 1c: 89 07 movl %eax, (%rdi) + // 1e: 74 19 je 0x39 <__JIT_ENTRY+0x39> + // 20: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 24: e9 00 00 00 00 jmp 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 29: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 30: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 34: e9 00 00 00 00 jmp 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 39: 55 pushq %rbp + // 3a: 48 89 e5 movq %rsp, %rbp + // 3d: ff 15 00 00 00 00 callq *(%rip) ## 0x43 <__JIT_ENTRY+0x43> + // 000000000000003f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 43: 5d popq %rbp + // 44: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 48: e9 00 00 00 00 jmp 0x4d <__JIT_ENTRY+0x4d> + // 0000000000000049: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[72] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x3b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x1c, 0x8b, 0x07, 0x48, + 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x19, + 0x49, 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0x49, 0x89, 0x5d, 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &_Py_NoneStruct+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0xc); + patch_32r(code + 0x25, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_32r(code + 0x35, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + -0x4); +} + +void +emit__IS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_OP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // c: 8b 03 movl (%rbx), %eax + // e: 85 c0 testl %eax, %eax + // 10: 78 0f js 0x21 <__JIT_ENTRY+0x21> + // 12: ff c8 decl %eax + // 14: 89 03 movl %eax, (%rbx) + // 16: 75 09 jne 0x21 <__JIT_ENTRY+0x21> + // 18: 48 89 df movq %rbx, %rdi + // 1b: ff 15 00 00 00 00 callq *(%rip) ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 21: 41 8b 07 movl (%r15), %eax + // 24: 85 c0 testl %eax, %eax + // 26: 78 10 js 0x38 <__JIT_ENTRY+0x38> + // 28: ff c8 decl %eax + // 2a: 41 89 07 movl %eax, (%r15) + // 2d: 75 09 jne 0x38 <__JIT_ENTRY+0x38> + // 2f: 4c 89 ff movq %r15, %rdi + // 32: ff 15 00 00 00 00 callq *(%rip) ## 0x38 <__JIT_ENTRY+0x38> + // 0000000000000034: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 38: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 3c: 31 c9 xorl %ecx, %ecx + // 3e: 4c 39 fb cmpq %r15, %rbx + // 41: 0f 94 c1 sete %cl + // 44: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 4b: 66 39 d1 cmpw %dx, %cx + // 4e: 75 14 jne 0x64 <__JIT_ENTRY+0x64> + // 50: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x57 <__JIT_ENTRY+0x57> + // 0000000000000053: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 57: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 5b: 49 89 c5 movq %rax, %r13 + // 5e: 5d popq %rbp + // 5f: e9 00 00 00 00 jmp 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 64: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x6b <__JIT_ENTRY+0x6b> + // 0000000000000067: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 6b: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 6f: 49 89 c5 movq %rax, %r13 + // 72: 5d popq %rbp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 0000000000000074: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[115] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x8b, 0x7d, 0xf8, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, + 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8d, 0x45, 0xf8, 0x31, 0xc9, 0x4c, 0x39, + 0xfb, 0x0f, 0x94, 0xc1, 0x48, 0x8b, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x39, 0xd1, 0x75, 0x14, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, 0xf0, 0x49, + 0x89, 0xc5, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: OPARG + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0x4); + patch_32r(code + 0x60, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + -0x4); +} + +void +emit__ITER_CHECK_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_LIST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyListIter_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyListIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyListIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__ITER_CHECK_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_RANGE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyRangeIter_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyRangeIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyRangeIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__ITER_CHECK_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyTupleIter_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyTupleIter_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTupleIter_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__ITER_NEXT_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_LIST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 10 movq 0x10(%rax), %rcx + // c: 48 8b 50 18 movq 0x18(%rax), %rdx + // 10: 48 8b 52 18 movq 0x18(%rdx), %rdx + // 14: 48 8d 71 01 leaq 0x1(%rcx), %rsi + // 18: 48 89 70 10 movq %rsi, 0x10(%rax) + // 1c: 48 8b 04 ca movq (%rdx,%rcx,8), %rax + // 20: 8b 08 movl (%rax), %ecx + // 22: 85 c9 testl %ecx, %ecx + // 24: 78 04 js 0x2a <__JIT_ENTRY+0x2a> + // 26: ff c1 incl %ecx + // 28: 89 08 movl %ecx, (%rax) + // 2a: 49 89 45 00 movq %rax, (%r13) + // 2e: 49 83 c5 08 addq $0x8, %r13 + // 32: 5d popq %rbp + // 33: e9 00 00 00 00 jmp 0x38 <__JIT_ENTRY+0x38> + // 0000000000000034: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[51] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x10, 0x48, 0x8b, 0x50, 0x18, + 0x48, 0x8b, 0x52, 0x18, 0x48, 0x8d, 0x71, 0x01, + 0x48, 0x89, 0x70, 0x10, 0x48, 0x8b, 0x04, 0xca, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__ITER_NEXT_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_RANGE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 78 10 movq 0x10(%rax), %rdi + // c: 48 8b 48 18 movq 0x18(%rax), %rcx + // 10: 48 01 f9 addq %rdi, %rcx + // 13: 48 89 48 10 movq %rcx, 0x10(%rax) + // 17: 48 ff 48 20 decq 0x20(%rax) + // 1b: ff 15 00 00 00 00 callq *(%rip) ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT _PyLong_FromLong@GOTPCREL + // 21: 48 85 c0 testq %rax, %rax + // 24: 74 0e je 0x34 <__JIT_ENTRY+0x34> + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: 5d popq %rbp + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 34: 5d popq %rbp + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[58] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x78, 0x10, 0x48, 0x8b, 0x48, 0x18, + 0x48, 0x01, 0xf9, 0x48, 0x89, 0x48, 0x10, 0x48, + 0xff, 0x48, 0x20, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &PyLong_FromLong+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_FromLong); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); + patch_32r(code + 0x30, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x36, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__ITER_NEXT_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 10 movq 0x10(%rax), %rcx + // c: 48 8b 50 18 movq 0x18(%rax), %rdx + // 10: 48 8d 71 01 leaq 0x1(%rcx), %rsi + // 14: 48 89 70 10 movq %rsi, 0x10(%rax) + // 18: 48 8b 44 ca 18 movq 0x18(%rdx,%rcx,8), %rax + // 1d: 8b 08 movl (%rax), %ecx + // 1f: 85 c9 testl %ecx, %ecx + // 21: 78 04 js 0x27 <__JIT_ENTRY+0x27> + // 23: ff c1 incl %ecx + // 25: 89 08 movl %ecx, (%rax) + // 27: 49 89 45 00 movq %rax, (%r13) + // 2b: 49 83 c5 08 addq $0x8, %r13 + // 2f: 5d popq %rbp + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 0000000000000031: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[48] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x10, 0x48, 0x8b, 0x50, 0x18, + 0x48, 0x8d, 0x71, 0x01, 0x48, 0x89, 0x70, 0x10, + 0x48, 0x8b, 0x44, 0xca, 0x18, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__JUMP_TO_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _JUMP_TO_TOP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 5d popq %rbp + // 5: e9 00 00 00 00 jmp 0xa <__JIT_ENTRY+0xa> + // 0000000000000006: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[10] = { + 0x55, 0x48, 0x89, 0xe5, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x6, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_APPEND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4c 89 e8 movq %r13, %rax + // 3: 8b 0d 00 00 00 00 movl (%rip), %ecx ## 0x9 <__JIT_ENTRY+0x9> + // 0000000000000005: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 9: f7 d1 notl %ecx + // b: 49 83 c5 f8 addq $-0x8, %r13 + // f: 48 8b 70 f8 movq -0x8(%rax), %rsi + // 13: c1 e1 03 shll $0x3, %ecx + // 16: 48 81 c9 00 00 f8 ff orq $-0x80000, %rcx ## imm = 0xFFF80000 + // 1d: 48 8b 3c 08 movq (%rax,%rcx), %rdi + // 21: 48 8b 47 10 movq 0x10(%rdi), %rax + // 25: 48 39 47 20 cmpq %rax, 0x20(%rdi) + // 29: 7e 14 jle 0x3f <__JIT_ENTRY+0x3f> + // 2b: 48 8b 4f 18 movq 0x18(%rdi), %rcx + // 2f: 48 89 34 c1 movq %rsi, (%rcx,%rax,8) + // 33: 48 ff c0 incq %rax + // 36: 48 89 47 10 movq %rax, 0x10(%rdi) + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: 55 pushq %rbp + // 40: 48 89 e5 movq %rsp, %rbp + // 43: ff 15 00 00 00 00 callq *(%rip) ## 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_GOT __PyList_AppendTakeRefListResize@GOTPCREL + // 49: 85 c0 testl %eax, %eax + // 4b: 5d popq %rbp + // 4c: 0f 89 00 00 00 00 jns 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 52: e9 00 00 00 00 jmp 0x57 <__JIT_ENTRY+0x57> + // 0000000000000053: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[87] = { + 0x4c, 0x89, 0xe8, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0xf7, 0xd1, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x8b, 0x70, 0xf8, 0xc1, 0xe1, 0x03, 0x48, 0x81, + 0xc9, 0x00, 0x00, 0xf8, 0xff, 0x48, 0x8b, 0x3c, + 0x08, 0x48, 0x8b, 0x47, 0x10, 0x48, 0x39, 0x47, + 0x20, 0x7e, 0x14, 0x48, 0x8b, 0x4f, 0x18, 0x48, + 0x89, 0x34, 0xc1, 0x48, 0xff, 0xc0, 0x48, 0x89, + 0x47, 0x10, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, + 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x5d, 0x0f, 0x89, 0x00, 0x00, + 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyList_AppendTakeRefListResize+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyList_AppendTakeRefListResize); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x5, (uintptr_t)data + 0x4); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + -0x4); + patch_32r(code + 0x4e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x53, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LIST_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_EXTEND.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax ## 0xa <__JIT_ENTRY+0xa> + // 0000000000000006: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // a: f7 d0 notl %eax + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax ## imm = 0xFFF80000 + // 19: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 de movq %rbx, %rsi + // 26: ff 15 00 00 00 00 callq *(%rip) ## 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_GOT __PyList_Extend@GOTPCREL + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 85 c0 testq %rax, %rax + // 3d: 74 1a je 0x59 <__JIT_ENTRY+0x59> + // 3f: 8b 03 movl (%rbx), %eax + // 41: 85 c0 testl %eax, %eax + // 43: 78 0a js 0x4f <__JIT_ENTRY+0x4f> + // 45: ff c8 decl %eax + // 47: 89 03 movl %eax, (%rbx) + // 49: 0f 84 9e 00 00 00 je 0xed <__JIT_ENTRY+0xed> + // 4f: 49 83 c5 f8 addq $-0x8, %r13 + // 53: 5d popq %rbp + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 59: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5e: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0x65 <__JIT_ENTRY+0x65> + // 0000000000000061: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // 65: 49 8b 37 movq (%r15), %rsi + // 68: 4c 89 f7 movq %r14, %rdi + // 6b: ff 15 00 00 00 00 callq *(%rip) ## 0x71 <__JIT_ENTRY+0x71> + // 000000000000006d: X86_64_RELOC_GOT __PyErr_ExceptionMatches@GOTPCREL + // 71: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 76: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7f: 85 c0 testl %eax, %eax + // 81: 74 54 je 0xd7 <__JIT_ENTRY+0xd7> + // 83: 48 8b 43 08 movq 0x8(%rbx), %rax + // 87: 48 83 b8 d8 00 00 00 00 cmpq $0x0, 0xd8(%rax) + // 8f: 75 46 jne 0xd7 <__JIT_ENTRY+0xd7> + // 91: 48 89 df movq %rbx, %rdi + // 94: ff 15 00 00 00 00 callq *(%rip) ## 0x9a <__JIT_ENTRY+0x9a> + // 0000000000000096: X86_64_RELOC_GOT _PySequence_Check@GOTPCREL + // 9a: 85 c0 testl %eax, %eax + // 9c: 75 39 jne 0xd7 <__JIT_ENTRY+0xd7> + // 9e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a3: 4c 89 f7 movq %r14, %rdi + // a6: ff 15 00 00 00 00 callq *(%rip) ## 0xac <__JIT_ENTRY+0xac> + // 00000000000000a8: X86_64_RELOC_GOT __PyErr_Clear@GOTPCREL + // ac: 49 8b 37 movq (%r15), %rsi + // af: 48 8b 43 08 movq 0x8(%rbx), %rax + // b3: 48 8b 48 18 movq 0x18(%rax), %rcx + // b7: 48 8d 15 55 00 00 00 leaq 0x55(%rip), %rdx ## 0x113 <__JIT_ENTRY+0x113> + // 00000000000000ba: X86_64_RELOC_SIGNED __cstring + // be: 4c 89 f7 movq %r14, %rdi + // c1: 31 c0 xorl %eax, %eax + // c3: ff 15 00 00 00 00 callq *(%rip) ## 0xc9 <__JIT_ENTRY+0xc9> + // 00000000000000c5: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // c9: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ce: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d7: 8b 03 movl (%rbx), %eax + // d9: 85 c0 testl %eax, %eax + // db: 78 06 js 0xe3 <__JIT_ENTRY+0xe3> + // dd: ff c8 decl %eax + // df: 89 03 movl %eax, (%rbx) + // e1: 74 1d je 0x100 <__JIT_ENTRY+0x100> + // e3: 49 83 c5 f8 addq $-0x8, %r13 + // e7: 5d popq %rbp + // e8: e9 00 00 00 00 jmp 0xed <__JIT_ENTRY+0xed> + // 00000000000000e9: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // ed: 48 89 df movq %rbx, %rdi + // f0: ff 15 00 00 00 00 callq *(%rip) ## 0xf6 <__JIT_ENTRY+0xf6> + // 00000000000000f2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // f6: 49 83 c5 f8 addq $-0x8, %r13 + // fa: 5d popq %rbp + // fb: e9 00 00 00 00 jmp 0x100 <__JIT_ENTRY+0x100> + // 00000000000000fc: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 100: 48 89 df movq %rbx, %rdi + // 103: ff 15 00 00 00 00 callq *(%rip) ## 0x109 <__JIT_ENTRY+0x109> + // 0000000000000105: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 109: 49 83 c5 f8 addq $-0x8, %r13 + // 10d: 5d popq %rbp + // 10e: e9 00 00 00 00 jmp 0x113 <__JIT_ENTRY+0x113> + // 000000000000010f: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[275] = { + 0x55, 0x48, 0x89, 0xe5, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x5d, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x7c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xde, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1a, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x0a, 0xff, 0xc8, 0x89, + 0x03, 0x0f, 0x84, 0x9e, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x37, + 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x54, 0x48, 0x8b, 0x43, 0x08, 0x48, + 0x83, 0xb8, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x46, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x75, 0x39, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x37, 0x48, + 0x8b, 0x43, 0x08, 0x48, 0x8b, 0x48, 0x18, 0x48, + 0x8d, 0x15, 0x55, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x03, 0x74, 0x1d, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: 'Value after * must be an iterable, not %.200s\x00' + // 2e: 00 00 + // 30: &_Py_Dealloc+0x0 + // 38: &_PyErr_Format+0x0 + // 40: &_PyErr_Clear+0x0 + // 48: &PySequence_Check+0x0 + // 50: &_PyErr_ExceptionMatches+0x0 + // 58: &PyExc_TypeError+0x0 + // 60: &_PyList_Extend+0x0 + // 68: OPARG + const unsigned char data_body[112] = { + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, + 0x2e, 0x32, 0x30, 0x30, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x38, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x40, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x48, (uintptr_t)&PySequence_Check); + patch_64(data + 0x50, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x58, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x60, (uintptr_t)&_PyList_Extend); + patch_64(data + 0x68, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x5c); + patch_32r(code + 0x55, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0xa8, (uintptr_t)data + 0x3c); + patch_32r(code + 0xba, (uintptr_t)data + 0x164); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + 0x34); + patch_32r(code + 0xe9, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)data + 0x2c); + patch_32r(code + 0xfc, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x105, (uintptr_t)data + 0x2c); + patch_32r(code + 0x10f, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 89 ef movq %r13, %r15 + // f: 44 8b 35 00 00 00 00 movl (%rip), %r14d ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 16: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 1a: 49 8b 04 24 movq (%r12), %rax + // 1e: 48 8b 40 20 movq 0x20(%rax), %rax + // 22: 44 89 f1 movl %r14d, %ecx + // 25: 81 e1 fe ff 00 00 andl $0xfffe, %ecx ## imm = 0xFFFE + // 2b: 48 8b 74 88 18 movq 0x18(%rax,%rcx,4), %rsi + // 30: 41 83 e6 01 andl $0x1, %r14d + // 34: 75 32 jne 0x68 <__JIT_ENTRY+0x68> + // 36: 4d 89 7c 24 40 movq %r15, 0x40(%r12) + // 3b: 48 89 df movq %rbx, %rdi + // 3e: ff 15 00 00 00 00 callq *(%rip) ## 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_GOT _PyObject_GetAttr@GOTPCREL + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 8b 0b movl (%rbx), %ecx + // 54: 85 c9 testl %ecx, %ecx + // 56: 78 06 js 0x5e <__JIT_ENTRY+0x5e> + // 58: ff c9 decl %ecx + // 5a: 89 0b movl %ecx, (%rbx) + // 5c: 74 79 je 0xd7 <__JIT_ENTRY+0xd7> + // 5e: 48 85 c0 testq %rax, %rax + // 61: 75 5a jne 0xbd <__JIT_ENTRY+0xbd> + // 63: e9 83 00 00 00 jmp 0xeb <__JIT_ENTRY+0xeb> + // 68: 48 c7 45 f0 00 00 00 00 movq $0x0, -0x10(%rbp) + // 70: 4d 89 7c 24 40 movq %r15, 0x40(%r12) + // 75: 48 8d 55 f0 leaq -0x10(%rbp), %rdx + // 79: 48 89 df movq %rbx, %rdi + // 7c: ff 15 00 00 00 00 callq *(%rip) ## 0x82 <__JIT_ENTRY+0x82> + // 000000000000007e: X86_64_RELOC_GOT __PyObject_GetMethod@GOTPCREL + // 82: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 87: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 90: 85 c0 testl %eax, %eax + // 92: 74 06 je 0x9a <__JIT_ENTRY+0x9a> + // 94: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 98: eb 20 jmp 0xba <__JIT_ENTRY+0xba> + // 9a: 8b 03 movl (%rbx), %eax + // 9c: 85 c0 testl %eax, %eax + // 9e: 78 0f js 0xaf <__JIT_ENTRY+0xaf> + // a0: ff c8 decl %eax + // a2: 89 03 movl %eax, (%rbx) + // a4: 75 09 jne 0xaf <__JIT_ENTRY+0xaf> + // a6: 48 89 df movq %rbx, %rdi + // a9: ff 15 00 00 00 00 callq *(%rip) ## 0xaf <__JIT_ENTRY+0xaf> + // 00000000000000ab: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // af: 48 8b 45 f0 movq -0x10(%rbp), %rax + // b3: 48 85 c0 testq %rax, %rax + // b6: 74 33 je 0xeb <__JIT_ENTRY+0xeb> + // b8: 31 db xorl %ebx, %ebx + // ba: 49 89 1f movq %rbx, (%r15) + // bd: 49 89 45 f8 movq %rax, -0x8(%r13) + // c1: 44 89 f0 movl %r14d, %eax + // c4: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // c9: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // cd: 48 83 c4 10 addq $0x10, %rsp + // d1: 5d popq %rbp + // d2: e9 00 00 00 00 jmp 0xd7 <__JIT_ENTRY+0xd7> + // 00000000000000d3: X86_64_RELOC_BRANCH __JIT_CONTINUE + // d7: 48 89 df movq %rbx, %rdi + // da: 48 89 c3 movq %rax, %rbx + // dd: ff 15 00 00 00 00 callq *(%rip) ## 0xe3 <__JIT_ENTRY+0xe3> + // 00000000000000df: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // e3: 48 89 d8 movq %rbx, %rax + // e6: 48 85 c0 testq %rax, %rax + // e9: 75 d2 jne 0xbd <__JIT_ENTRY+0xbd> + // eb: 49 83 c5 f8 addq $-0x8, %r13 + // ef: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // f3: 48 83 c4 10 addq $0x10, %rsp + // f7: 5d popq %rbp + // f8: e9 00 00 00 00 jmp 0xfd <__JIT_ENTRY+0xfd> + // 00000000000000f9: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[253] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x89, 0xef, 0x44, + 0x8b, 0x35, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, + 0x40, 0x20, 0x44, 0x89, 0xf1, 0x81, 0xe1, 0xfe, + 0xff, 0x00, 0x00, 0x48, 0x8b, 0x74, 0x88, 0x18, + 0x41, 0x83, 0xe6, 0x01, 0x75, 0x32, 0x4d, 0x89, + 0x7c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x79, 0x48, 0x85, + 0xc0, 0x75, 0x5a, 0xe9, 0x83, 0x00, 0x00, 0x00, + 0x48, 0xc7, 0x45, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x7c, 0x24, 0x40, 0x48, 0x8d, 0x55, + 0xf0, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x06, 0x48, 0x8b, 0x45, 0xf0, + 0xeb, 0x20, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x45, 0xf0, 0x48, 0x85, 0xc0, 0x74, 0x33, + 0x31, 0xdb, 0x49, 0x89, 0x1f, 0x49, 0x89, 0x45, + 0xf8, 0x44, 0x89, 0xf0, 0x4d, 0x8d, 0x6c, 0xc5, + 0x00, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, + 0xc0, 0x75, 0xd2, 0x49, 0x83, 0xc5, 0xf8, 0x4c, + 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyObject_GetMethod+0x0 + // 10: &PyObject_GetAttr+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyObject_GetMethod); + patch_64(data + 0x10, (uintptr_t)&PyObject_GetAttr); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + -0x4); + patch_32r(code + 0xd3, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xdf, (uintptr_t)data + -0x4); + patch_32r(code + 0xf9, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_CLASS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // b: 8b 03 movl (%rbx), %eax + // d: 85 c0 testl %eax, %eax + // f: 78 04 js 0x15 <__JIT_ENTRY+0x15> + // 11: ff c0 incl %eax + // 13: 89 03 movl %eax, (%rbx) + // 15: 8b 07 movl (%rdi), %eax + // 17: 85 c0 testl %eax, %eax + // 19: 78 06 js 0x21 <__JIT_ENTRY+0x21> + // 1b: ff c8 decl %eax + // 1d: 89 07 movl %eax, (%rdi) + // 1f: 74 09 je 0x2a <__JIT_ENTRY+0x2a> + // 21: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 25: e9 00 00 00 00 jmp 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2a: 55 pushq %rbp + // 2b: 48 89 e5 movq %rsp, %rbp + // 2e: ff 15 00 00 00 00 callq *(%rip) ## 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 34: 5d popq %rbp + // 35: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 39: e9 00 00 00 00 jmp 0x3e <__JIT_ENTRY+0x3e> + // 000000000000003a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[57] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x04, 0xff, 0xc0, 0x89, 0x03, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x09, 0x49, 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x49, 0x89, 0x5d, + 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_32r(code + 0x26, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_INSTANCE_VALUE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // b: 48 8b 04 07 movq (%rdi,%rax), %rax + // f: 48 85 c0 testq %rax, %rax + // 12: 0f 84 00 00 00 00 je 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 18: 8b 08 movl (%rax), %ecx + // 1a: 85 c9 testl %ecx, %ecx + // 1c: 78 04 js 0x22 <__JIT_ENTRY+0x22> + // 1e: ff c1 incl %ecx + // 20: 89 08 movl %ecx, (%rax) + // 22: 49 89 45 f8 movq %rax, -0x8(%r13) + // 26: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2b: 8b 07 movl (%rdi), %eax + // 2d: 85 c0 testl %eax, %eax + // 2f: 78 06 js 0x37 <__JIT_ENTRY+0x37> + // 31: ff c8 decl %eax + // 33: 89 07 movl %eax, (%rdi) + // 35: 74 13 je 0x4a <__JIT_ENTRY+0x4a> + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: e9 00 00 00 00 jmp 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 4a: 55 pushq %rbp + // 4b: 48 89 e5 movq %rsp, %rbp + // 4e: ff 15 00 00 00 00 callq *(%rip) ## 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 54: 5d popq %rbp + // 55: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 63: e9 00 00 00 00 jmp 0x68 <__JIT_ENTRY+0x68> + // 0000000000000064: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[99] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x04, 0x07, 0x48, + 0x85, 0xc0, 0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0xf8, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_32r(code + 0x14, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x46, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_LAZY_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // f: 8b 11 movl (%rcx), %edx + // 11: 85 d2 testl %edx, %edx + // 13: 78 04 js 0x19 <__JIT_ENTRY+0x19> + // 15: ff c2 incl %edx + // 17: 89 11 movl %edx, (%rcx) + // 19: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 1d: 49 89 45 00 movq %rax, (%r13) + // 21: 49 83 c5 08 addq $0x8, %r13 + // 25: 5d popq %rbp + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 0000000000000027: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[38] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4d, 0xf8, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_NO_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // f: 8b 11 movl (%rcx), %edx + // 11: 85 d2 testl %edx, %edx + // 13: 78 04 js 0x19 <__JIT_ENTRY+0x19> + // 15: ff c2 incl %edx + // 17: 89 11 movl %edx, (%rcx) + // 19: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 1d: 49 89 45 00 movq %rax, (%r13) + // 21: 49 83 c5 08 addq $0x8, %r13 + // 25: 5d popq %rbp + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 0000000000000027: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[38] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4d, 0xf8, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_WITH_VALUES.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // f: 8b 11 movl (%rcx), %edx + // 11: 85 d2 testl %edx, %edx + // 13: 78 04 js 0x19 <__JIT_ENTRY+0x19> + // 15: ff c2 incl %edx + // 17: 89 11 movl %edx, (%rcx) + // 19: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 1d: 49 89 45 00 movq %rax, (%r13) + // 21: 49 83 c5 08 addq $0x8, %r13 + // 25: 5d popq %rbp + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 0000000000000027: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[38] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4d, 0xf8, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 10 movq 0x10(%rdi), %rax + // 8: 48 8b 40 20 movq 0x20(%rax), %rax + // c: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 10: ba 01 00 00 00 movl $0x1, %edx + // 15: 48 d3 e2 shlq %cl, %rdx + // 18: 48 01 c2 addq %rax, %rdx + // 1b: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x22 <__JIT_ENTRY+0x22> + // 000000000000001e: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 22: c1 e0 04 shll $0x4, %eax + // 25: 48 8b 5c 10 28 movq 0x28(%rax,%rdx), %rbx + // 2a: 48 85 db testq %rbx, %rbx + // 2d: 0f 84 00 00 00 00 je 0x33 <__JIT_ENTRY+0x33> + // 000000000000002f: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 33: 8b 03 movl (%rbx), %eax + // 35: 85 c0 testl %eax, %eax + // 37: 78 04 js 0x3d <__JIT_ENTRY+0x3d> + // 39: ff c0 incl %eax + // 3b: 89 03 movl %eax, (%rbx) + // 3d: 8b 07 movl (%rdi), %eax + // 3f: 85 c0 testl %eax, %eax + // 41: 78 06 js 0x49 <__JIT_ENTRY+0x49> + // 43: ff c8 decl %eax + // 45: 89 07 movl %eax, (%rdi) + // 47: 74 09 je 0x52 <__JIT_ENTRY+0x52> + // 49: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 4d: e9 00 00 00 00 jmp 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 52: 55 pushq %rbp + // 53: 48 89 e5 movq %rsp, %rbp + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5c: 5d popq %rbp + // 5d: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 61: e9 00 00 00 00 jmp 0x66 <__JIT_ENTRY+0x66> + // 0000000000000062: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[97] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x10, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb6, 0x48, 0x09, + 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe2, + 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x5c, + 0x10, 0x28, 0x48, 0x85, 0xdb, 0x0f, 0x84, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x04, 0xff, 0xc0, 0x89, 0x03, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x09, 0x49, 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x49, 0x89, 0x5d, + 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_32r(code + 0x2f, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x4e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE_FROM_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4c 89 e8 movq %r13, %rax + // 3: 49 83 c5 f8 addq $-0x8, %r13 + // 7: 48 8b 50 f8 movq -0x8(%rax), %rdx + // b: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // f: be 01 00 00 00 movl $0x1, %esi + // 14: 48 d3 e6 shlq %cl, %rsi + // 17: 48 01 d6 addq %rdx, %rsi + // 1a: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 21: c1 e1 04 shll $0x4, %ecx + // 24: 48 8b 4c 31 28 movq 0x28(%rcx,%rsi), %rcx + // 29: 48 85 c9 testq %rcx, %rcx + // 2c: 0f 84 00 00 00 00 je 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 32: 48 8b 78 f0 movq -0x10(%rax), %rdi + // 36: 8b 11 movl (%rcx), %edx + // 38: 85 d2 testl %edx, %edx + // 3a: 78 04 js 0x40 <__JIT_ENTRY+0x40> + // 3c: ff c2 incl %edx + // 3e: 89 11 movl %edx, (%rcx) + // 40: 48 89 48 f0 movq %rcx, -0x10(%rax) + // 44: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 49: 8b 07 movl (%rdi), %eax + // 4b: 85 c0 testl %eax, %eax + // 4d: 78 06 js 0x55 <__JIT_ENTRY+0x55> + // 4f: ff c8 decl %eax + // 51: 89 07 movl %eax, (%rdi) + // 53: 74 13 je 0x68 <__JIT_ENTRY+0x68> + // 55: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 63: e9 00 00 00 00 jmp 0x68 <__JIT_ENTRY+0x68> + // 0000000000000064: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 68: 55 pushq %rbp + // 69: 48 89 e5 movq %rsp, %rbp + // 6c: ff 15 00 00 00 00 callq *(%rip) ## 0x72 <__JIT_ENTRY+0x72> + // 000000000000006e: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 72: 5d popq %rbp + // 73: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: e9 00 00 00 00 jmp 0x86 <__JIT_ENTRY+0x86> + // 0000000000000082: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[129] = { + 0x4c, 0x89, 0xe8, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x8b, 0x50, 0xf8, 0x0f, 0xb6, 0x4a, 0x09, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe6, 0x48, + 0x01, 0xd6, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0xc1, 0xe1, 0x04, 0x48, 0x8b, 0x4c, 0x31, + 0x28, 0x48, 0x85, 0xc9, 0x0f, 0x84, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x78, 0xf0, 0x8b, 0x11, + 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, 0x11, + 0x48, 0x89, 0x48, 0xf0, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_32r(code + 0x2e, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x64, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_NO_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 8b 07 movl (%rdi), %eax + // a: 85 c0 testl %eax, %eax + // c: 78 0c js 0x1a <__JIT_ENTRY+0x1a> + // e: ff c8 decl %eax + // 10: 89 07 movl %eax, (%rdi) + // 12: 75 06 jne 0x1a <__JIT_ENTRY+0x1a> + // 14: ff 15 00 00 00 00 callq *(%rip) ## 0x1a <__JIT_ENTRY+0x1a> + // 0000000000000016: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 1a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 21: 8b 08 movl (%rax), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 04 js 0x2b <__JIT_ENTRY+0x2b> + // 27: ff c1 incl %ecx + // 29: 89 08 movl %ecx, (%rax) + // 2b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 2f: 5d popq %rbp + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 0000000000000031: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[48] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0xf8, 0x5d, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 8b 07 movl (%rdi), %eax + // a: 85 c0 testl %eax, %eax + // c: 78 0c js 0x1a <__JIT_ENTRY+0x1a> + // e: ff c8 decl %eax + // 10: 89 07 movl %eax, (%rdi) + // 12: 75 06 jne 0x1a <__JIT_ENTRY+0x1a> + // 14: ff 15 00 00 00 00 callq *(%rip) ## 0x1a <__JIT_ENTRY+0x1a> + // 0000000000000016: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 1a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 21: 8b 08 movl (%rax), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 04 js 0x2b <__JIT_ENTRY+0x2b> + // 27: ff c1 incl %ecx + // 29: 89 08 movl %ecx, (%rax) + // 2b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 2f: 5d popq %rbp + // 30: e9 00 00 00 00 jmp 0x35 <__JIT_ENTRY+0x35> + // 0000000000000031: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[48] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0xf8, 0x5d, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_PROPERTY_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_PROPERTY_FRAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 7: 48 8b 42 30 movq 0x30(%rdx), %rax + // b: 8b 48 30 movl 0x30(%rax), %ecx + // e: 83 e1 0d andl $0xd, %ecx + // 11: 83 f9 01 cmpl $0x1, %ecx + // 14: 0f 85 00 00 00 00 jne 0x1a <__JIT_ENTRY+0x1a> + // 0000000000000016: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1a: 83 78 3c 00 cmpl $0x0, 0x3c(%rax) + // 1e: 0f 85 00 00 00 00 jne 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 24: 83 78 34 01 cmpl $0x1, 0x34(%rax) + // 28: 0f 85 00 00 00 00 jne 0x2e <__JIT_ENTRY+0x2e> + // 000000000000002a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2e: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 35: 48 85 c9 testq %rcx, %rcx + // 38: 0f 84 00 00 00 00 je 0x3e <__JIT_ENTRY+0x3e> + // 000000000000003a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 3e: 48 63 78 4c movslq 0x4c(%rax), %rdi + // 42: 49 8b b6 f8 00 00 00 movq 0xf8(%r14), %rsi + // 49: 48 29 ce subq %rcx, %rsi + // 4c: 48 c1 fe 03 sarq $0x3, %rsi + // 50: 48 39 fe cmpq %rdi, %rsi + // 53: 0f 8e 00 00 00 00 jle 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 59: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 5d: 8b 1a movl (%rdx), %ebx + // 5f: 85 db testl %ebx, %ebx + // 61: 78 04 js 0x67 <__JIT_ENTRY+0x67> + // 63: ff c3 incl %ebx + // 65: 89 1a movl %ebx, (%rdx) + // 67: 48 8d 3c f9 leaq (%rcx,%rdi,8), %rdi + // 6b: 49 89 be f0 00 00 00 movq %rdi, 0xf0(%r14) + // 72: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 76: 48 89 51 10 movq %rdx, 0x10(%rcx) + // 7a: 8b 38 movl (%rax), %edi + // 7c: 85 ff testl %edi, %edi + // 7e: 78 04 js 0x84 <__JIT_ENTRY+0x84> + // 80: ff c7 incl %edi + // 82: 89 38 movl %edi, (%rax) + // 84: 55 pushq %rbp + // 85: 48 89 e5 movq %rsp, %rbp + // 88: 48 89 01 movq %rax, (%rcx) + // 8b: 0f 10 42 10 movups 0x10(%rdx), %xmm0 + // 8f: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 93: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 9b: 48 63 50 48 movslq 0x48(%rax), %rdx + // 9f: 48 8d 7c d1 50 leaq 0x50(%rcx,%rdx,8), %rdi + // a4: 48 89 79 40 movq %rdi, 0x40(%rcx) + // a8: 48 8d b8 d0 00 00 00 leaq 0xd0(%rax), %rdi + // af: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // b7: 48 89 79 38 movq %rdi, 0x38(%rcx) + // bb: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // c2: 48 83 fa 02 cmpq $0x2, %rdx + // c6: 7c 24 jl 0xec <__JIT_ENTRY+0xec> + // c8: ba 0b 00 00 00 movl $0xb, %edx + // cd: 0f 1f 00 nopl (%rax) + // d0: 48 c7 04 d1 00 00 00 00 movq $0x0, (%rcx,%rdx,8) + // d8: 48 63 78 48 movslq 0x48(%rax), %rdi + // dc: 4c 8d 42 01 leaq 0x1(%rdx), %r8 + // e0: 48 83 c2 f7 addq $-0x9, %rdx + // e4: 48 39 fa cmpq %rdi, %rdx + // e7: 4c 89 c2 movq %r8, %rdx + // ea: 7c e4 jl 0xd0 <__JIT_ENTRY+0xd0> + // ec: 48 89 71 50 movq %rsi, 0x50(%rcx) + // f0: 49 89 4d f8 movq %rcx, -0x8(%r13) + // f4: 5d popq %rbp + // f5: e9 00 00 00 00 jmp 0xfa <__JIT_ENTRY+0xfa> + // 00000000000000f6: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[245] = { + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x42, 0x30, 0x8b, 0x48, 0x30, 0x83, 0xe1, + 0x0d, 0x83, 0xf9, 0x01, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x78, 0x3c, 0x00, 0x0f, 0x85, + 0x00, 0x00, 0x00, 0x00, 0x83, 0x78, 0x34, 0x01, + 0x0f, 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc9, + 0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x48, 0x63, + 0x78, 0x4c, 0x49, 0x8b, 0xb6, 0xf8, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xce, 0x48, 0xc1, 0xfe, 0x03, + 0x48, 0x39, 0xfe, 0x0f, 0x8e, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x8b, 0x1a, 0x85, + 0xdb, 0x78, 0x04, 0xff, 0xc3, 0x89, 0x1a, 0x48, + 0x8d, 0x3c, 0xf9, 0x49, 0x89, 0xbe, 0xf0, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0x61, 0x08, 0x48, 0x89, + 0x51, 0x10, 0x8b, 0x38, 0x85, 0xff, 0x78, 0x04, + 0xff, 0xc7, 0x89, 0x38, 0x55, 0x48, 0x89, 0xe5, + 0x48, 0x89, 0x01, 0x0f, 0x10, 0x42, 0x10, 0x0f, + 0x11, 0x41, 0x18, 0x48, 0xc7, 0x41, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x63, 0x50, 0x48, 0x48, + 0x8d, 0x7c, 0xd1, 0x50, 0x48, 0x89, 0x79, 0x40, + 0x48, 0x8d, 0xb8, 0xd0, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0x41, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0x79, 0x38, 0xc7, 0x41, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xfa, 0x02, 0x7c, 0x24, + 0xba, 0x0b, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x00, + 0x48, 0xc7, 0x04, 0xd1, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x78, 0x48, 0x4c, 0x8d, 0x42, 0x01, + 0x48, 0x83, 0xc2, 0xf7, 0x48, 0x39, 0xfa, 0x4c, + 0x89, 0xc2, 0x7c, 0xe4, 0x48, 0x89, 0x71, 0x50, + 0x49, 0x89, 0x4d, 0xf8, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_32r(code + 0x16, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x20, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x2a, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x3a, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x55, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_SLOT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // b: 48 8b 1c 07 movq (%rdi,%rax), %rbx + // f: 48 85 db testq %rbx, %rbx + // 12: 0f 84 00 00 00 00 je 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 18: 8b 03 movl (%rbx), %eax + // 1a: 85 c0 testl %eax, %eax + // 1c: 78 04 js 0x22 <__JIT_ENTRY+0x22> + // 1e: ff c0 incl %eax + // 20: 89 03 movl %eax, (%rbx) + // 22: 8b 07 movl (%rdi), %eax + // 24: 85 c0 testl %eax, %eax + // 26: 78 06 js 0x2e <__JIT_ENTRY+0x2e> + // 28: ff c8 decl %eax + // 2a: 89 07 movl %eax, (%rdi) + // 2c: 74 09 je 0x37 <__JIT_ENTRY+0x37> + // 2e: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 32: e9 00 00 00 00 jmp 0x37 <__JIT_ENTRY+0x37> + // 0000000000000033: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 37: 55 pushq %rbp + // 38: 48 89 e5 movq %rsp, %rbp + // 3b: ff 15 00 00 00 00 callq *(%rip) ## 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 41: 5d popq %rbp + // 42: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 46: e9 00 00 00 00 jmp 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[70] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x1c, 0x07, 0x48, + 0x85, 0xdb, 0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, + 0x89, 0x03, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x09, 0x49, 0x89, + 0x5d, 0xf8, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, + 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0x49, 0x89, 0x5d, 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_32r(code + 0x14, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x33, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_WITH_HINT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4c 89 eb movq %r13, %rbx + // 3: 49 83 c5 f8 addq $-0x8, %r13 + // 7: 48 8b 4b f8 movq -0x8(%rbx), %rcx + // b: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 12: 48 8b 51 20 movq 0x20(%rcx), %rdx + // 16: 48 39 42 18 cmpq %rax, 0x18(%rdx) + // 1a: 0f 86 00 00 00 00 jbe 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 20: 80 7a 0a 01 cmpb $0x1, 0xa(%rdx) + // 24: 0f 85 00 00 00 00 jne 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2a: 49 8b 0c 24 movq (%r12), %rcx + // 2e: 48 8b 79 20 movq 0x20(%rcx), %rdi + // 32: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d ## 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 3a: 41 83 e0 fe andl $-0x2, %r8d + // 3e: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 42: be 01 00 00 00 movl $0x1, %esi + // 47: 48 d3 e6 shlq %cl, %rsi + // 4a: 48 01 d6 addq %rdx, %rsi + // 4d: c1 e0 04 shll $0x4, %eax + // 50: 48 8b 4c 30 20 movq 0x20(%rax,%rsi), %rcx + // 55: 4a 3b 4c 87 18 cmpq 0x18(%rdi,%r8,4), %rcx + // 5a: 0f 85 00 00 00 00 jne 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 60: 48 01 f0 addq %rsi, %rax + // 63: 48 83 c0 20 addq $0x20, %rax + // 67: 4c 8b 78 08 movq 0x8(%rax), %r15 + // 6b: 4d 85 ff testq %r15, %r15 + // 6e: 0f 84 00 00 00 00 je 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 74: 48 8b 7b f0 movq -0x10(%rbx), %rdi + // 78: 41 8b 07 movl (%r15), %eax + // 7b: 85 c0 testl %eax, %eax + // 7d: 78 05 js 0x84 <__JIT_ENTRY+0x84> + // 7f: ff c0 incl %eax + // 81: 41 89 07 movl %eax, (%r15) + // 84: 8b 07 movl (%rdi), %eax + // 86: 85 c0 testl %eax, %eax + // 88: 78 06 js 0x90 <__JIT_ENTRY+0x90> + // 8a: ff c8 decl %eax + // 8c: 89 07 movl %eax, (%rdi) + // 8e: 74 09 je 0x99 <__JIT_ENTRY+0x99> + // 90: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // 94: e9 00 00 00 00 jmp 0x99 <__JIT_ENTRY+0x99> + // 0000000000000095: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 99: 55 pushq %rbp + // 9a: 48 89 e5 movq %rsp, %rbp + // 9d: ff 15 00 00 00 00 callq *(%rip) ## 0xa3 <__JIT_ENTRY+0xa3> + // 000000000000009f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a3: 5d popq %rbp + // a4: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // a8: e9 00 00 00 00 jmp 0xad <__JIT_ENTRY+0xad> + // 00000000000000a9: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[168] = { + 0x4c, 0x89, 0xeb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x8b, 0x4b, 0xf8, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x51, 0x20, 0x48, 0x39, + 0x42, 0x18, 0x0f, 0x86, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x7a, 0x0a, 0x01, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x0c, 0x24, 0x48, 0x8b, + 0x79, 0x20, 0x44, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x83, 0xe0, 0xfe, 0x0f, 0xb6, + 0x4a, 0x09, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x48, + 0xd3, 0xe6, 0x48, 0x01, 0xd6, 0xc1, 0xe0, 0x04, + 0x48, 0x8b, 0x4c, 0x30, 0x20, 0x4a, 0x3b, 0x4c, + 0x87, 0x18, 0x0f, 0x85, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x01, 0xf0, 0x48, 0x83, 0xc0, 0x20, 0x4c, + 0x8b, 0x78, 0x08, 0x4d, 0x85, 0xff, 0x0f, 0x84, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x7b, 0xf0, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x05, 0xff, + 0xc0, 0x41, 0x89, 0x07, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x09, + 0x4c, 0x89, 0x7b, 0xf0, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0x4c, 0x89, 0x7b, 0xf0, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: OPERAND0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xe, (uintptr_t)data + 0xc); + patch_32r(code + 0x1c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x4); + patch_32r(code + 0x5c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x70, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x95, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x9f, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_BUILD_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_BUILD_CLASS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 49 8b 7c 24 20 movq 0x20(%r12), %rdi + // 12: be b0 8f 00 00 movl $0x8fb0, %esi ## imm = 0x8FB0 + // 17: 48 03 35 00 00 00 00 addq (%rip), %rsi ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 1e: 48 8d 55 f8 leaq -0x8(%rbp), %rdx + // 22: ff 15 00 00 00 00 callq *(%rip) ## 0x28 <__JIT_ENTRY+0x28> + // 0000000000000024: X86_64_RELOC_GOT _PyMapping_GetOptionalItem@GOTPCREL + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: 85 c0 testl %eax, %eax + // 38: 78 48 js 0x82 <__JIT_ENTRY+0x82> + // 3a: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 3e: 48 85 c0 testq %rax, %rax + // 41: 74 12 je 0x55 <__JIT_ENTRY+0x55> + // 43: 49 89 45 00 movq %rax, (%r13) + // 47: 49 83 c5 08 addq $0x8, %r13 + // 4b: 48 83 c4 10 addq $0x10, %rsp + // 4f: 5d popq %rbp + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 0000000000000051: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 55: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x61 <__JIT_ENTRY+0x61> + // 000000000000005d: X86_64_RELOC_GOT_LOAD _PyExc_NameError@GOTPCREL + // 61: 48 8b 30 movq (%rax), %rsi + // 64: 48 8d 15 21 00 00 00 leaq 0x21(%rip), %rdx ## 0x8c <__JIT_ENTRY+0x8c> + // 0000000000000067: X86_64_RELOC_SIGNED __cstring + // 6b: 4c 89 f7 movq %r14, %rdi + // 6e: ff 15 00 00 00 00 callq *(%rip) ## 0x74 <__JIT_ENTRY+0x74> + // 0000000000000070: X86_64_RELOC_GOT __PyErr_SetString@GOTPCREL + // 74: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 79: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 82: 48 83 c4 10 addq $0x10, %rsp + // 86: 5d popq %rbp + // 87: e9 00 00 00 00 jmp 0x8c <__JIT_ENTRY+0x8c> + // 0000000000000088: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[140] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x7c, + 0x24, 0x20, 0xbe, 0xb0, 0x8f, 0x00, 0x00, 0x48, + 0x03, 0x35, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, + 0x55, 0xf8, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x78, 0x48, 0x48, 0x8b, 0x45, 0xf8, 0x48, 0x85, + 0xc0, 0x74, 0x12, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x21, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: '__build_class__ not found\x00' + // 1a: 00 00 00 00 00 00 + // 20: &_PyErr_SetString+0x0 + // 28: &PyExc_NameError+0x0 + // 30: &PyMapping_GetOptionalItem+0x0 + // 38: &_PyRuntime+0x0 + const unsigned char data_body[64] = { + 0x5f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x5f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x28, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x30, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x38, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x2c); + patch_32r(code + 0x51, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x24); + patch_32r(code + 0x67, (uintptr_t)data + 0xa9); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x1c); + patch_32r(code + 0x88, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_COMMON_CONSTANT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_COMMON_CONSTANT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 66 85 c0 testw %ax, %ax + // e: 75 09 jne 0x19 <__JIT_ENTRY+0x19> + // 10: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT_LOAD _PyExc_AssertionError@GOTPCREL + // 17: eb 07 jmp 0x20 <__JIT_ENTRY+0x20> + // 19: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT_LOAD _PyExc_NotImplementedError@GOTPCREL + // 20: 48 8b 00 movq (%rax), %rax + // 23: 49 89 45 00 movq %rax, (%r13) + // 27: 49 83 c5 08 addq $0x8, %r13 + // 2b: 5d popq %rbp + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 000000000000002d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[44] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x75, 0x09, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x07, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: &PyExc_NotImplementedError+0x0 + // 8: &PyExc_AssertionError+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyExc_NotImplementedError); + patch_64(data + 0x8, (uintptr_t)&PyExc_AssertionError); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_IMMORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_IMMORTAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 48 8b 40 18 movq 0x18(%rax), %rax + // c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 13: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 18: 49 89 45 00 movq %rax, (%r13) + // 1c: 49 83 c5 08 addq $0x8, %r13 + // 20: 5d popq %rbp + // 21: e9 00 00 00 00 jmp 0x26 <__JIT_ENTRY+0x26> + // 0000000000000022: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[33] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x18, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x44, 0xc8, 0x18, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // b: 8b 08 movl (%rax), %ecx + // d: 85 c9 testl %ecx, %ecx + // f: 78 04 js 0x15 <__JIT_ENTRY+0x15> + // 11: ff c1 incl %ecx + // 13: 89 08 movl %ecx, (%rax) + // 15: 49 89 45 00 movq %rax, (%r13) + // 19: 49 83 c5 08 addq $0x8, %r13 + // 1d: 5d popq %rbp + // 1e: e9 00 00 00 00 jmp 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[30] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE_BORROW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // b: 49 89 45 00 movq %rax, (%r13) + // f: 49 83 c5 08 addq $0x8, %r13 + // 13: 5d popq %rbp + // 14: e9 00 00 00 00 jmp 0x19 <__JIT_ENTRY+0x19> + // 0000000000000015: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[20] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_MORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_MORTAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 48 8b 40 18 movq 0x18(%rax), %rax + // c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 13: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 18: 8b 08 movl (%rax), %ecx + // 1a: 85 c9 testl %ecx, %ecx + // 1c: 78 04 js 0x22 <__JIT_ENTRY+0x22> + // 1e: ff c1 incl %ecx + // 20: 89 08 movl %ecx, (%rax) + // 22: 49 89 45 00 movq %rax, (%r13) + // 26: 49 83 c5 08 addq $0x8, %r13 + // 2a: 5d popq %rbp + // 2b: e9 00 00 00 00 jmp 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[43] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x18, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x44, 0xc8, 0x18, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_DEREF.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // c: 48 8b 40 10 movq 0x10(%rax), %rax + // 10: 48 85 c0 testq %rax, %rax + // 13: 74 17 je 0x2c <__JIT_ENTRY+0x2c> + // 15: 8b 08 movl (%rax), %ecx + // 17: 85 c9 testl %ecx, %ecx + // 19: 78 04 js 0x1f <__JIT_ENTRY+0x1f> + // 1b: ff c1 incl %ecx + // 1d: 89 08 movl %ecx, (%rax) + // 1f: 49 89 45 00 movq %rax, (%r13) + // 23: 49 83 c5 08 addq $0x8, %r13 + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2c: 55 pushq %rbp + // 2d: 48 89 e5 movq %rsp, %rbp + // 30: 0f b7 15 00 00 00 00 movzwl (%rip), %edx ## 0x37 <__JIT_ENTRY+0x37> + // 0000000000000033: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 37: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 3c: 49 8b 34 24 movq (%r12), %rsi + // 40: 4c 89 f7 movq %r14, %rdi + // 43: ff 15 00 00 00 00 callq *(%rip) ## 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_GOT __PyEval_FormatExcUnbound@GOTPCREL + // 49: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 57: 5d popq %rbp + // 58: e9 00 00 00 00 jmp 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[93] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x44, 0xc4, 0x50, 0x48, 0x8b, 0x40, 0x10, + 0x48, 0x85, 0xc0, 0x74, 0x17, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x34, 0x24, + 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_FormatExcUnbound+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x4); + patch_32r(code + 0x28, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + -0x4); + patch_32r(code + 0x59, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 10: 8b 08 movl (%rax), %ecx + // 12: 85 c9 testl %ecx, %ecx + // 14: 78 04 js 0x1a <__JIT_ENTRY+0x1a> + // 16: ff c1 incl %ecx + // 18: 89 08 movl %ecx, (%rax) + // 1a: 49 89 45 00 movq %rax, (%r13) + // 1e: 49 83 c5 08 addq $0x8, %r13 + // 22: 5d popq %rbp + // 23: e9 00 00 00 00 jmp 0x28 <__JIT_ENTRY+0x28> + // 0000000000000024: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[35] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x44, 0xc4, 0x50, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_0.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 50 movq 0x50(%r12), %rax + // 9: 8b 08 movl (%rax), %ecx + // b: 85 c9 testl %ecx, %ecx + // d: 78 04 js 0x13 <__JIT_ENTRY+0x13> + // f: ff c1 incl %ecx + // 11: 89 08 movl %ecx, (%rax) + // 13: 49 89 45 00 movq %rax, (%r13) + // 17: 49 83 c5 08 addq $0x8, %r13 + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x50, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 58 movq 0x58(%r12), %rax + // 9: 8b 08 movl (%rax), %ecx + // b: 85 c9 testl %ecx, %ecx + // d: 78 04 js 0x13 <__JIT_ENTRY+0x13> + // f: ff c1 incl %ecx + // 11: 89 08 movl %ecx, (%rax) + // 13: 49 89 45 00 movq %rax, (%r13) + // 17: 49 83 c5 08 addq $0x8, %r13 + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x58, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_2.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 60 movq 0x60(%r12), %rax + // 9: 8b 08 movl (%rax), %ecx + // b: 85 c9 testl %ecx, %ecx + // d: 78 04 js 0x13 <__JIT_ENTRY+0x13> + // f: ff c1 incl %ecx + // 11: 89 08 movl %ecx, (%rax) + // 13: 49 89 45 00 movq %rax, (%r13) + // 17: 49 83 c5 08 addq $0x8, %r13 + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x60, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_3.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 68 movq 0x68(%r12), %rax + // 9: 8b 08 movl (%rax), %ecx + // b: 85 c9 testl %ecx, %ecx + // d: 78 04 js 0x13 <__JIT_ENTRY+0x13> + // f: ff c1 incl %ecx + // 11: 89 08 movl %ecx, (%rax) + // 13: 49 89 45 00 movq %rax, (%r13) + // 17: 49 83 c5 08 addq $0x8, %r13 + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x68, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_4.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 70 movq 0x70(%r12), %rax + // 9: 8b 08 movl (%rax), %ecx + // b: 85 c9 testl %ecx, %ecx + // d: 78 04 js 0x13 <__JIT_ENTRY+0x13> + // f: ff c1 incl %ecx + // 11: 89 08 movl %ecx, (%rax) + // 13: 49 89 45 00 movq %rax, (%r13) + // 17: 49 83 c5 08 addq $0x8, %r13 + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x70, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_5.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 78 movq 0x78(%r12), %rax + // 9: 8b 08 movl (%rax), %ecx + // b: 85 c9 testl %ecx, %ecx + // d: 78 04 js 0x13 <__JIT_ENTRY+0x13> + // f: ff c1 incl %ecx + // 11: 89 08 movl %ecx, (%rax) + // 13: 49 89 45 00 movq %rax, (%r13) + // 17: 49 83 c5 08 addq $0x8, %r13 + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x78, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_6.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 84 24 80 00 00 00 movq 0x80(%r12), %rax + // c: 8b 08 movl (%rax), %ecx + // e: 85 c9 testl %ecx, %ecx + // 10: 78 04 js 0x16 <__JIT_ENTRY+0x16> + // 12: ff c1 incl %ecx + // 14: 89 08 movl %ecx, (%rax) + // 16: 49 89 45 00 movq %rax, (%r13) + // 1a: 49 83 c5 08 addq $0x8, %r13 + // 1e: 5d popq %rbp + // 1f: e9 00 00 00 00 jmp 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[31] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x84, 0x24, + 0x80, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_7.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 84 24 88 00 00 00 movq 0x88(%r12), %rax + // c: 8b 08 movl (%rax), %ecx + // e: 85 c9 testl %ecx, %ecx + // 10: 78 04 js 0x16 <__JIT_ENTRY+0x16> + // 12: ff c1 incl %ecx + // 14: 89 08 movl %ecx, (%rax) + // 16: 49 89 45 00 movq %rax, (%r13) + // 1a: 49 83 c5 08 addq $0x8, %r13 + // 1e: 5d popq %rbp + // 1f: e9 00 00 00 00 jmp 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[31] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x84, 0x24, + 0x88, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_AND_CLEAR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_AND_CLEAR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 4c c4 50 movq 0x50(%r12,%rax,8), %rcx + // 10: 49 c7 44 c4 50 00 00 00 00 movq $0x0, 0x50(%r12,%rax,8) + // 19: 49 89 4d 00 movq %rcx, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: 5d popq %rbp + // 22: e9 00 00 00 00 jmp 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[34] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xc4, 0x50, + 0x49, 0xc7, 0x44, 0xc4, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x4d, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_FAST_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_CHECK.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 7: 0f b7 c1 movzwl %cx, %eax + // a: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // f: 48 85 c0 testq %rax, %rax + // 12: 74 17 je 0x2b <__JIT_ENTRY+0x2b> + // 14: 8b 08 movl (%rax), %ecx + // 16: 85 c9 testl %ecx, %ecx + // 18: 78 04 js 0x1e <__JIT_ENTRY+0x1e> + // 1a: ff c1 incl %ecx + // 1c: 89 08 movl %ecx, (%rax) + // 1e: 49 89 45 00 movq %rax, (%r13) + // 22: 49 83 c5 08 addq $0x8, %r13 + // 26: e9 00 00 00 00 jmp 0x2b <__JIT_ENTRY+0x2b> + // 0000000000000027: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2b: 55 pushq %rbp + // 2c: 48 89 e5 movq %rsp, %rbp + // 2f: 0f b7 f1 movzwl %cx, %esi + // 32: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 37: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x3e <__JIT_ENTRY+0x3e> + // 000000000000003a: X86_64_RELOC_GOT_LOAD _PyExc_UnboundLocalError@GOTPCREL + // 3e: 48 8b 18 movq (%rax), %rbx + // 41: 49 8b 04 24 movq (%r12), %rax + // 45: 48 8b 78 60 movq 0x60(%rax), %rdi + // 49: ff 15 00 00 00 00 callq *(%rip) ## 0x4f <__JIT_ENTRY+0x4f> + // 000000000000004b: X86_64_RELOC_GOT _PyTuple_GetItem@GOTPCREL + // 4f: 48 8d 15 23 00 00 00 leaq 0x23(%rip), %rdx ## 0x79 <__JIT_ENTRY+0x79> + // 0000000000000052: X86_64_RELOC_SIGNED __cstring + // 56: 4c 89 f7 movq %r14, %rdi + // 59: 48 89 de movq %rbx, %rsi + // 5c: 48 89 c1 movq %rax, %rcx + // 5f: ff 15 00 00 00 00 callq *(%rip) ## 0x65 <__JIT_ENTRY+0x65> + // 0000000000000061: X86_64_RELOC_GOT __PyEval_FormatExcCheckArg@GOTPCREL + // 65: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 73: 5d popq %rbp + // 74: e9 00 00 00 00 jmp 0x79 <__JIT_ENTRY+0x79> + // 0000000000000075: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[121] = { + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xc1, 0x49, 0x8b, 0x44, 0xc4, 0x50, 0x48, + 0x85, 0xc0, 0x74, 0x17, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0x0f, + 0xb7, 0xf1, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x18, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x78, + 0x60, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8d, 0x15, 0x23, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x48, 0x89, 0xde, 0x48, 0x89, 0xc1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: &_PyEval_FormatExcCheckArg+0x0 + // 58: &PyTuple_GetItem+0x0 + // 60: &PyExc_UnboundLocalError+0x0 + // 68: OPARG + const unsigned char data_body[112] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x58, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x60, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x68, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x64); + patch_32r(code + 0x27, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x54); + patch_32r(code + 0x52, (uintptr_t)data + 0x98); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x4c); + patch_32r(code + 0x75, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_FROM_DICT_OR_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FROM_DICT_OR_DEREF.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 49 8b 04 24 movq (%r12), %rax + // 10: 48 8b 40 60 movq 0x60(%rax), %rax + // 14: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 1b: 41 0f b7 cf movzwl %r15w, %ecx + // 1f: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 48 8d 55 f8 leaq -0x8(%rbp), %rdx + // 2d: 48 89 df movq %rbx, %rdi + // 30: ff 15 00 00 00 00 callq *(%rip) ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT _PyMapping_GetOptionalItem@GOTPCREL + // 36: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 44: 85 c0 testl %eax, %eax + // 46: 0f 88 9a 00 00 00 js 0xe6 <__JIT_ENTRY+0xe6> + // 4c: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 50: 48 85 c0 testq %rax, %rax + // 53: 75 20 jne 0x75 <__JIT_ENTRY+0x75> + // 55: 41 0f b7 c7 movzwl %r15w, %eax + // 59: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 5e: 48 8b 40 10 movq 0x10(%rax), %rax + // 62: 48 85 c0 testq %rax, %rax + // 65: 74 50 je 0xb7 <__JIT_ENTRY+0xb7> + // 67: 8b 08 movl (%rax), %ecx + // 69: 85 c9 testl %ecx, %ecx + // 6b: 78 04 js 0x71 <__JIT_ENTRY+0x71> + // 6d: ff c1 incl %ecx + // 6f: 89 08 movl %ecx, (%rax) + // 71: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 75: 49 83 c5 f8 addq $-0x8, %r13 + // 79: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7e: 8b 0b movl (%rbx), %ecx + // 80: 85 c9 testl %ecx, %ecx + // 82: 78 13 js 0x97 <__JIT_ENTRY+0x97> + // 84: ff c9 decl %ecx + // 86: 89 0b movl %ecx, (%rbx) + // 88: 75 0d jne 0x97 <__JIT_ENTRY+0x97> + // 8a: 48 89 df movq %rbx, %rdi + // 8d: ff 15 00 00 00 00 callq *(%rip) ## 0x93 <__JIT_ENTRY+0x93> + // 000000000000008f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 93: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 97: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a5: 49 89 45 00 movq %rax, (%r13) + // a9: 49 83 c5 08 addq $0x8, %r13 + // ad: 48 83 c4 10 addq $0x10, %rsp + // b1: 5d popq %rbp + // b2: e9 00 00 00 00 jmp 0xb7 <__JIT_ENTRY+0xb7> + // 00000000000000b3: X86_64_RELOC_BRANCH __JIT_CONTINUE + // b7: 48 c7 45 f8 00 00 00 00 movq $0x0, -0x8(%rbp) + // bf: 0f b7 15 00 00 00 00 movzwl (%rip), %edx ## 0xc6 <__JIT_ENTRY+0xc6> + // 00000000000000c2: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // c6: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // cb: 49 8b 34 24 movq (%r12), %rsi + // cf: 4c 89 f7 movq %r14, %rdi + // d2: ff 15 00 00 00 00 callq *(%rip) ## 0xd8 <__JIT_ENTRY+0xd8> + // 00000000000000d4: X86_64_RELOC_GOT __PyEval_FormatExcUnbound@GOTPCREL + // d8: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // dd: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // e6: 48 83 c4 10 addq $0x10, %rsp + // ea: 5d popq %rbp + // eb: e9 00 00 00 00 jmp 0xf0 <__JIT_ENTRY+0xf0> + // 00000000000000ec: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[240] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x60, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x0f, 0xb7, 0xcf, 0x48, + 0x8b, 0x74, 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8d, 0x55, 0xf8, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x88, + 0x9a, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf8, + 0x48, 0x85, 0xc0, 0x75, 0x20, 0x41, 0x0f, 0xb7, + 0xc7, 0x49, 0x8b, 0x44, 0xc4, 0x50, 0x48, 0x8b, + 0x40, 0x10, 0x48, 0x85, 0xc0, 0x74, 0x50, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x48, 0x89, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x0b, + 0x85, 0xc9, 0x78, 0x13, 0xff, 0xc9, 0x89, 0x0b, + 0x75, 0x0d, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf8, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0x45, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x34, 0x24, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_FormatExcUnbound+0x0 + // 8: OPARG + // 10: &_Py_Dealloc+0x0 + // 18: &PyMapping_GetOptionalItem+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&PyMapping_GetOptionalItem); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0xc); + patch_32r(code + 0xb3, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xd4, (uintptr_t)data + -0x4); + patch_32r(code + 0xec, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4c 89 eb movq %r13, %rbx + // 7: 49 8b 04 24 movq (%r12), %rax + // b: 49 8b 7c 24 18 movq 0x18(%r12), %rdi + // 10: 48 8b 40 20 movq 0x20(%rax), %rax + // 14: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 1b: 83 e1 fe andl $-0x2, %ecx + // 1e: 48 8b 54 88 18 movq 0x18(%rax,%rcx,4), %rdx + // 23: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 28: 49 8b 74 24 20 movq 0x20(%r12), %rsi + // 2d: 4c 89 e9 movq %r13, %rcx + // 30: ff 15 00 00 00 00 callq *(%rip) ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT __PyEval_LoadGlobalStackRef@GOTPCREL + // 36: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 44: 48 83 3b 00 cmpq $0x0, (%rbx) + // 48: 74 0a je 0x54 <__JIT_ENTRY+0x54> + // 4a: 49 83 c5 08 addq $0x8, %r13 + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 54: 5d popq %rbp + // 55: e9 00 00 00 00 jmp 0x5a <__JIT_ENTRY+0x5a> + // 0000000000000056: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[90] = { + 0x55, 0x48, 0x89, 0xe5, 0x4c, 0x89, 0xeb, 0x49, + 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x7c, 0x24, 0x18, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xe1, 0xfe, 0x48, 0x8b, + 0x54, 0x88, 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x49, 0x8b, 0x74, 0x24, 0x20, 0x4c, 0x89, 0xe9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0x3b, 0x00, + 0x74, 0x0a, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_PyEval_LoadGlobalStackRef+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_LoadGlobalStackRef); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + -0x4); + patch_32r(code + 0x50, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x56, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_BUILTINS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 20 movq 0x20(%r12), %rax + // 9: 48 8b 40 20 movq 0x20(%rax), %rax + // d: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 11: ba 01 00 00 00 movl $0x1, %edx + // 16: 48 d3 e2 shlq %cl, %rdx + // 19: 48 01 c2 addq %rax, %rdx + // 1c: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 23: c1 e0 04 shll $0x4, %eax + // 26: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 2b: 48 85 c0 testq %rax, %rax + // 2e: 74 18 je 0x48 <__JIT_ENTRY+0x48> + // 30: 8b 08 movl (%rax), %ecx + // 32: 85 c9 testl %ecx, %ecx + // 34: 78 04 js 0x3a <__JIT_ENTRY+0x3a> + // 36: ff c1 incl %ecx + // 38: 89 08 movl %ecx, (%rax) + // 3a: 49 89 45 00 movq %rax, (%r13) + // 3e: 49 83 c5 08 addq $0x8, %r13 + // 42: 5d popq %rbp + // 43: e9 00 00 00 00 jmp 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 48: 5d popq %rbp + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[78] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x20, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb6, 0x48, + 0x09, 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, + 0xe2, 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, + 0x44, 0x10, 0x28, 0x48, 0x85, 0xc0, 0x74, 0x18, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + -0x4); + patch_32r(code + 0x44, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x4a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS_FROM_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // c: ba 01 00 00 00 movl $0x1, %edx + // 11: 48 d3 e2 shlq %cl, %rdx + // 14: 48 01 c2 addq %rax, %rdx + // 17: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 1e: c1 e0 04 shll $0x4, %eax + // 21: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 26: 48 85 c0 testq %rax, %rax + // 29: 74 14 je 0x3f <__JIT_ENTRY+0x3f> + // 2b: 8b 08 movl (%rax), %ecx + // 2d: 85 c9 testl %ecx, %ecx + // 2f: 78 04 js 0x35 <__JIT_ENTRY+0x35> + // 31: ff c1 incl %ecx + // 33: 89 08 movl %ecx, (%rax) + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: 49 83 c5 f8 addq $-0x8, %r13 + // 43: 5d popq %rbp + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[73] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x0f, 0xb6, 0x48, 0x09, 0xba, 0x01, 0x00, 0x00, + 0x00, 0x48, 0xd3, 0xe2, 0x48, 0x01, 0xc2, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, + 0x04, 0x48, 0x8b, 0x44, 0x10, 0x28, 0x48, 0x85, + 0xc0, 0x74, 0x14, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x45, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 9: 48 8b 40 20 movq 0x20(%rax), %rax + // d: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 11: ba 01 00 00 00 movl $0x1, %edx + // 16: 48 d3 e2 shlq %cl, %rdx + // 19: 48 01 c2 addq %rax, %rdx + // 1c: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 23: c1 e0 04 shll $0x4, %eax + // 26: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 2b: 48 85 c0 testq %rax, %rax + // 2e: 74 18 je 0x48 <__JIT_ENTRY+0x48> + // 30: 8b 08 movl (%rax), %ecx + // 32: 85 c9 testl %ecx, %ecx + // 34: 78 04 js 0x3a <__JIT_ENTRY+0x3a> + // 36: ff c1 incl %ecx + // 38: 89 08 movl %ecx, (%rax) + // 3a: 49 89 45 00 movq %rax, (%r13) + // 3e: 49 83 c5 08 addq $0x8, %r13 + // 42: 5d popq %rbp + // 43: e9 00 00 00 00 jmp 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 48: 5d popq %rbp + // 49: e9 00 00 00 00 jmp 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[78] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x44, 0x24, + 0x18, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb6, 0x48, + 0x09, 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, + 0xe2, 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, + 0x44, 0x10, 0x28, 0x48, 0x85, 0xc0, 0x74, 0x18, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + -0x4); + patch_32r(code + 0x44, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x4a, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_GLOBAL_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE_FROM_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // c: ba 01 00 00 00 movl $0x1, %edx + // 11: 48 d3 e2 shlq %cl, %rdx + // 14: 48 01 c2 addq %rax, %rdx + // 17: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 1e: c1 e0 04 shll $0x4, %eax + // 21: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 26: 48 85 c0 testq %rax, %rax + // 29: 74 14 je 0x3f <__JIT_ENTRY+0x3f> + // 2b: 8b 08 movl (%rax), %ecx + // 2d: 85 c9 testl %ecx, %ecx + // 2f: 78 04 js 0x35 <__JIT_ENTRY+0x35> + // 31: ff c1 incl %ecx + // 33: 89 08 movl %ecx, (%rax) + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: 49 83 c5 f8 addq $-0x8, %r13 + // 43: 5d popq %rbp + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[73] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x0f, 0xb6, 0x48, 0x09, 0xba, 0x01, 0x00, 0x00, + 0x00, 0x48, 0xd3, 0xe2, 0x48, 0x01, 0xc2, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, + 0x04, 0x48, 0x8b, 0x44, 0x10, 0x28, 0x48, 0x85, + 0xc0, 0x74, 0x14, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x45, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__LOAD_LOCALS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_LOCALS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 44 24 28 movq 0x28(%r12), %rax + // 5: 48 85 c0 testq %rax, %rax + // 8: 74 17 je 0x21 <__JIT_ENTRY+0x21> + // a: 8b 08 movl (%rax), %ecx + // c: 85 c9 testl %ecx, %ecx + // e: 78 04 js 0x14 <__JIT_ENTRY+0x14> + // 10: ff c1 incl %ecx + // 12: 89 08 movl %ecx, (%rax) + // 14: 49 89 45 00 movq %rax, (%r13) + // 18: 49 83 c5 08 addq $0x8, %r13 + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 21: 55 pushq %rbp + // 22: 48 89 e5 movq %rsp, %rbp + // 25: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x31 <__JIT_ENTRY+0x31> + // 000000000000002d: X86_64_RELOC_GOT_LOAD _PyExc_SystemError@GOTPCREL + // 31: 48 8b 30 movq (%rax), %rsi + // 34: 48 8d 15 1d 00 00 00 leaq 0x1d(%rip), %rdx ## 0x58 <__JIT_ENTRY+0x58> + // 0000000000000037: X86_64_RELOC_SIGNED __cstring + // 3b: 4c 89 f7 movq %r14, %rdi + // 3e: ff 15 00 00 00 00 callq *(%rip) ## 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_GOT __PyErr_SetString@GOTPCREL + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 5d popq %rbp + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[88] = { + 0x49, 0x8b, 0x44, 0x24, 0x28, 0x48, 0x85, 0xc0, + 0x74, 0x17, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, + 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x1d, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'no locals found\x00' + // 10: &_PyErr_SetString+0x0 + // 18: &PyExc_SystemError+0x0 + const unsigned char data_body[32] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x10, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x18, (uintptr_t)&PyExc_SystemError); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x14); + patch_32r(code + 0x37, (uintptr_t)data + 0x71); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0xc); + patch_32r(code + 0x54, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_NAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 48 8b 40 20 movq 0x20(%rax), %rax + // c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 13: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 18: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1d: 4c 89 f7 movq %r14, %rdi + // 20: 4c 89 e6 movq %r12, %rsi + // 23: ff 15 00 00 00 00 callq *(%rip) ## 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_GOT __PyEval_LoadName@GOTPCREL + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 48 85 c0 testq %rax, %rax + // 3a: 74 0e je 0x4a <__JIT_ENTRY+0x4a> + // 3c: 49 89 45 00 movq %rax, (%r13) + // 40: 49 83 c5 08 addq $0x8, %r13 + // 44: 5d popq %rbp + // 45: e9 00 00 00 00 jmp 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 4a: 5d popq %rbp + // 4b: e9 00 00 00 00 jmp 0x50 <__JIT_ENTRY+0x50> + // 000000000000004c: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[80] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x54, 0xc8, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, + 0x4c, 0x89, 0xe6, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_LoadName+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_LoadName); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + -0x4); + patch_32r(code + 0x46, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x4c, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_SMALL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: c1 e0 05 shll $0x5, %eax + // e: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 15: 48 01 c8 addq %rcx, %rax + // 18: 48 05 a8 34 00 00 addq $0x34a8, %rax ## imm = 0x34A8 + // 1e: 49 89 45 00 movq %rax, (%r13) + // 22: 49 83 c5 08 addq $0x8, %r13 + // 26: 5d popq %rbp + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[39] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x05, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0xc8, + 0x48, 0x05, 0xa8, 0x34, 0x00, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: &_PyRuntime+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_0.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: b8 a8 34 00 00 movl $0x34a8, %eax ## imm = 0x34A8 + // 9: 48 03 05 00 00 00 00 addq (%rip), %rax ## 0x10 <__JIT_ENTRY+0x10> + // 000000000000000c: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 10: 49 89 45 00 movq %rax, (%r13) + // 14: 49 83 c5 08 addq $0x8, %r13 + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[25] = { + 0x55, 0x48, 0x89, 0xe5, 0xb8, 0xa8, 0x34, 0x00, + 0x00, 0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: b8 c8 34 00 00 movl $0x34c8, %eax ## imm = 0x34C8 + // 9: 48 03 05 00 00 00 00 addq (%rip), %rax ## 0x10 <__JIT_ENTRY+0x10> + // 000000000000000c: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 10: 49 89 45 00 movq %rax, (%r13) + // 14: 49 83 c5 08 addq $0x8, %r13 + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[25] = { + 0x55, 0x48, 0x89, 0xe5, 0xb8, 0xc8, 0x34, 0x00, + 0x00, 0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_2.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: b8 e8 34 00 00 movl $0x34e8, %eax ## imm = 0x34E8 + // 9: 48 03 05 00 00 00 00 addq (%rip), %rax ## 0x10 <__JIT_ENTRY+0x10> + // 000000000000000c: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 10: 49 89 45 00 movq %rax, (%r13) + // 14: 49 83 c5 08 addq $0x8, %r13 + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[25] = { + 0x55, 0x48, 0x89, 0xe5, 0xb8, 0xe8, 0x34, 0x00, + 0x00, 0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_3.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: b8 08 35 00 00 movl $0x3508, %eax ## imm = 0x3508 + // 9: 48 03 05 00 00 00 00 addq (%rip), %rax ## 0x10 <__JIT_ENTRY+0x10> + // 000000000000000c: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 10: 49 89 45 00 movq %rax, (%r13) + // 14: 49 83 c5 08 addq $0x8, %r13 + // 18: 5d popq %rbp + // 19: e9 00 00 00 00 jmp 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[25] = { + 0x55, 0x48, 0x89, 0xe5, 0xb8, 0x08, 0x35, 0x00, + 0x00, 0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SPECIAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SPECIAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 10: 49 83 c5 f8 addq $-0x8, %r13 + // 14: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx ## 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 1b: c1 e3 04 shll $0x4, %ebx + // 1e: 4c 8b 35 00 00 00 00 movq (%rip), %r14 ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT_LOAD __Py_SpecialMethods@GOTPCREL + // 25: 49 8b 34 1e movq (%r14,%rbx), %rsi + // 29: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2e: 48 8d 55 f0 leaq -0x10(%rbp), %rdx + // 32: 4c 89 ff movq %r15, %rdi + // 35: ff 15 00 00 00 00 callq *(%rip) ## 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_GOT __PyObject_LookupSpecialMethod@GOTPCREL + // 3b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 40: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 49: 48 85 c0 testq %rax, %rax + // 4c: 74 1e je 0x6c <__JIT_ENTRY+0x6c> + // 4e: 48 8b 4d f0 movq -0x10(%rbp), %rcx + // 52: 49 89 45 00 movq %rax, (%r13) + // 56: 49 89 4d 08 movq %rcx, 0x8(%r13) + // 5a: 49 83 c5 10 addq $0x10, %r13 + // 5e: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 62: 48 83 c4 10 addq $0x10, %rsp + // 66: 5d popq %rbp + // 67: e9 00 00 00 00 jmp 0x6c <__JIT_ENTRY+0x6c> + // 0000000000000068: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 6c: 48 8b 7d f8 movq -0x8(%rbp), %rdi + // 70: 48 8b 47 70 movq 0x70(%rdi), %rax + // 74: 48 85 c0 testq %rax, %rax + // 77: 74 14 je 0x8d <__JIT_ENTRY+0x8d> + // 79: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // 7e: 74 0d je 0x8d <__JIT_ENTRY+0x8d> + // 80: 49 89 fe movq %rdi, %r14 + // 83: 48 83 c4 10 addq $0x10, %rsp + // 87: 5d popq %rbp + // 88: e9 00 00 00 00 jmp 0x8d <__JIT_ENTRY+0x8d> + // 0000000000000089: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 8d: 49 01 de addq %rbx, %r14 + // 90: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 95: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x9c <__JIT_ENTRY+0x9c> + // 0000000000000098: X86_64_RELOC_GOT_LOAD _PyExc_TypeError@GOTPCREL + // 9c: 48 8b 30 movq (%rax), %rsi + // 9f: 49 8b 56 08 movq 0x8(%r14), %rdx + // a3: 49 8b 47 08 movq 0x8(%r15), %rax + // a7: 48 8b 48 18 movq 0x18(%rax), %rcx + // ab: 49 89 fe movq %rdi, %r14 + // ae: 31 c0 xorl %eax, %eax + // b0: ff 15 00 00 00 00 callq *(%rip) ## 0xb6 <__JIT_ENTRY+0xb6> + // 00000000000000b2: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // b6: 4c 89 f7 movq %r14, %rdi + // b9: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // be: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c7: 49 89 fe movq %rdi, %r14 + // ca: 48 83 c4 10 addq $0x10, %rsp + // ce: 5d popq %rbp + // cf: e9 00 00 00 00 jmp 0xd4 <__JIT_ENTRY+0xd4> + // 00000000000000d0: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[212] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x0f, 0xb7, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe3, 0x04, 0x4c, 0x8b, + 0x35, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x34, + 0x1e, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8d, + 0x55, 0xf0, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1e, 0x48, 0x8b, + 0x4d, 0xf0, 0x49, 0x89, 0x45, 0x00, 0x49, 0x89, + 0x4d, 0x08, 0x49, 0x83, 0xc5, 0x10, 0x4c, 0x8b, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x7d, 0xf8, + 0x48, 0x8b, 0x47, 0x70, 0x48, 0x85, 0xc0, 0x74, + 0x14, 0x48, 0x83, 0x78, 0x08, 0x00, 0x74, 0x0d, + 0x49, 0x89, 0xfe, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x49, 0x01, 0xde, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x49, + 0x8b, 0x56, 0x08, 0x49, 0x8b, 0x47, 0x08, 0x48, + 0x8b, 0x48, 0x18, 0x49, 0x89, 0xfe, 0x31, 0xc0, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xfe, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyErr_Format+0x0 + // 8: &PyExc_TypeError+0x0 + // 10: &_PyObject_LookupSpecialMethod+0x0 + // 18: &_Py_SpecialMethods+0x0 + // 20: OPARG + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x8, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x10, (uintptr_t)&_PyObject_LookupSpecialMethod); + patch_64(data + 0x18, (uintptr_t)&_Py_SpecialMethods); + patch_64(data + 0x20, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0xc); + patch_32r(code + 0x68, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x89, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x98, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + -0x4); + patch_32r(code + 0xd0, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_SUPER_ATTR_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_ATTR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 49 8b 45 e8 movq -0x18(%r13), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PySuper_Type@GOTPCREL + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 19: 49 8b 47 08 movq 0x8(%r15), %rax + // 1d: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 24: 75 0a jne 0x30 <__JIT_ENTRY+0x30> + // 26: 48 83 c4 10 addq $0x10, %rsp + // 2a: 5d popq %rbp + // 2b: e9 00 00 00 00 jmp 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 30: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 34: 49 8b 04 24 movq (%r12), %rax + // 38: 48 8b 40 20 movq 0x20(%rax), %rax + // 3c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x43 <__JIT_ENTRY+0x43> + // 000000000000003f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 43: 83 e1 fc andl $-0x4, %ecx + // 46: 48 8b 54 48 18 movq 0x18(%rax,%rcx,2), %rdx + // 4b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 50: 4c 89 ff movq %r15, %rdi + // 53: 48 89 de movq %rbx, %rsi + // 56: 31 c9 xorl %ecx, %ecx + // 58: ff 15 00 00 00 00 callq *(%rip) ## 0x5e <__JIT_ENTRY+0x5e> + // 000000000000005a: X86_64_RELOC_GOT __PySuper_Lookup@GOTPCREL + // 5e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 63: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6c: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x73 <__JIT_ENTRY+0x73> + // 000000000000006f: X86_64_RELOC_GOT_LOAD _PySuper_Type@GOTPCREL + // 73: 8b 0a movl (%rdx), %ecx + // 75: 85 c9 testl %ecx, %ecx + // 77: 78 1b js 0x94 <__JIT_ENTRY+0x94> + // 79: ff c9 decl %ecx + // 7b: 89 0a movl %ecx, (%rdx) + // 7d: 75 15 jne 0x94 <__JIT_ENTRY+0x94> + // 7f: 48 8b 3d 00 00 00 00 movq (%rip), %rdi ## 0x86 <__JIT_ENTRY+0x86> + // 0000000000000082: X86_64_RELOC_GOT_LOAD _PySuper_Type@GOTPCREL + // 86: 48 89 45 f8 movq %rax, -0x8(%rbp) + // 8a: ff 15 00 00 00 00 callq *(%rip) ## 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 90: 48 8b 45 f8 movq -0x8(%rbp), %rax + // 94: 41 8b 0f movl (%r15), %ecx + // 97: 85 c9 testl %ecx, %ecx + // 99: 78 16 js 0xb1 <__JIT_ENTRY+0xb1> + // 9b: ff c9 decl %ecx + // 9d: 41 89 0f movl %ecx, (%r15) + // a0: 75 0f jne 0xb1 <__JIT_ENTRY+0xb1> + // a2: 4c 89 ff movq %r15, %rdi + // a5: 49 89 c7 movq %rax, %r15 + // a8: ff 15 00 00 00 00 callq *(%rip) ## 0xae <__JIT_ENTRY+0xae> + // 00000000000000aa: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ae: 4c 89 f8 movq %r15, %rax + // b1: 8b 0b movl (%rbx), %ecx + // b3: 85 c9 testl %ecx, %ecx + // b5: 78 15 js 0xcc <__JIT_ENTRY+0xcc> + // b7: ff c9 decl %ecx + // b9: 89 0b movl %ecx, (%rbx) + // bb: 75 0f jne 0xcc <__JIT_ENTRY+0xcc> + // bd: 48 89 df movq %rbx, %rdi + // c0: 48 89 c3 movq %rax, %rbx + // c3: ff 15 00 00 00 00 callq *(%rip) ## 0xc9 <__JIT_ENTRY+0xc9> + // 00000000000000c5: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c9: 48 89 d8 movq %rbx, %rax + // cc: 48 85 c0 testq %rax, %rax + // cf: 74 12 je 0xe3 <__JIT_ENTRY+0xe3> + // d1: 49 89 45 e8 movq %rax, -0x18(%r13) + // d5: 49 83 c5 f0 addq $-0x10, %r13 + // d9: 48 83 c4 10 addq $0x10, %rsp + // dd: 5d popq %rbp + // de: e9 00 00 00 00 jmp 0xe3 <__JIT_ENTRY+0xe3> + // 00000000000000df: X86_64_RELOC_BRANCH __JIT_CONTINUE + // e3: 49 83 c5 e8 addq $-0x18, %r13 + // e7: 48 83 c4 10 addq $0x10, %rsp + // eb: 5d popq %rbp + // ec: e9 00 00 00 00 jmp 0xf1 <__JIT_ENTRY+0xf1> + // 00000000000000ed: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[241] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x49, 0x8b, 0x45, 0xe8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x11, 0x4d, 0x8b, 0x7d, + 0xf0, 0x49, 0x8b, 0x47, 0x08, 0xf6, 0x80, 0xab, + 0x00, 0x00, 0x00, 0x80, 0x75, 0x0a, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xe1, 0xfc, 0x48, 0x8b, + 0x54, 0x48, 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x4c, 0x89, 0xff, 0x48, 0x89, 0xde, 0x31, 0xc9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0a, 0x85, 0xc9, 0x78, + 0x1b, 0xff, 0xc9, 0x89, 0x0a, 0x75, 0x15, 0x48, + 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0x45, 0xf8, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x45, 0xf8, 0x41, 0x8b, 0x0f, 0x85, + 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x41, 0x89, 0x0f, + 0x75, 0x0f, 0x4c, 0x89, 0xff, 0x49, 0x89, 0xc7, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf8, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x15, 0xff, + 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x74, + 0x12, 0x49, 0x89, 0x45, 0xe8, 0x49, 0x83, 0xc5, + 0xf0, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xe8, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PySuper_Type+0x0 + // 10: &_PySuper_Lookup+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PySuper_Type); + patch_64(data + 0x10, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_32r(code + 0x2c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + -0x4); + patch_32r(code + 0xdf, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xed, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__LOAD_SUPER_ATTR_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_METHOD.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 49 8b 45 e8 movq -0x18(%r13), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PySuper_Type@GOTPCREL + // 13: 75 11 jne 0x26 <__JIT_ENTRY+0x26> + // 15: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 19: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1d: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 24: 75 0a jne 0x30 <__JIT_ENTRY+0x30> + // 26: 48 83 c4 10 addq $0x10, %rsp + // 2a: 5d popq %rbp + // 2b: e9 00 00 00 00 jmp 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 30: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 34: 49 8b 04 24 movq (%r12), %rax + // 38: 48 8b 40 20 movq 0x20(%rax), %rax + // 3c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x43 <__JIT_ENTRY+0x43> + // 000000000000003f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 43: 83 e1 fc andl $-0x4, %ecx + // 46: 48 8b 54 48 18 movq 0x18(%rax,%rcx,2), %rdx + // 4b: c7 45 fc 00 00 00 00 movl $0x0, -0x4(%rbp) + // 52: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 57: 49 8b 47 08 movq 0x8(%r15), %rax + // 5b: 48 8b 80 90 00 00 00 movq 0x90(%rax), %rax + // 62: 31 f6 xorl %esi, %esi + // 64: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x6b <__JIT_ENTRY+0x6b> + // 0000000000000067: X86_64_RELOC_GOT _PyObject_GenericGetAttr@GOTPCREL + // 6b: 48 8d 4d fc leaq -0x4(%rbp), %rcx + // 6f: 48 0f 45 ce cmovneq %rsi, %rcx + // 73: 48 89 df movq %rbx, %rdi + // 76: 4c 89 fe movq %r15, %rsi + // 79: ff 15 00 00 00 00 callq *(%rip) ## 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_GOT __PySuper_Lookup@GOTPCREL + // 7f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 84: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8d: 48 85 c0 testq %rax, %rax + // 90: 0f 84 9a 00 00 00 je 0x130 <__JIT_ENTRY+0x130> + // 96: 83 7d fc 00 cmpl $0x0, -0x4(%rbp) + // 9a: 75 3b jne 0xd7 <__JIT_ENTRY+0xd7> + // 9c: 49 83 c5 f8 addq $-0x8, %r13 + // a0: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a5: 41 8b 0f movl (%r15), %ecx + // a8: 85 c9 testl %ecx, %ecx + // aa: 78 16 js 0xc2 <__JIT_ENTRY+0xc2> + // ac: ff c9 decl %ecx + // ae: 41 89 0f movl %ecx, (%r15) + // b1: 75 0f jne 0xc2 <__JIT_ENTRY+0xc2> + // b3: 4c 89 ff movq %r15, %rdi + // b6: 49 89 c7 movq %rax, %r15 + // b9: ff 15 00 00 00 00 callq *(%rip) ## 0xbf <__JIT_ENTRY+0xbf> + // 00000000000000bb: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // bf: 4c 89 f8 movq %r15, %rax + // c2: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // c7: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d0: 49 83 c5 08 addq $0x8, %r13 + // d4: 45 31 ff xorl %r15d, %r15d + // d7: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0xde <__JIT_ENTRY+0xde> + // 00000000000000da: X86_64_RELOC_GOT_LOAD _PySuper_Type@GOTPCREL + // de: 8b 11 movl (%rcx), %edx + // e0: 85 d2 testl %edx, %edx + // e2: 78 1b js 0xff <__JIT_ENTRY+0xff> + // e4: ff ca decl %edx + // e6: 89 11 movl %edx, (%rcx) + // e8: 75 15 jne 0xff <__JIT_ENTRY+0xff> + // ea: 48 8b 3d 00 00 00 00 movq (%rip), %rdi ## 0xf1 <__JIT_ENTRY+0xf1> + // 00000000000000ed: X86_64_RELOC_GOT_LOAD _PySuper_Type@GOTPCREL + // f1: 48 89 45 f0 movq %rax, -0x10(%rbp) + // f5: ff 15 00 00 00 00 callq *(%rip) ## 0xfb <__JIT_ENTRY+0xfb> + // 00000000000000f7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // fb: 48 8b 45 f0 movq -0x10(%rbp), %rax + // ff: 8b 0b movl (%rbx), %ecx + // 101: 85 c9 testl %ecx, %ecx + // 103: 78 15 js 0x11a <__JIT_ENTRY+0x11a> + // 105: ff c9 decl %ecx + // 107: 89 0b movl %ecx, (%rbx) + // 109: 75 0f jne 0x11a <__JIT_ENTRY+0x11a> + // 10b: 48 89 df movq %rbx, %rdi + // 10e: 48 89 c3 movq %rax, %rbx + // 111: ff 15 00 00 00 00 callq *(%rip) ## 0x117 <__JIT_ENTRY+0x117> + // 0000000000000113: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 117: 48 89 d8 movq %rbx, %rax + // 11a: 49 89 45 e8 movq %rax, -0x18(%r13) + // 11e: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 122: 49 83 c5 f8 addq $-0x8, %r13 + // 126: 48 83 c4 10 addq $0x10, %rsp + // 12a: 5d popq %rbp + // 12b: e9 00 00 00 00 jmp 0x130 <__JIT_ENTRY+0x130> + // 000000000000012c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 130: 48 83 c4 10 addq $0x10, %rsp + // 134: 5d popq %rbp + // 135: e9 00 00 00 00 jmp 0x13a <__JIT_ENTRY+0x13a> + // 0000000000000136: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[314] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x49, 0x8b, 0x45, 0xe8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x11, 0x49, 0x8b, 0x5d, + 0xf0, 0x48, 0x8b, 0x43, 0x08, 0xf6, 0x80, 0xab, + 0x00, 0x00, 0x00, 0x80, 0x75, 0x0a, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xe1, 0xfc, 0x48, 0x8b, + 0x54, 0x48, 0x18, 0xc7, 0x45, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, + 0x8b, 0x47, 0x08, 0x48, 0x8b, 0x80, 0x90, 0x00, + 0x00, 0x00, 0x31, 0xf6, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8d, 0x4d, 0xfc, 0x48, + 0x0f, 0x45, 0xce, 0x48, 0x89, 0xdf, 0x4c, 0x89, + 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x0f, 0x84, 0x9a, 0x00, 0x00, 0x00, 0x83, 0x7d, + 0xfc, 0x00, 0x75, 0x3b, 0x49, 0x83, 0xc5, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x41, 0x8b, 0x0f, + 0x85, 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x41, 0x89, + 0x0f, 0x75, 0x0f, 0x4c, 0x89, 0xff, 0x49, 0x89, + 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x45, 0x31, 0xff, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x11, + 0x85, 0xd2, 0x78, 0x1b, 0xff, 0xca, 0x89, 0x11, + 0x75, 0x15, 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x45, 0xf0, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0xf0, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, + 0x0b, 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xd8, 0x49, 0x89, 0x45, 0xe8, 0x4d, 0x89, + 0x7d, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PySuper_Type+0x0 + // 10: &_PySuper_Lookup+0x0 + // 18: &PyObject_GenericGetAttr+0x0 + // 20: OPARG + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PySuper_Type); + patch_64(data + 0x10, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x18, (uintptr_t)&PyObject_GenericGetAttr); + patch_64(data + 0x20, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_32r(code + 0x2c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xda, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xed, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x113, (uintptr_t)data + -0x4); + patch_32r(code + 0x12c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x136, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MAKE_CALLARGS_A_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CALLARGS_A_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // c: 48 8b 43 08 movq 0x8(%rbx), %rax + // 10: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT _PyTuple_Type@GOTPCREL + // 17: 0f 84 81 00 00 00 je 0x9e <__JIT_ENTRY+0x9e> + // 1d: 49 8b 75 e0 movq -0x20(%r13), %rsi + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 4c 89 f7 movq %r14, %rdi + // 29: 48 89 da movq %rbx, %rdx + // 2c: ff 15 00 00 00 00 callq *(%rip) ## 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_GOT __Py_Check_ArgsIterable@GOTPCREL + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 85 c0 testl %eax, %eax + // 42: 78 68 js 0xac <__JIT_ENTRY+0xac> + // 44: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 49: 48 89 df movq %rbx, %rdi + // 4c: ff 15 00 00 00 00 callq *(%rip) ## 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_GOT _PySequence_Tuple@GOTPCREL + // 52: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 57: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 60: 48 85 c0 testq %rax, %rax + // 63: 74 47 je 0xac <__JIT_ENTRY+0xac> + // 65: 49 83 c5 f0 addq $-0x10, %r13 + // 69: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6e: 8b 0b movl (%rbx), %ecx + // 70: 85 c9 testl %ecx, %ecx + // 72: 78 15 js 0x89 <__JIT_ENTRY+0x89> + // 74: ff c9 decl %ecx + // 76: 89 0b movl %ecx, (%rbx) + // 78: 75 0f jne 0x89 <__JIT_ENTRY+0x89> + // 7a: 48 89 df movq %rbx, %rdi + // 7d: 48 89 c3 movq %rax, %rbx + // 80: ff 15 00 00 00 00 callq *(%rip) ## 0x86 <__JIT_ENTRY+0x86> + // 0000000000000082: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 86: 48 89 d8 movq %rbx, %rax + // 89: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 8e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 97: 49 83 c5 10 addq $0x10, %r13 + // 9b: 48 89 c3 movq %rax, %rbx + // 9e: 49 89 5d f0 movq %rbx, -0x10(%r13) + // a2: 4d 89 7d f8 movq %r15, -0x8(%r13) + // a6: 5d popq %rbp + // a7: e9 00 00 00 00 jmp 0xac <__JIT_ENTRY+0xac> + // 00000000000000a8: X86_64_RELOC_BRANCH __JIT_CONTINUE + // ac: 5d popq %rbp + // ad: e9 00 00 00 00 jmp 0xb2 <__JIT_ENTRY+0xb2> + // 00000000000000ae: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[178] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x43, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x84, 0x81, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, + 0xe0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf7, 0x48, 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x68, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x47, 0x49, 0x83, 0xc5, + 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x0b, + 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, + 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0x10, 0x48, 0x89, 0xc3, 0x49, 0x89, + 0x5d, 0xf0, 0x4d, 0x89, 0x7d, 0xf8, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PySequence_Tuple+0x0 + // 10: &_Py_Check_ArgsIterable+0x0 + // 18: &PyTuple_Type+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x10, (uintptr_t)&_Py_Check_ArgsIterable); + patch_64(data + 0x18, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + -0x4); + patch_32r(code + 0xa8, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xae, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MAKE_CELL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CELL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 0f b7 c3 movzwl %bx, %eax + // e: 49 8b 7c c4 50 movq 0x50(%r12,%rax,8), %rdi + // 13: ff 15 00 00 00 00 callq *(%rip) ## 0x19 <__JIT_ENTRY+0x19> + // 0000000000000015: X86_64_RELOC_GOT _PyCell_New@GOTPCREL + // 19: 48 85 c0 testq %rax, %rax + // 1c: 74 37 je 0x55 <__JIT_ENTRY+0x55> + // 1e: 0f b7 cb movzwl %bx, %ecx + // 21: 49 8b 7c cc 50 movq 0x50(%r12,%rcx,8), %rdi + // 26: 49 89 44 cc 50 movq %rax, 0x50(%r12,%rcx,8) + // 2b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 30: 48 85 ff testq %rdi, %rdi + // 33: 74 0c je 0x41 <__JIT_ENTRY+0x41> + // 35: 8b 07 movl (%rdi), %eax + // 37: 85 c0 testl %eax, %eax + // 39: 78 06 js 0x41 <__JIT_ENTRY+0x41> + // 3b: ff c8 decl %eax + // 3d: 89 07 movl %eax, (%rdi) + // 3f: 74 1a je 0x5b <__JIT_ENTRY+0x5b> + // 41: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 46: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4f: 5d popq %rbp + // 50: e9 00 00 00 00 jmp 0x55 <__JIT_ENTRY+0x55> + // 0000000000000051: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 55: 5d popq %rbp + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 5b: ff 15 00 00 00 00 callq *(%rip) ## 0x61 <__JIT_ENTRY+0x61> + // 000000000000005d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 61: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 66: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6f: 5d popq %rbp + // 70: e9 00 00 00 00 jmp 0x75 <__JIT_ENTRY+0x75> + // 0000000000000071: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[112] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc3, 0x49, 0x8b, + 0x7c, 0xc4, 0x50, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x37, 0x0f, 0xb7, + 0xcb, 0x49, 0x8b, 0x7c, 0xcc, 0x50, 0x49, 0x89, + 0x44, 0xcc, 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x1a, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyCell_New+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyCell_New); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_32r(code + 0x51, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x57, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + -0x4); +} + +void +emit__MAKE_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_FUNCTION.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 49 8b 74 24 18 movq 0x18(%r12), %rsi + // 12: 48 89 df movq %rbx, %rdi + // 15: ff 15 00 00 00 00 callq *(%rip) ## 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_GOT _PyFunction_New@GOTPCREL + // 1b: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 21: 49 89 c7 movq %rax, %r15 + // 24: 8b 03 movl (%rbx), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 06 js 0x30 <__JIT_ENTRY+0x30> + // 2a: ff c8 decl %eax + // 2c: 89 03 movl %eax, (%rbx) + // 2e: 74 2d je 0x5d <__JIT_ENTRY+0x5d> + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 4d 85 ff testq %r15, %r15 + // 41: 74 36 je 0x79 <__JIT_ENTRY+0x79> + // 43: 8b 73 5c movl 0x5c(%rbx), %esi + // 46: 4c 89 ff movq %r15, %rdi + // 49: ff 15 00 00 00 00 callq *(%rip) ## 0x4f <__JIT_ENTRY+0x4f> + // 000000000000004b: X86_64_RELOC_GOT __PyFunction_SetVersion@GOTPCREL + // 4f: 4d 89 7d 00 movq %r15, (%r13) + // 53: 49 83 c5 08 addq $0x8, %r13 + // 57: 5d popq %rbp + // 58: e9 00 00 00 00 jmp 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5d: 48 89 df movq %rbx, %rdi + // 60: ff 15 00 00 00 00 callq *(%rip) ## 0x66 <__JIT_ENTRY+0x66> + // 0000000000000062: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 66: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 74: 4d 85 ff testq %r15, %r15 + // 77: 75 ca jne 0x43 <__JIT_ENTRY+0x43> + // 79: 5d popq %rbp + // 7a: e9 00 00 00 00 jmp 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[127] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x74, + 0x24, 0x18, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, 0x24, 0x40, + 0xf8, 0x49, 0x89, 0xc7, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x2d, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, + 0xff, 0x74, 0x36, 0x8b, 0x73, 0x5c, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x75, + 0xca, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyFunction_SetVersion+0x0 + // 10: &PyFunction_New+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyFunction_SetVersion); + patch_64(data + 0x10, (uintptr_t)&PyFunction_New); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x4); + patch_32r(code + 0x59, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)data + -0x4); + patch_32r(code + 0x7b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MAKE_WARM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_WARM.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_EXECUTOR@GOTPCREL + // b: c6 40 23 01 movb $0x1, 0x23(%rax) + // f: 49 8b 46 10 movq 0x10(%r14), %rax + // 13: 48 ff 88 50 67 03 00 decq 0x36750(%rax) + // 1a: 74 06 je 0x22 <__JIT_ENTRY+0x22> + // 1c: 5d popq %rbp + // 1d: e9 00 00 00 00 jmp 0x22 <__JIT_ENTRY+0x22> + // 000000000000001e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 22: f0 lock + // 23: 49 81 4e 18 80 00 00 00 orq $0x80, 0x18(%r14) + // 2b: 5d popq %rbp + // 2c: e9 00 00 00 00 jmp 0x31 <__JIT_ENTRY+0x31> + // 000000000000002d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[44] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc6, 0x40, 0x23, 0x01, 0x49, + 0x8b, 0x46, 0x10, 0x48, 0xff, 0x88, 0x50, 0x67, + 0x03, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x49, 0x81, 0x4e, 0x18, 0x80, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: EXECUTOR + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_32r(code + 0x1e, (uintptr_t)code + sizeof(code_body) + -0x4); +} + +void +emit__MAP_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAP_ADD.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 75 f0 movq -0x10(%r13), %rsi + // f: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 13: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // 1a: 48 29 c1 subq %rax, %rcx + // 1d: 49 8b 7c cd 00 movq (%r13,%rcx,8), %rdi + // 22: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 27: ff 15 00 00 00 00 callq *(%rip) ## 0x2d <__JIT_ENTRY+0x2d> + // 0000000000000029: X86_64_RELOC_GOT __PyDict_SetItem_Take2@GOTPCREL + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 49 83 c5 f0 addq $-0x10, %r13 + // 3f: 85 c0 testl %eax, %eax + // 41: 74 06 je 0x49 <__JIT_ENTRY+0x49> + // 43: 5d popq %rbp + // 44: e9 00 00 00 00 jmp 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 49: 5d popq %rbp + // 4a: e9 00 00 00 00 jmp 0x4f <__JIT_ENTRY+0x4f> + // 000000000000004b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[74] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf0, 0x49, + 0x8b, 0x55, 0xf8, 0x48, 0xc7, 0xc1, 0xfe, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xc1, 0x49, 0x8b, 0x7c, + 0xcd, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x85, + 0xc0, 0x74, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x5d, + }; + // 0: &_PyDict_SetItem_Take2+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + -0x4); + patch_32r(code + 0x45, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MATCH_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_CLASS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 f7 movq %r14, %rdi + // b: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // f: 4d 8b 75 e8 movq -0x18(%r13), %r14 + // 13: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 17: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 23: 48 89 7d f8 movq %rdi, -0x8(%rbp) + // 27: 4c 89 f6 movq %r14, %rsi + // 2a: 48 89 da movq %rbx, %rdx + // 2d: 4d 89 f8 movq %r15, %r8 + // 30: ff 15 00 00 00 00 callq *(%rip) ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT __PyEval_MatchClass@GOTPCREL + // 36: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 44: 41 8b 0e movl (%r14), %ecx + // 47: 85 c9 testl %ecx, %ecx + // 49: 78 16 js 0x61 <__JIT_ENTRY+0x61> + // 4b: ff c9 decl %ecx + // 4d: 41 89 0e movl %ecx, (%r14) + // 50: 75 0f jne 0x61 <__JIT_ENTRY+0x61> + // 52: 4c 89 f7 movq %r14, %rdi + // 55: 49 89 c6 movq %rax, %r14 + // 58: ff 15 00 00 00 00 callq *(%rip) ## 0x5e <__JIT_ENTRY+0x5e> + // 000000000000005a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5e: 4c 89 f0 movq %r14, %rax + // 61: 8b 0b movl (%rbx), %ecx + // 63: 85 c9 testl %ecx, %ecx + // 65: 78 15 js 0x7c <__JIT_ENTRY+0x7c> + // 67: ff c9 decl %ecx + // 69: 89 0b movl %ecx, (%rbx) + // 6b: 75 0f jne 0x7c <__JIT_ENTRY+0x7c> + // 6d: 48 89 df movq %rbx, %rdi + // 70: 48 89 c3 movq %rax, %rbx + // 73: ff 15 00 00 00 00 callq *(%rip) ## 0x79 <__JIT_ENTRY+0x79> + // 0000000000000075: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 79: 48 89 d8 movq %rbx, %rax + // 7c: 41 8b 0f movl (%r15), %ecx + // 7f: 85 c9 testl %ecx, %ecx + // 81: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 85: 78 07 js 0x8e <__JIT_ENTRY+0x8e> + // 87: ff c9 decl %ecx + // 89: 41 89 0f movl %ecx, (%r15) + // 8c: 74 17 je 0xa5 <__JIT_ENTRY+0xa5> + // 8e: 48 85 c0 testq %rax, %rax + // 91: 74 26 je 0xb9 <__JIT_ENTRY+0xb9> + // 93: 49 89 45 e8 movq %rax, -0x18(%r13) + // 97: 49 83 c5 f0 addq $-0x10, %r13 + // 9b: 48 83 c4 10 addq $0x10, %rsp + // 9f: 5d popq %rbp + // a0: e9 00 00 00 00 jmp 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_BRANCH __JIT_CONTINUE + // a5: 4c 89 ff movq %r15, %rdi + // a8: 48 89 c3 movq %rax, %rbx + // ab: ff 15 00 00 00 00 callq *(%rip) ## 0xb1 <__JIT_ENTRY+0xb1> + // 00000000000000ad: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b1: 48 89 d8 movq %rbx, %rax + // b4: 48 85 c0 testq %rax, %rax + // b7: 75 da jne 0x93 <__JIT_ENTRY+0x93> + // b9: 49 8b 4e 70 movq 0x70(%r14), %rcx + // bd: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xc4 <__JIT_ENTRY+0xc4> + // 00000000000000c0: X86_64_RELOC_GOT_LOAD __Py_NoneStruct@GOTPCREL + // c4: 48 85 c9 testq %rcx, %rcx + // c7: 74 ca je 0x93 <__JIT_ENTRY+0x93> + // c9: 48 83 79 08 00 cmpq $0x0, 0x8(%rcx) + // ce: 74 c3 je 0x93 <__JIT_ENTRY+0x93> + // d0: 49 83 c5 e8 addq $-0x18, %r13 + // d4: 48 83 c4 10 addq $0x10, %rsp + // d8: 5d popq %rbp + // d9: e9 00 00 00 00 jmp 0xde <__JIT_ENTRY+0xde> + // 00000000000000da: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[222] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xf7, 0x4d, 0x8b, 0x7d, 0xf8, 0x4d, + 0x8b, 0x75, 0xe8, 0x49, 0x8b, 0x5d, 0xf0, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x7d, 0xf8, 0x4c, + 0x89, 0xf6, 0x48, 0x89, 0xda, 0x4d, 0x89, 0xf8, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x0e, 0x85, + 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x41, 0x89, 0x0e, + 0x75, 0x0f, 0x4c, 0x89, 0xf7, 0x49, 0x89, 0xc6, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf0, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x15, 0xff, + 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x41, 0x8b, 0x0f, 0x85, + 0xc9, 0x4c, 0x8b, 0x75, 0xf8, 0x78, 0x07, 0xff, + 0xc9, 0x41, 0x89, 0x0f, 0x74, 0x17, 0x48, 0x85, + 0xc0, 0x74, 0x26, 0x49, 0x89, 0x45, 0xe8, 0x49, + 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xff, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, + 0xda, 0x49, 0x8b, 0x4e, 0x70, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, + 0xca, 0x48, 0x83, 0x79, 0x08, 0x00, 0x74, 0xc3, + 0x49, 0x83, 0xc5, 0xe8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_PyEval_MatchClass+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_PyEval_MatchClass); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0x4); + patch_32r(code + 0xa1, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc0, (uintptr_t)data + -0x4); + patch_32r(code + 0xda, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MATCH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_KEYS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 4c 89 f7 movq %r14, %rdi + // 14: ff 15 00 00 00 00 callq *(%rip) ## 0x1a <__JIT_ENTRY+0x1a> + // 0000000000000016: X86_64_RELOC_GOT __PyEval_MatchKeys@GOTPCREL + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 48 85 c0 testq %rax, %rax + // 2b: 74 0e je 0x3b <__JIT_ENTRY+0x3b> + // 2d: 49 89 45 00 movq %rax, (%r13) + // 31: 49 83 c5 08 addq $0x8, %r13 + // 35: 5d popq %rbp + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 5d popq %rbp + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[65] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x75, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_PyEval_MatchKeys+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_MatchKeys); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x3d, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__MATCH_MAPPING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_MAPPING.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: f6 80 a8 00 00 00 40 testb $0x40, 0xa8(%rax) + // 13: 75 15 jne 0x2a <__JIT_ENTRY+0x2a> + // 15: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 1c: 49 89 45 00 movq %rax, (%r13) + // 20: 49 83 c5 08 addq $0x8, %r13 + // 24: 5d popq %rbp + // 25: e9 00 00 00 00 jmp 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x31 <__JIT_ENTRY+0x31> + // 000000000000002d: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 31: 49 89 45 00 movq %rax, (%r13) + // 35: 49 83 c5 08 addq $0x8, %r13 + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[58] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0xf6, 0x80, 0xa8, 0x00, + 0x00, 0x00, 0x40, 0x75, 0x15, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_32r(code + 0x26, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + -0x4); +} + +void +emit__MATCH_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_SEQUENCE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: f6 80 a8 00 00 00 20 testb $0x20, 0xa8(%rax) + // 13: 75 15 jne 0x2a <__JIT_ENTRY+0x2a> + // 15: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 1c: 49 89 45 00 movq %rax, (%r13) + // 20: 49 83 c5 08 addq $0x8, %r13 + // 24: 5d popq %rbp + // 25: e9 00 00 00 00 jmp 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 2a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x31 <__JIT_ENTRY+0x31> + // 000000000000002d: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 31: 49 89 45 00 movq %rax, (%r13) + // 35: 49 83 c5 08 addq $0x8, %r13 + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[58] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0xf6, 0x80, 0xa8, 0x00, + 0x00, 0x00, 0x20, 0x75, 0x15, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_32r(code + 0x26, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + -0x4); +} + +void +emit__MAYBE_EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 0f b7 15 00 00 00 00 movzwl (%rip), %edx ## 0x7 <__JIT_ENTRY+0x7> + // 0000000000000003: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 7: b8 fe ff ff ff movl $0xfffffffe, %eax ## imm = 0xFFFFFFFE + // c: 29 d0 subl %edx, %eax + // e: 48 98 cltq + // 10: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 15: 48 8b 71 08 movq 0x8(%rcx), %rsi + // 19: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 20: 0f 85 00 00 00 00 jne 0x26 <__JIT_ENTRY+0x26> + // 0000000000000022: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 26: f7 d2 notl %edx + // 28: 48 63 d2 movslq %edx, %rdx + // 2b: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 31: 0f 85 00 00 00 00 jne 0x37 <__JIT_ENTRY+0x37> + // 0000000000000033: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 37: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 3b: 8b 3e movl (%rsi), %edi + // 3d: 85 ff testl %edi, %edi + // 3f: 78 04 js 0x45 <__JIT_ENTRY+0x45> + // 41: ff c7 incl %edi + // 43: 89 3e movl %edi, (%rsi) + // 45: 49 89 74 d5 00 movq %rsi, (%r13,%rdx,8) + // 4a: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 4e: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 53: 8b 11 movl (%rcx), %edx + // 55: 85 d2 testl %edx, %edx + // 57: 78 04 js 0x5d <__JIT_ENTRY+0x5d> + // 59: ff c2 incl %edx + // 5b: 89 11 movl %edx, (%rcx) + // 5d: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 62: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 67: 8b 07 movl (%rdi), %eax + // 69: 85 c0 testl %eax, %eax + // 6b: 78 06 js 0x73 <__JIT_ENTRY+0x73> + // 6d: ff c8 decl %eax + // 6f: 89 07 movl %eax, (%rdi) + // 71: 74 13 je 0x86 <__JIT_ENTRY+0x86> + // 73: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: e9 00 00 00 00 jmp 0x86 <__JIT_ENTRY+0x86> + // 0000000000000082: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 86: 55 pushq %rbp + // 87: 48 89 e5 movq %rsp, %rbp + // 8a: ff 15 00 00 00 00 callq *(%rip) ## 0x90 <__JIT_ENTRY+0x90> + // 000000000000008c: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 90: 5d popq %rbp + // 91: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: e9 00 00 00 00 jmp 0xa4 <__JIT_ENTRY+0xa4> + // 00000000000000a0: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[159] = { + 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0xb8, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xd0, 0x48, 0x98, + 0x49, 0x8b, 0x4c, 0xc5, 0x00, 0x48, 0x8b, 0x71, + 0x08, 0x48, 0x3b, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd2, + 0x48, 0x63, 0xd2, 0x49, 0x83, 0x7c, 0xd5, 0x00, + 0x00, 0x0f, 0x85, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x71, 0x18, 0x8b, 0x3e, 0x85, 0xff, 0x78, + 0x04, 0xff, 0xc7, 0x89, 0x3e, 0x49, 0x89, 0x74, + 0xd5, 0x00, 0x48, 0x8b, 0x49, 0x10, 0x49, 0x8b, + 0x7c, 0xc5, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4c, + 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x07, 0x74, 0x13, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, + 0x89, 0xe5, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyMethod_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_32r(code + 0x22, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x33, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x82, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + -0x4); +} + +void +emit__MAYBE_EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD_KW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 15 00 00 00 00 movzwl (%rip), %edx ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 5d f8 movq -0x8(%r13), %rbx + // f: b8 fd ff ff ff movl $0xfffffffd, %eax ## imm = 0xFFFFFFFD + // 14: 29 d0 subl %edx, %eax + // 16: 48 98 cltq + // 18: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 1d: 48 8b 71 08 movq 0x8(%rcx), %rsi + // 21: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi ## 0x28 <__JIT_ENTRY+0x28> + // 0000000000000024: X86_64_RELOC_GOT _PyMethod_Type@GOTPCREL + // 28: 74 0a je 0x34 <__JIT_ENTRY+0x34> + // 2a: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 2e: 5d popq %rbp + // 2f: e9 00 00 00 00 jmp 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 34: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 39: 29 d6 subl %edx, %esi + // 3b: 48 63 d6 movslq %esi, %rdx + // 3e: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 44: 75 e4 jne 0x2a <__JIT_ENTRY+0x2a> + // 46: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 4a: 44 8b 06 movl (%rsi), %r8d + // 4d: 48 89 cf movq %rcx, %rdi + // 50: 45 85 c0 testl %r8d, %r8d + // 53: 78 0b js 0x60 <__JIT_ENTRY+0x60> + // 55: 41 ff c0 incl %r8d + // 58: 44 89 06 movl %r8d, (%rsi) + // 5b: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 60: 49 89 74 d5 00 movq %rsi, (%r13,%rdx,8) + // 65: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 69: 8b 11 movl (%rcx), %edx + // 6b: 85 d2 testl %edx, %edx + // 6d: 78 04 js 0x73 <__JIT_ENTRY+0x73> + // 6f: ff c2 incl %edx + // 71: 89 11 movl %edx, (%rcx) + // 73: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 78: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7d: 8b 07 movl (%rdi), %eax + // 7f: 85 c0 testl %eax, %eax + // 81: 78 0c js 0x8f <__JIT_ENTRY+0x8f> + // 83: ff c8 decl %eax + // 85: 89 07 movl %eax, (%rdi) + // 87: 75 06 jne 0x8f <__JIT_ENTRY+0x8f> + // 89: ff 15 00 00 00 00 callq *(%rip) ## 0x8f <__JIT_ENTRY+0x8f> + // 000000000000008b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 94: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9d: 49 89 5d f8 movq %rbx, -0x8(%r13) + // a1: 5d popq %rbp + // a2: e9 00 00 00 00 jmp 0xa7 <__JIT_ENTRY+0xa7> + // 00000000000000a3: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[162] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, 0xb8, + 0xfd, 0xff, 0xff, 0xff, 0x29, 0xd0, 0x48, 0x98, + 0x49, 0x8b, 0x4c, 0xc5, 0x00, 0x48, 0x8b, 0x71, + 0x08, 0x48, 0x3b, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x0a, 0x49, 0x89, 0x5d, 0xf8, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0xbe, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xd6, 0x48, 0x63, 0xd6, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x75, 0xe4, 0x48, 0x8b, + 0x71, 0x18, 0x44, 0x8b, 0x06, 0x48, 0x89, 0xcf, + 0x45, 0x85, 0xc0, 0x78, 0x0b, 0x41, 0xff, 0xc0, + 0x44, 0x89, 0x06, 0x49, 0x8b, 0x7c, 0xc5, 0x00, + 0x49, 0x89, 0x74, 0xd5, 0x00, 0x48, 0x8b, 0x49, + 0x10, 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, + 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, + 0xf8, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyMethod_Type+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_32r(code + 0x30, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + -0x4); +} + +void +emit__NOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _NOP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 5d popq %rbp + // 5: e9 00 00 00 00 jmp 0xa <__JIT_ENTRY+0xa> + // 0000000000000006: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[5] = { + 0x55, 0x48, 0x89, 0xe5, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__POP_EXCEPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_EXCEPT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 8b 39 movq (%rcx), %rdi + // 10: 31 d2 xorl %edx, %edx + // 12: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x19 <__JIT_ENTRY+0x19> + // 0000000000000015: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // 19: 48 0f 45 d0 cmovneq %rax, %rdx + // 1d: 48 89 11 movq %rdx, (%rcx) + // 20: 48 85 ff testq %rdi, %rdi + // 23: 74 0c je 0x31 <__JIT_ENTRY+0x31> + // 25: 8b 07 movl (%rdi), %eax + // 27: 85 c0 testl %eax, %eax + // 29: 78 06 js 0x31 <__JIT_ENTRY+0x31> + // 2b: ff c8 decl %eax + // 2d: 89 07 movl %eax, (%rdi) + // 2f: 74 17 je 0x48 <__JIT_ENTRY+0x48> + // 31: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 36: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3f: 49 83 c5 f8 addq $-0x8, %r13 + // 43: e9 00 00 00 00 jmp 0x48 <__JIT_ENTRY+0x48> + // 0000000000000044: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 48: 55 pushq %rbp + // 49: 48 89 e5 movq %rsp, %rbp + // 4c: ff 15 00 00 00 00 callq *(%rip) ## 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 52: 5d popq %rbp + // 53: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 58: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 61: 49 83 c5 f8 addq $-0x8, %r13 + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 0000000000000066: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[101] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x8b, 0x4e, 0x78, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x39, + 0x31, 0xd2, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x0f, 0x45, 0xd0, 0x48, 0x89, 0x11, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x17, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_NoneStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_32r(code + 0x44, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + -0x4); +} + +void +emit__POP_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 8b 07 movl (%rdi), %eax + // a: 85 c0 testl %eax, %eax + // c: 0f 88 00 00 00 00 js 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 12: ff c8 decl %eax + // 14: 89 07 movl %eax, (%rdi) + // 16: 0f 85 00 00 00 00 jne 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1c: 55 pushq %rbp + // 1d: 48 89 e5 movq %rsp, %rbp + // 20: ff 15 00 00 00 00 callq *(%rip) ## 0x26 <__JIT_ENTRY+0x26> + // 0000000000000022: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 26: 5d popq %rbp + // 27: e9 00 00 00 00 jmp 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[39] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x8b, 0x07, 0x85, 0xc0, 0x0f, 0x88, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xc8, 0x89, 0x07, 0x0f, 0x85, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xe, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x18, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + -0x4); +} + +void +emit__POP_TOP_LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP_LOAD_CONST_INLINE_BORROW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 8b 07 movl (%rdi), %eax + // 13: 85 c0 testl %eax, %eax + // 15: 78 0c js 0x23 <__JIT_ENTRY+0x23> + // 17: ff c8 decl %eax + // 19: 89 07 movl %eax, (%rdi) + // 1b: 75 06 jne 0x23 <__JIT_ENTRY+0x23> + // 1d: ff 15 00 00 00 00 callq *(%rip) ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 23: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 28: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 31: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x38 <__JIT_ENTRY+0x38> + // 0000000000000034: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // 38: 49 89 45 00 movq %rax, (%r13) + // 3c: 49 83 c5 08 addq $0x8, %r13 + // 40: 5d popq %rbp + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 0000000000000042: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[65] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + -0x4); +} + +void +emit__PUSH_EXC_INFO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_EXC_INFO.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 8b 4e 78 movq 0x78(%r14), %rcx + // c: 48 8b 11 movq (%rcx), %rdx + // f: 8b 30 movl (%rax), %esi + // 11: 85 f6 testl %esi, %esi + // 13: 78 04 js 0x19 <__JIT_ENTRY+0x19> + // 15: ff c6 incl %esi + // 17: 89 30 movl %esi, (%rax) + // 19: 48 85 d2 testq %rdx, %rdx + // 1c: 75 07 jne 0x25 <__JIT_ENTRY+0x25> + // 1e: 48 8b 15 00 00 00 00 movq (%rip), %rdx ## 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_GOT_LOAD __Py_NoneStruct@GOTPCREL + // 25: 48 89 01 movq %rax, (%rcx) + // 28: 49 89 55 f8 movq %rdx, -0x8(%r13) + // 2c: 49 89 45 00 movq %rax, (%r13) + // 30: 49 83 c5 08 addq $0x8, %r13 + // 34: 5d popq %rbp + // 35: e9 00 00 00 00 jmp 0x3a <__JIT_ENTRY+0x3a> + // 0000000000000036: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[53] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x8b, 0x4e, 0x78, 0x48, 0x8b, 0x11, 0x8b, + 0x30, 0x85, 0xf6, 0x78, 0x04, 0xff, 0xc6, 0x89, + 0x30, 0x48, 0x85, 0xd2, 0x75, 0x07, 0x48, 0x8b, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x01, + 0x49, 0x89, 0x55, 0xf8, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + -0x4); +} + +void +emit__PUSH_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_FRAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 49 89 46 48 movq %rax, 0x48(%r14) + // 15: 41 ff 4e 2c decl 0x2c(%r14) + // 19: 4c 8b 68 40 movq 0x40(%rax), %r13 + // 1d: 48 c7 40 40 00 00 00 00 movq $0x0, 0x40(%rax) + // 25: 49 89 c4 movq %rax, %r12 + // 28: 5d popq %rbp + // 29: e9 00 00 00 00 jmp 0x2e <__JIT_ENTRY+0x2e> + // 000000000000002a: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[41] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x49, 0x89, 0x46, 0x48, 0x41, 0xff, 0x4e, + 0x2c, 0x4c, 0x8b, 0x68, 0x40, 0x48, 0xc7, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc4, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 c7 45 00 00 00 00 00 movq $0x0, (%r13) + // c: 49 83 c5 08 addq $0x8, %r13 + // 10: 5d popq %rbp + // 11: e9 00 00 00 00 jmp 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[17] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0xc7, 0x45, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL_CONDITIONAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL_CONDITIONAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 66 83 e0 01 andw $0x1, %ax + // f: 74 08 je 0x19 <__JIT_ENTRY+0x19> + // 11: 49 c7 45 00 00 00 00 00 movq $0x0, (%r13) + // 19: 0f b7 c0 movzwl %ax, %eax + // 1c: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 21: 5d popq %rbp + // 22: e9 00 00 00 00 jmp 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[34] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x83, 0xe0, 0x01, 0x74, + 0x08, 0x49, 0xc7, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xc0, 0x4d, 0x8d, 0x6c, 0xc5, + 0x00, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__PY_FRAME_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_GENERAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 e8 movq %r13, %rax + // b: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 12: 8d 14 cd 00 00 00 00 leal (,%rcx,8), %edx + // 19: 4c 89 ef movq %r13, %rdi + // 1c: 48 29 d7 subq %rdx, %rdi + // 1f: 89 ca movl %ecx, %edx + // 21: f7 d2 notl %edx + // 23: 48 63 d2 movslq %edx, %rdx + // 26: be fe ff ff ff movl $0xfffffffe, %esi ## imm = 0xFFFFFFFE + // 2b: 29 ce subl %ecx, %esi + // 2d: 4c 63 ee movslq %esi, %r13 + // 30: 45 31 c0 xorl %r8d, %r8d + // 33: 31 f6 xorl %esi, %esi + // 35: 48 83 3c d0 00 cmpq $0x0, (%rax,%rdx,8) + // 3a: 4a 8b 14 e8 movq (%rax,%r13,8), %rdx + // 3e: 41 0f 94 c0 sete %r8b + // 42: 40 0f 95 c6 setne %sil + // 46: 01 ce addl %ecx, %esi + // 48: 4a 8d 0c c7 leaq (%rdi,%r8,8), %rcx + // 4c: 48 83 c1 f8 addq $-0x8, %rcx + // 50: 48 8b 7a 30 movq 0x30(%rdx), %rdi + // 54: f6 47 30 01 testb $0x1, 0x30(%rdi) + // 58: 75 10 jne 0x6a <__JIT_ENTRY+0x6a> + // 5a: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 5e: 8b 3a movl (%rdx), %edi + // 60: 85 ff testl %edi, %edi + // 62: 78 08 js 0x6c <__JIT_ENTRY+0x6c> + // 64: ff c7 incl %edi + // 66: 89 3a movl %edi, (%rdx) + // 68: eb 02 jmp 0x6c <__JIT_ENTRY+0x6c> + // 6a: 31 d2 xorl %edx, %edx + // 6c: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 71: 41 89 f0 movl %esi, %r8d + // 74: 4a 8b 34 e8 movq (%rax,%r13,8), %rsi + // 78: 49 c1 e5 03 shlq $0x3, %r13 + // 7c: 4c 89 24 24 movq %r12, (%rsp) + // 80: 4c 89 f7 movq %r14, %rdi + // 83: 45 31 c9 xorl %r9d, %r9d + // 86: ff 15 00 00 00 00 callq *(%rip) ## 0x8c <__JIT_ENTRY+0x8c> + // 0000000000000088: X86_64_RELOC_GOT __PyEvalFramePushAndInit@GOTPCREL + // 8c: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // 91: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9a: 48 85 c0 testq %rax, %rax + // 9d: 74 12 je 0xb1 <__JIT_ENTRY+0xb1> + // 9f: 49 89 45 00 movq %rax, (%r13) + // a3: 49 83 c5 08 addq $0x8, %r13 + // a7: 48 83 c4 10 addq $0x10, %rsp + // ab: 5d popq %rbp + // ac: e9 00 00 00 00 jmp 0xb1 <__JIT_ENTRY+0xb1> + // 00000000000000ad: X86_64_RELOC_BRANCH __JIT_CONTINUE + // b1: 48 83 c4 10 addq $0x10, %rsp + // b5: 5d popq %rbp + // b6: e9 00 00 00 00 jmp 0xbb <__JIT_ENTRY+0xbb> + // 00000000000000b7: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[187] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xe8, 0x0f, 0xb7, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x8d, 0x14, 0xcd, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0xef, 0x48, 0x29, 0xd7, 0x89, + 0xca, 0xf7, 0xd2, 0x48, 0x63, 0xd2, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xce, 0x4c, 0x63, 0xee, + 0x45, 0x31, 0xc0, 0x31, 0xf6, 0x48, 0x83, 0x3c, + 0xd0, 0x00, 0x4a, 0x8b, 0x14, 0xe8, 0x41, 0x0f, + 0x94, 0xc0, 0x40, 0x0f, 0x95, 0xc6, 0x01, 0xce, + 0x4a, 0x8d, 0x0c, 0xc7, 0x48, 0x83, 0xc1, 0xf8, + 0x48, 0x8b, 0x7a, 0x30, 0xf6, 0x47, 0x30, 0x01, + 0x75, 0x10, 0x48, 0x8b, 0x52, 0x10, 0x8b, 0x3a, + 0x85, 0xff, 0x78, 0x08, 0xff, 0xc7, 0x89, 0x3a, + 0xeb, 0x02, 0x31, 0xd2, 0x49, 0x89, 0x44, 0x24, + 0x40, 0x41, 0x89, 0xf0, 0x4a, 0x8b, 0x34, 0xe8, + 0x49, 0xc1, 0xe5, 0x03, 0x4c, 0x89, 0x24, 0x24, + 0x4c, 0x89, 0xf7, 0x45, 0x31, 0xc9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x03, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x12, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyEvalFramePushAndInit+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xe, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + -0x4); + patch_32r(code + 0xad, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xb7, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__PY_FRAME_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_KW.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 e8 movq %r13, %rax + // b: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 12: ba fe ff ff ff movl $0xfffffffe, %edx ## imm = 0xFFFFFFFE + // 17: 29 ca subl %ecx, %edx + // 19: 4c 63 ea movslq %edx, %r13 + // 1c: ba fd ff ff ff movl $0xfffffffd, %edx ## imm = 0xFFFFFFFD + // 21: 29 ca subl %ecx, %edx + // 23: 31 f6 xorl %esi, %esi + // 25: 45 31 c0 xorl %r8d, %r8d + // 28: 4a 83 3c e8 00 cmpq $0x0, (%rax,%r13,8) + // 2d: 48 8b 58 f8 movq -0x8(%rax), %rbx + // 31: 40 0f 95 c6 setne %sil + // 35: 41 0f 94 c0 sete %r8b + // 39: 01 ce addl %ecx, %esi + // 3b: f7 d1 notl %ecx + // 3d: 48 63 c9 movslq %ecx, %rcx + // 40: 48 8d 0c c8 leaq (%rax,%rcx,8), %rcx + // 44: 48 63 fa movslq %edx, %rdi + // 47: 48 8b 14 f8 movq (%rax,%rdi,8), %rdx + // 4b: 4a 8d 0c c1 leaq (%rcx,%r8,8), %rcx + // 4f: 48 83 c1 f8 addq $-0x8, %rcx + // 53: 4c 8b 42 30 movq 0x30(%rdx), %r8 + // 57: 2b 73 10 subl 0x10(%rbx), %esi + // 5a: 41 f6 40 30 01 testb $0x1, 0x30(%r8) + // 5f: 75 14 jne 0x75 <__JIT_ENTRY+0x75> + // 61: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 65: 44 8b 02 movl (%rdx), %r8d + // 68: 45 85 c0 testl %r8d, %r8d + // 6b: 78 0a js 0x77 <__JIT_ENTRY+0x77> + // 6d: 41 ff c0 incl %r8d + // 70: 44 89 02 movl %r8d, (%rdx) + // 73: eb 02 jmp 0x77 <__JIT_ENTRY+0x77> + // 75: 31 d2 xorl %edx, %edx + // 77: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 7c: 4c 63 c6 movslq %esi, %r8 + // 7f: 48 8b 34 f8 movq (%rax,%rdi,8), %rsi + // 83: 4c 89 24 24 movq %r12, (%rsp) + // 87: 4c 89 f7 movq %r14, %rdi + // 8a: 49 89 d9 movq %rbx, %r9 + // 8d: ff 15 00 00 00 00 callq *(%rip) ## 0x93 <__JIT_ENTRY+0x93> + // 000000000000008f: X86_64_RELOC_GOT __PyEvalFramePushAndInit@GOTPCREL + // 93: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 99: 8b 0b movl (%rbx), %ecx + // 9b: 85 c9 testl %ecx, %ecx + // 9d: 78 15 js 0xb4 <__JIT_ENTRY+0xb4> + // 9f: ff c9 decl %ecx + // a1: 89 0b movl %ecx, (%rbx) + // a3: 75 0f jne 0xb4 <__JIT_ENTRY+0xb4> + // a5: 48 89 df movq %rbx, %rdi + // a8: 48 89 c3 movq %rax, %rbx + // ab: ff 15 00 00 00 00 callq *(%rip) ## 0xb1 <__JIT_ENTRY+0xb1> + // 00000000000000ad: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // b1: 48 89 d8 movq %rbx, %rax + // b4: 49 c1 e5 03 shlq $0x3, %r13 + // b8: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // bd: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c6: 48 85 c0 testq %rax, %rax + // c9: 74 12 je 0xdd <__JIT_ENTRY+0xdd> + // cb: 49 89 45 00 movq %rax, (%r13) + // cf: 49 83 c5 08 addq $0x8, %r13 + // d3: 48 83 c4 10 addq $0x10, %rsp + // d7: 5d popq %rbp + // d8: e9 00 00 00 00 jmp 0xdd <__JIT_ENTRY+0xdd> + // 00000000000000d9: X86_64_RELOC_BRANCH __JIT_CONTINUE + // dd: 48 83 c4 10 addq $0x10, %rsp + // e1: 5d popq %rbp + // e2: e9 00 00 00 00 jmp 0xe7 <__JIT_ENTRY+0xe7> + // 00000000000000e3: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[231] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xe8, 0x0f, 0xb7, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0xba, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xca, 0x4c, 0x63, 0xea, 0xba, 0xfd, 0xff, 0xff, + 0xff, 0x29, 0xca, 0x31, 0xf6, 0x45, 0x31, 0xc0, + 0x4a, 0x83, 0x3c, 0xe8, 0x00, 0x48, 0x8b, 0x58, + 0xf8, 0x40, 0x0f, 0x95, 0xc6, 0x41, 0x0f, 0x94, + 0xc0, 0x01, 0xce, 0xf7, 0xd1, 0x48, 0x63, 0xc9, + 0x48, 0x8d, 0x0c, 0xc8, 0x48, 0x63, 0xfa, 0x48, + 0x8b, 0x14, 0xf8, 0x4a, 0x8d, 0x0c, 0xc1, 0x48, + 0x83, 0xc1, 0xf8, 0x4c, 0x8b, 0x42, 0x30, 0x2b, + 0x73, 0x10, 0x41, 0xf6, 0x40, 0x30, 0x01, 0x75, + 0x14, 0x48, 0x8b, 0x52, 0x10, 0x44, 0x8b, 0x02, + 0x45, 0x85, 0xc0, 0x78, 0x0a, 0x41, 0xff, 0xc0, + 0x44, 0x89, 0x02, 0xeb, 0x02, 0x31, 0xd2, 0x49, + 0x89, 0x44, 0x24, 0x40, 0x4c, 0x63, 0xc6, 0x48, + 0x8b, 0x34, 0xf8, 0x4c, 0x89, 0x24, 0x24, 0x4c, + 0x89, 0xf7, 0x49, 0x89, 0xd9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, 0x24, 0x40, + 0xf8, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x15, 0xff, + 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x49, 0xc1, 0xe5, 0x03, + 0x4d, 0x03, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x12, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xe, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + -0x4); + patch_32r(code + 0xd9, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xe3, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__REPLACE_WITH_TRUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _REPLACE_WITH_TRUE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 8b 07 movl (%rdi), %eax + // a: 85 c0 testl %eax, %eax + // c: 78 06 js 0x14 <__JIT_ENTRY+0x14> + // e: ff c8 decl %eax + // 10: 89 07 movl %eax, (%rdi) + // 12: 74 11 je 0x25 <__JIT_ENTRY+0x25> + // 14: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 1b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1f: 5d popq %rbp + // 20: e9 00 00 00 00 jmp 0x25 <__JIT_ENTRY+0x25> + // 0000000000000021: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 25: ff 15 00 00 00 00 callq *(%rip) ## 0x2b <__JIT_ENTRY+0x2b> + // 0000000000000027: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 2b: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x32 <__JIT_ENTRY+0x32> + // 000000000000002e: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 32: 49 89 45 f8 movq %rax, -0x8(%r13) + // 36: 5d popq %rbp + // 37: e9 00 00 00 00 jmp 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[55] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7d, 0xf8, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x07, 0x74, 0x11, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_32r(code + 0x21, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + -0x4); +} + +void +emit__RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RESUME_CHECK.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 46 18 movq 0x18(%r14), %rax + // 8: 49 8b 0c 24 movq (%r12), %rcx + // c: 48 3b 81 a8 00 00 00 cmpq 0xa8(%rcx), %rax + // 13: 75 06 jne 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + const unsigned char code_body[33] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x46, 0x18, + 0x49, 0x8b, 0x0c, 0x24, 0x48, 0x3b, 0x81, 0xa8, + 0x00, 0x00, 0x00, 0x75, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x17, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x1d, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__RETURN_GENERATOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_GENERATOR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 7c 24 10 movq 0x10(%r12), %rdi + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: ff 15 00 00 00 00 callq *(%rip) ## 0x14 <__JIT_ENTRY+0x14> + // 0000000000000010: X86_64_RELOC_GOT __Py_MakeCoro@GOTPCREL + // 14: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 19: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 22: 48 85 c0 testq %rax, %rax + // 25: 0f 84 ae 01 00 00 je 0x1d9 <__JIT_ENTRY+0x1d9> + // 2b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 30: 49 83 44 24 38 02 addq $0x2, 0x38(%r12) + // 36: 49 8b 4c 24 50 movq 0x50(%r12), %rcx + // 3b: 48 89 88 98 00 00 00 movq %rcx, 0x98(%rax) + // 42: 41 0f 10 04 24 movups (%r12), %xmm0 + // 47: 41 0f 10 4c 24 10 movups 0x10(%r12), %xmm1 + // 4d: 41 0f 10 54 24 20 movups 0x20(%r12), %xmm2 + // 53: 0f 11 50 68 movups %xmm2, 0x68(%rax) + // 57: 0f 11 48 58 movups %xmm1, 0x58(%rax) + // 5b: 0f 11 40 48 movups %xmm0, 0x48(%rax) + // 5f: 41 0f 10 44 24 40 movups 0x40(%r12), %xmm0 + // 65: 0f 11 80 88 00 00 00 movups %xmm0, 0x88(%rax) + // 6c: 41 0f 10 44 24 30 movups 0x30(%r12), %xmm0 + // 72: 0f 11 40 78 movups %xmm0, 0x78(%rax) + // 76: 49 8d 54 24 50 leaq 0x50(%r12), %rdx + // 7b: 49 8b 74 24 40 movq 0x40(%r12), %rsi + // 80: 48 29 d6 subq %rdx, %rsi + // 83: 48 c1 ee 03 shrq $0x3, %rsi + // 87: 48 63 ce movslq %esi, %rcx + // 8a: 48 8d 3c c8 leaq (%rax,%rcx,8), %rdi + // 8e: 48 81 c7 98 00 00 00 addq $0x98, %rdi + // 95: 48 89 b8 88 00 00 00 movq %rdi, 0x88(%rax) + // 9c: 83 f9 02 cmpl $0x2, %ecx + // 9f: 0f 8c e8 00 00 00 jl 0x18d <__JIT_ENTRY+0x18d> + // a5: 89 f1 movl %esi, %ecx + // a7: 81 e1 ff ff ff 7f andl $0x7fffffff, %ecx ## imm = 0x7FFFFFFF + // ad: 4c 8d 41 ff leaq -0x1(%rcx), %r8 + // b1: bf 01 00 00 00 movl $0x1, %edi + // b6: 49 83 f8 08 cmpq $0x8, %r8 + // ba: 72 54 jb 0x110 <__JIT_ENTRY+0x110> + // bc: 49 89 c1 movq %rax, %r9 + // bf: 4d 29 e1 subq %r12, %r9 + // c2: 49 83 c1 48 addq $0x48, %r9 + // c6: 49 83 f9 20 cmpq $0x20, %r9 + // ca: 72 44 jb 0x110 <__JIT_ENTRY+0x110> + // cc: 4d 89 c1 movq %r8, %r9 + // cf: 49 83 e1 fc andq $-0x4, %r9 + // d3: 49 8d 79 01 leaq 0x1(%r9), %rdi + // d7: 45 31 d2 xorl %r10d, %r10d + // da: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // e0: 43 0f 10 44 d4 58 movups 0x58(%r12,%r10,8), %xmm0 + // e6: 43 0f 10 4c d4 68 movups 0x68(%r12,%r10,8), %xmm1 + // ec: 42 0f 11 84 d0 a0 00 00 00 movups %xmm0, 0xa0(%rax,%r10,8) + // f5: 42 0f 11 8c d0 b0 00 00 00 movups %xmm1, 0xb0(%rax,%r10,8) + // fe: 49 83 c2 04 addq $0x4, %r10 + // 102: 4d 39 d1 cmpq %r10, %r9 + // 105: 75 d9 jne 0xe0 <__JIT_ENTRY+0xe0> + // 107: 4d 39 c8 cmpq %r9, %r8 + // 10a: 0f 84 7d 00 00 00 je 0x18d <__JIT_ENTRY+0x18d> + // 110: 29 fe subl %edi, %esi + // 112: 49 89 f8 movq %rdi, %r8 + // 115: 83 e6 03 andl $0x3, %esi + // 118: 74 26 je 0x140 <__JIT_ENTRY+0x140> + // 11a: 49 89 c1 movq %rax, %r9 + // 11d: 49 81 c1 98 00 00 00 addq $0x98, %r9 + // 124: 49 89 f8 movq %rdi, %r8 + // 127: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 130: 4e 8b 14 c2 movq (%rdx,%r8,8), %r10 + // 134: 4f 89 14 c1 movq %r10, (%r9,%r8,8) + // 138: 49 ff c0 incq %r8 + // 13b: 48 ff ce decq %rsi + // 13e: 75 f0 jne 0x130 <__JIT_ENTRY+0x130> + // 140: 48 29 cf subq %rcx, %rdi + // 143: 48 83 ff fc cmpq $-0x4, %rdi + // 147: 77 44 ja 0x18d <__JIT_ENTRY+0x18d> + // 149: 0f 1f 80 00 00 00 00 nopl (%rax) + // 150: 4b 8b 54 c4 50 movq 0x50(%r12,%r8,8), %rdx + // 155: 4a 89 94 c0 98 00 00 00 movq %rdx, 0x98(%rax,%r8,8) + // 15d: 4b 8b 54 c4 58 movq 0x58(%r12,%r8,8), %rdx + // 162: 4a 89 94 c0 a0 00 00 00 movq %rdx, 0xa0(%rax,%r8,8) + // 16a: 4b 8b 54 c4 60 movq 0x60(%r12,%r8,8), %rdx + // 16f: 4a 89 94 c0 a8 00 00 00 movq %rdx, 0xa8(%rax,%r8,8) + // 177: 4b 8b 54 c4 68 movq 0x68(%r12,%r8,8), %rdx + // 17c: 4a 89 94 c0 b0 00 00 00 movq %rdx, 0xb0(%rax,%r8,8) + // 184: 49 83 c0 04 addq $0x4, %r8 + // 188: 4c 39 c1 cmpq %r8, %rcx + // 18b: 75 c3 jne 0x150 <__JIT_ENTRY+0x150> + // 18d: 48 c7 40 50 00 00 00 00 movq $0x0, 0x50(%rax) + // 195: c6 40 43 fd movb $-0x3, 0x43(%rax) + // 199: c6 80 92 00 00 00 01 movb $0x1, 0x92(%rax) + // 1a0: 41 ff 46 2c incl 0x2c(%r14) + // 1a4: 49 8b 5c 24 08 movq 0x8(%r12), %rbx + // 1a9: 4c 89 f7 movq %r14, %rdi + // 1ac: 4c 89 e6 movq %r12, %rsi + // 1af: 49 89 c7 movq %rax, %r15 + // 1b2: ff 15 00 00 00 00 callq *(%rip) ## 0x1b8 <__JIT_ENTRY+0x1b8> + // 00000000000001b4: X86_64_RELOC_GOT __PyThreadState_PopFrame@GOTPCREL + // 1b8: 49 89 5e 48 movq %rbx, 0x48(%r14) + // 1bc: 4c 8b 6b 40 movq 0x40(%rbx), %r13 + // 1c0: 48 c7 43 40 00 00 00 00 movq $0x0, 0x40(%rbx) + // 1c8: 4d 89 7d 00 movq %r15, (%r13) + // 1cc: 49 83 c5 08 addq $0x8, %r13 + // 1d0: 49 89 dc movq %rbx, %r12 + // 1d3: 5d popq %rbp + // 1d4: e9 00 00 00 00 jmp 0x1d9 <__JIT_ENTRY+0x1d9> + // 00000000000001d5: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 1d9: 5d popq %rbp + // 1da: e9 00 00 00 00 jmp 0x1df <__JIT_ENTRY+0x1df> + // 00000000000001db: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[479] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x7c, 0x24, + 0x10, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x0f, 0x84, 0xae, + 0x01, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x49, 0x83, 0x44, 0x24, 0x38, 0x02, 0x49, 0x8b, + 0x4c, 0x24, 0x50, 0x48, 0x89, 0x88, 0x98, 0x00, + 0x00, 0x00, 0x41, 0x0f, 0x10, 0x04, 0x24, 0x41, + 0x0f, 0x10, 0x4c, 0x24, 0x10, 0x41, 0x0f, 0x10, + 0x54, 0x24, 0x20, 0x0f, 0x11, 0x50, 0x68, 0x0f, + 0x11, 0x48, 0x58, 0x0f, 0x11, 0x40, 0x48, 0x41, + 0x0f, 0x10, 0x44, 0x24, 0x40, 0x0f, 0x11, 0x80, + 0x88, 0x00, 0x00, 0x00, 0x41, 0x0f, 0x10, 0x44, + 0x24, 0x30, 0x0f, 0x11, 0x40, 0x78, 0x49, 0x8d, + 0x54, 0x24, 0x50, 0x49, 0x8b, 0x74, 0x24, 0x40, + 0x48, 0x29, 0xd6, 0x48, 0xc1, 0xee, 0x03, 0x48, + 0x63, 0xce, 0x48, 0x8d, 0x3c, 0xc8, 0x48, 0x81, + 0xc7, 0x98, 0x00, 0x00, 0x00, 0x48, 0x89, 0xb8, + 0x88, 0x00, 0x00, 0x00, 0x83, 0xf9, 0x02, 0x0f, + 0x8c, 0xe8, 0x00, 0x00, 0x00, 0x89, 0xf1, 0x81, + 0xe1, 0xff, 0xff, 0xff, 0x7f, 0x4c, 0x8d, 0x41, + 0xff, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xf8, 0x08, 0x72, 0x54, 0x49, 0x89, 0xc1, 0x4d, + 0x29, 0xe1, 0x49, 0x83, 0xc1, 0x48, 0x49, 0x83, + 0xf9, 0x20, 0x72, 0x44, 0x4d, 0x89, 0xc1, 0x49, + 0x83, 0xe1, 0xfc, 0x49, 0x8d, 0x79, 0x01, 0x45, + 0x31, 0xd2, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x43, 0x0f, 0x10, 0x44, 0xd4, 0x58, 0x43, 0x0f, + 0x10, 0x4c, 0xd4, 0x68, 0x42, 0x0f, 0x11, 0x84, + 0xd0, 0xa0, 0x00, 0x00, 0x00, 0x42, 0x0f, 0x11, + 0x8c, 0xd0, 0xb0, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc2, 0x04, 0x4d, 0x39, 0xd1, 0x75, 0xd9, 0x4d, + 0x39, 0xc8, 0x0f, 0x84, 0x7d, 0x00, 0x00, 0x00, + 0x29, 0xfe, 0x49, 0x89, 0xf8, 0x83, 0xe6, 0x03, + 0x74, 0x26, 0x49, 0x89, 0xc1, 0x49, 0x81, 0xc1, + 0x98, 0x00, 0x00, 0x00, 0x49, 0x89, 0xf8, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x8b, 0x14, 0xc2, 0x4f, 0x89, 0x14, 0xc1, + 0x49, 0xff, 0xc0, 0x48, 0xff, 0xce, 0x75, 0xf0, + 0x48, 0x29, 0xcf, 0x48, 0x83, 0xff, 0xfc, 0x77, + 0x44, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x8b, 0x54, 0xc4, 0x50, 0x4a, 0x89, 0x94, + 0xc0, 0x98, 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x54, + 0xc4, 0x58, 0x4a, 0x89, 0x94, 0xc0, 0xa0, 0x00, + 0x00, 0x00, 0x4b, 0x8b, 0x54, 0xc4, 0x60, 0x4a, + 0x89, 0x94, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0x4b, + 0x8b, 0x54, 0xc4, 0x68, 0x4a, 0x89, 0x94, 0xc0, + 0xb0, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc0, 0x04, + 0x4c, 0x39, 0xc1, 0x75, 0xc3, 0x48, 0xc7, 0x40, + 0x50, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x40, 0x43, + 0xfd, 0xc6, 0x80, 0x92, 0x00, 0x00, 0x00, 0x01, + 0x41, 0xff, 0x46, 0x2c, 0x49, 0x8b, 0x5c, 0x24, + 0x08, 0x4c, 0x89, 0xf7, 0x4c, 0x89, 0xe6, 0x49, + 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x5e, 0x48, 0x4c, 0x8b, 0x6b, 0x40, + 0x48, 0xc7, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x49, 0x89, 0xdc, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyThreadState_PopFrame+0x0 + // 8: &_Py_MakeCoro+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyThreadState_PopFrame); + patch_64(data + 0x8, (uintptr_t)&_Py_MakeCoro); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1b4, (uintptr_t)data + -0x4); + patch_32r(code + 0x1d5, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0x1db, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__RETURN_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_VALUE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4c 89 e6 movq %r12, %rsi + // 7: 49 8b 5d f8 movq -0x8(%r13), %rbx + // b: 49 83 c5 f8 addq $-0x8, %r13 + // f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 14: 41 ff 46 2c incl 0x2c(%r14) + // 18: 4d 8b 64 24 08 movq 0x8(%r12), %r12 + // 1d: 4d 89 66 48 movq %r12, 0x48(%r14) + // 21: 4c 89 f7 movq %r14, %rdi + // 24: ff 15 00 00 00 00 callq *(%rip) ## 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_GOT __PyEval_FrameClearAndPop@GOTPCREL + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 49 89 5d 00 movq %rbx, (%r13) + // 3c: 49 83 c5 08 addq $0x8, %r13 + // 40: 5d popq %rbp + // 41: e9 00 00 00 00 jmp 0x46 <__JIT_ENTRY+0x46> + // 0000000000000042: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[65] = { + 0x55, 0x48, 0x89, 0xe5, 0x4c, 0x89, 0xe6, 0x49, + 0x8b, 0x5d, 0xf8, 0x49, 0x83, 0xc5, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x41, 0xff, 0x46, 0x2c, + 0x4d, 0x8b, 0x64, 0x24, 0x08, 0x4d, 0x89, 0x66, + 0x48, 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x5d, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, + }; + // 0: &_PyEval_FrameClearAndPop+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FrameClearAndPop); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + -0x4); +} + +void +emit__SAVE_RETURN_OFFSET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SAVE_RETURN_OFFSET.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 66 41 89 44 24 48 movw %ax, 0x48(%r12) + // 11: 5d popq %rbp + // 12: e9 00 00 00 00 jmp 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[18] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x41, 0x89, 0x44, 0x24, + 0x48, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__SEND_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SEND_GEN_FRAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 48 8b 48 08 movq 0x8(%rax), %rcx + // c: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyGen_Type@GOTPCREL + // 13: 0f 94 c2 sete %dl + // 16: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx ## 0x1d <__JIT_ENTRY+0x1d> + // 0000000000000019: X86_64_RELOC_GOT _PyCoro_Type@GOTPCREL + // 1d: 0f 94 c1 sete %cl + // 20: 08 d1 orb %dl, %cl + // 22: 74 06 je 0x2a <__JIT_ENTRY+0x2a> + // 24: 80 78 43 00 cmpb $0x0, 0x43(%rax) + // 28: 78 06 js 0x30 <__JIT_ENTRY+0x30> + // 2a: 5d popq %rbp + // 2b: e9 00 00 00 00 jmp 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 30: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 34: 48 8d 50 48 leaq 0x48(%rax), %rdx + // 38: 48 8b b0 88 00 00 00 movq 0x88(%rax), %rsi + // 3f: 48 89 0e movq %rcx, (%rsi) + // 42: 48 83 80 88 00 00 00 08 addq $0x8, 0x88(%rax) + // 4a: c6 40 43 00 movb $0x0, 0x43(%rax) + // 4e: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 52: 48 8d 70 28 leaq 0x28(%rax), %rsi + // 56: 48 89 48 30 movq %rcx, 0x30(%rax) + // 5a: 49 89 76 78 movq %rsi, 0x78(%r14) + // 5e: 8b 0d 00 00 00 00 movl (%rip), %ecx ## 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 64: 83 c1 02 addl $0x2, %ecx + // 67: 66 41 89 4c 24 48 movw %cx, 0x48(%r12) + // 6d: 4c 89 60 50 movq %r12, 0x50(%rax) + // 71: 49 89 55 f8 movq %rdx, -0x8(%r13) + // 75: 5d popq %rbp + // 76: e9 00 00 00 00 jmp 0x7b <__JIT_ENTRY+0x7b> + // 0000000000000077: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[118] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x48, 0x8b, 0x48, 0x08, 0x48, 0x3b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc2, 0x48, 0x3b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc1, + 0x08, 0xd1, 0x74, 0x06, 0x80, 0x78, 0x43, 0x00, + 0x78, 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x4d, 0xf8, 0x48, 0x8d, 0x50, 0x48, + 0x48, 0x8b, 0xb0, 0x88, 0x00, 0x00, 0x00, 0x48, + 0x89, 0x0e, 0x48, 0x83, 0x80, 0x88, 0x00, 0x00, + 0x00, 0x08, 0xc6, 0x40, 0x43, 0x00, 0x49, 0x8b, + 0x4e, 0x78, 0x48, 0x8d, 0x70, 0x28, 0x48, 0x89, + 0x48, 0x30, 0x49, 0x89, 0x76, 0x78, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xc1, 0x02, 0x66, + 0x41, 0x89, 0x4c, 0x24, 0x48, 0x4c, 0x89, 0x60, + 0x50, 0x49, 0x89, 0x55, 0xf8, 0x5d, + }; + // 0: OPARG + // 8: &PyCoro_Type+0x0 + // 10: &PyGen_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x10, (uintptr_t)&PyGen_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_32r(code + 0x2c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + -0x4); +} + +void +emit__SETUP_ANNOTATIONS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SETUP_ANNOTATIONS.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 12: 48 85 ff testq %rdi, %rdi + // 15: 74 60 je 0x77 <__JIT_ENTRY+0x77> + // 17: be 60 8e 00 00 movl $0x8e60, %esi ## imm = 0x8E60 + // 1c: 48 03 35 00 00 00 00 addq (%rip), %rsi ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 23: 48 8d 55 f8 leaq -0x8(%rbp), %rdx + // 27: ff 15 00 00 00 00 callq *(%rip) ## 0x2d <__JIT_ENTRY+0x2d> + // 0000000000000029: X86_64_RELOC_GOT _PyMapping_GetOptionalItem@GOTPCREL + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 85 c0 testl %eax, %eax + // 3d: 78 62 js 0xa1 <__JIT_ENTRY+0xa1> + // 3f: 48 8b 7d f8 movq -0x8(%rbp), %rdi + // 43: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 48: 48 85 ff testq %rdi, %rdi + // 4b: 74 5e je 0xab <__JIT_ENTRY+0xab> + // 4d: 8b 07 movl (%rdi), %eax + // 4f: 85 c0 testl %eax, %eax + // 51: 78 0c js 0x5f <__JIT_ENTRY+0x5f> + // 53: ff c8 decl %eax + // 55: 89 07 movl %eax, (%rdi) + // 57: 75 06 jne 0x5f <__JIT_ENTRY+0x5f> + // 59: ff 15 00 00 00 00 callq *(%rip) ## 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 64: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6d: 48 83 c4 10 addq $0x10, %rsp + // 71: 5d popq %rbp + // 72: e9 00 00 00 00 jmp 0x77 <__JIT_ENTRY+0x77> + // 0000000000000073: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 77: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x7e <__JIT_ENTRY+0x7e> + // 000000000000007a: X86_64_RELOC_GOT_LOAD _PyExc_SystemError@GOTPCREL + // 7e: 48 8b 30 movq (%rax), %rsi + // 81: 48 8d 15 90 00 00 00 leaq 0x90(%rip), %rdx ## 0x118 <__JIT_ENTRY+0x118> + // 0000000000000084: X86_64_RELOC_SIGNED __cstring + // 88: 4c 89 f7 movq %r14, %rdi + // 8b: 31 c0 xorl %eax, %eax + // 8d: ff 15 00 00 00 00 callq *(%rip) ## 0x93 <__JIT_ENTRY+0x93> + // 000000000000008f: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // 93: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 98: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a1: 48 83 c4 10 addq $0x10, %rsp + // a5: 5d popq %rbp + // a6: e9 00 00 00 00 jmp 0xab <__JIT_ENTRY+0xab> + // 00000000000000a7: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // ab: ff 15 00 00 00 00 callq *(%rip) ## 0xb1 <__JIT_ENTRY+0xb1> + // 00000000000000ad: X86_64_RELOC_GOT _PyDict_New@GOTPCREL + // b1: 48 89 45 f8 movq %rax, -0x8(%rbp) + // b5: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ba: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c3: 48 85 c0 testq %rax, %rax + // c6: 74 d9 je 0xa1 <__JIT_ENTRY+0xa1> + // c8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // cd: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // d2: be 60 8e 00 00 movl $0x8e60, %esi ## imm = 0x8E60 + // d7: 48 03 35 00 00 00 00 addq (%rip), %rsi ## 0xde <__JIT_ENTRY+0xde> + // 00000000000000da: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // de: 48 89 c2 movq %rax, %rdx + // e1: ff 15 00 00 00 00 callq *(%rip) ## 0xe7 <__JIT_ENTRY+0xe7> + // 00000000000000e3: X86_64_RELOC_GOT _PyObject_SetItem@GOTPCREL + // e7: 48 8b 7d f8 movq -0x8(%rbp), %rdi + // eb: 8b 0f movl (%rdi), %ecx + // ed: 85 c9 testl %ecx, %ecx + // ef: 78 10 js 0x101 <__JIT_ENTRY+0x101> + // f1: ff c9 decl %ecx + // f3: 89 0f movl %ecx, (%rdi) + // f5: 75 0a jne 0x101 <__JIT_ENTRY+0x101> + // f7: 89 c3 movl %eax, %ebx + // f9: ff 15 00 00 00 00 callq *(%rip) ## 0xff <__JIT_ENTRY+0xff> + // 00000000000000fb: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ff: 89 d8 movl %ebx, %eax + // 101: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 106: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 10f: 85 c0 testl %eax, %eax + // 111: 75 8e jne 0xa1 <__JIT_ENTRY+0xa1> + // 113: e9 55 ff ff ff jmp 0x6d <__JIT_ENTRY+0x6d> + const unsigned char code_body[280] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x49, 0x8b, 0x7c, 0x24, 0x28, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x85, 0xff, 0x74, 0x60, 0xbe, + 0x60, 0x8e, 0x00, 0x00, 0x48, 0x03, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8d, 0x55, 0xf8, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x62, 0x48, + 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x5e, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x30, 0x48, 0x8d, 0x15, 0x90, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x45, 0xf8, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0xd9, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x7c, + 0x24, 0x28, 0xbe, 0x60, 0x8e, 0x00, 0x00, 0x48, + 0x03, 0x35, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xc2, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x7d, 0xf8, 0x8b, 0x0f, 0x85, 0xc9, 0x78, + 0x10, 0xff, 0xc9, 0x89, 0x0f, 0x75, 0x0a, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x75, 0x8e, 0xe9, 0x55, 0xff, 0xff, 0xff, + }; + // 0: 'no locals found when setting up annotations\x00' + // 2c: 00 00 00 00 + // 30: &_Py_Dealloc+0x0 + // 38: &PyObject_SetItem+0x0 + // 40: &_PyRuntime+0x0 + // 48: &PyDict_New+0x0 + // 50: &_PyErr_Format+0x0 + // 58: &PyExc_SystemError+0x0 + // 60: &PyMapping_GetOptionalItem+0x0 + const unsigned char data_body[104] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x38, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x40, (uintptr_t)&_PyRuntime); + patch_64(data + 0x48, (uintptr_t)&PyDict_New); + patch_64(data + 0x50, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x58, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x60, (uintptr_t)&PyMapping_GetOptionalItem); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0x2c); + patch_32r(code + 0x73, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x54); + patch_32r(code + 0x84, (uintptr_t)data + 0x1a4); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x4c); + patch_32r(code + 0xa7, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0xda, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0xe3, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)data + 0x2c); +} + +void +emit__SET_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_ADD.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax ## 0xa <__JIT_ENTRY+0xa> + // 0000000000000006: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // a: f7 d0 notl %eax + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax ## imm = 0xFFF80000 + // 19: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 de movq %rbx, %rsi + // 26: ff 15 00 00 00 00 callq *(%rip) ## 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_GOT _PySet_Add@GOTPCREL + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 8b 0b movl (%rbx), %ecx + // 3c: 85 c9 testl %ecx, %ecx + // 3e: 78 06 js 0x46 <__JIT_ENTRY+0x46> + // 40: ff c9 decl %ecx + // 42: 89 0b movl %ecx, (%rbx) + // 44: 74 0e je 0x54 <__JIT_ENTRY+0x54> + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 85 c0 testl %eax, %eax + // 4c: 74 1b je 0x69 <__JIT_ENTRY+0x69> + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 54: 48 89 df movq %rbx, %rdi + // 57: 89 c3 movl %eax, %ebx + // 59: ff 15 00 00 00 00 callq *(%rip) ## 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5f: 89 d8 movl %ebx, %eax + // 61: 49 83 c5 f8 addq $-0x8, %r13 + // 65: 85 c0 testl %eax, %eax + // 67: 75 e5 jne 0x4e <__JIT_ENTRY+0x4e> + // 69: 5d popq %rbp + // 6a: e9 00 00 00 00 jmp 0x6f <__JIT_ENTRY+0x6f> + // 000000000000006b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[106] = { + 0x55, 0x48, 0x89, 0xe5, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x5d, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x7c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xde, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0e, 0x49, 0x83, + 0xc5, 0xf8, 0x85, 0xc0, 0x74, 0x1b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xd8, 0x49, 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x75, + 0xe5, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PySet_Add+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PySet_Add); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_32r(code + 0x50, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + -0x4); +} + +void +emit__SET_FUNCTION_ATTRIBUTE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_FUNCTION_ATTRIBUTE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 8: 49 8b 4d f0 movq -0x10(%r13), %rcx + // c: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 10: 0f b7 35 00 00 00 00 movzwl (%rip), %esi ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 17: 48 8b 3d 00 00 00 00 movq (%rip), %rdi ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT_LOAD __Py_FunctionAttributeOffsets@GOTPCREL + // 1e: 48 8b 34 f7 movq (%rdi,%rsi,8), %rsi + // 22: 48 89 0c 32 movq %rcx, (%rdx,%rsi) + // 26: 49 89 55 f0 movq %rdx, -0x10(%r13) + // 2a: 49 89 c5 movq %rax, %r13 + // 2d: 5d popq %rbp + // 2e: e9 00 00 00 00 jmp 0x33 <__JIT_ENTRY+0x33> + // 000000000000002f: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[46] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8d, 0x45, 0xf8, + 0x49, 0x8b, 0x4d, 0xf0, 0x49, 0x8b, 0x55, 0xf8, + 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x34, 0xf7, 0x48, 0x89, 0x0c, 0x32, 0x49, 0x89, + 0x55, 0xf0, 0x49, 0x89, 0xc5, 0x5d, + }; + // 0: &_Py_FunctionAttributeOffsets+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FunctionAttributeOffsets); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); +} + +void +emit__SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_IP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPERAND0@GOTPCREL + // b: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 10: 5d popq %rbp + // 11: e9 00 00 00 00 jmp 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[17] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x44, 0x24, 0x38, + 0x5d, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__SET_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_UPDATE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax ## 0xa <__JIT_ENTRY+0xa> + // 0000000000000006: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // a: f7 d0 notl %eax + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax ## imm = 0xFFF80000 + // 19: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 de movq %rbx, %rsi + // 26: ff 15 00 00 00 00 callq *(%rip) ## 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_GOT __PySet_Update@GOTPCREL + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 8b 0b movl (%rbx), %ecx + // 3c: 85 c9 testl %ecx, %ecx + // 3e: 78 06 js 0x46 <__JIT_ENTRY+0x46> + // 40: ff c9 decl %ecx + // 42: 89 0b movl %ecx, (%rbx) + // 44: 74 0e je 0x54 <__JIT_ENTRY+0x54> + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 85 c0 testl %eax, %eax + // 4c: 78 1b js 0x69 <__JIT_ENTRY+0x69> + // 4e: 5d popq %rbp + // 4f: e9 00 00 00 00 jmp 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 54: 48 89 df movq %rbx, %rdi + // 57: 89 c3 movl %eax, %ebx + // 59: ff 15 00 00 00 00 callq *(%rip) ## 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5f: 89 d8 movl %ebx, %eax + // 61: 49 83 c5 f8 addq $-0x8, %r13 + // 65: 85 c0 testl %eax, %eax + // 67: 79 e5 jns 0x4e <__JIT_ENTRY+0x4e> + // 69: 5d popq %rbp + // 6a: e9 00 00 00 00 jmp 0x6f <__JIT_ENTRY+0x6f> + // 000000000000006b: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[111] = { + 0x55, 0x48, 0x89, 0xe5, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x5d, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x7c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xde, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0e, 0x49, 0x83, + 0xc5, 0xf8, 0x85, 0xc0, 0x78, 0x1b, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xd8, 0x49, 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x79, + 0xe5, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PySet_Update+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PySet_Update); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_32r(code + 0x50, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + -0x4); + patch_32r(code + 0x6b, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__START_EXECUTOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _START_EXECUTOR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5: 49 8b be 10 01 00 00 movq 0x110(%r14), %rdi + // c: 48 85 ff testq %rdi, %rdi + // f: 74 17 je 0x28 <__JIT_ENTRY+0x28> + // 11: 49 c7 86 10 01 00 00 00 00 00 00 movq $0x0, 0x110(%r14) + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0xbe, + 0x10, 0x01, 0x00, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x17, 0x49, 0xc7, 0x86, 0x10, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 10: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 14: 49 8b 04 24 movq (%r12), %rax + // 18: 48 8b 40 20 movq 0x20(%rax), %rax + // 1c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x23 <__JIT_ENTRY+0x23> + // 000000000000001f: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 23: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 48 89 df movq %rbx, %rdi + // 30: 4c 89 fa movq %r15, %rdx + // 33: ff 15 00 00 00 00 callq *(%rip) ## 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_GOT _PyObject_SetAttr@GOTPCREL + // 39: 41 89 c6 movl %eax, %r14d + // 3c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 41: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4a: 41 8b 07 movl (%r15), %eax + // 4d: 85 c0 testl %eax, %eax + // 4f: 78 10 js 0x61 <__JIT_ENTRY+0x61> + // 51: ff c8 decl %eax + // 53: 41 89 07 movl %eax, (%r15) + // 56: 75 09 jne 0x61 <__JIT_ENTRY+0x61> + // 58: 4c 89 ff movq %r15, %rdi + // 5b: ff 15 00 00 00 00 callq *(%rip) ## 0x61 <__JIT_ENTRY+0x61> + // 000000000000005d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 61: 8b 03 movl (%rbx), %eax + // 63: 85 c0 testl %eax, %eax + // 65: 78 06 js 0x6d <__JIT_ENTRY+0x6d> + // 67: ff c8 decl %eax + // 69: 89 03 movl %eax, (%rbx) + // 6b: 74 17 je 0x84 <__JIT_ENTRY+0x84> + // 6d: 49 83 c5 f0 addq $-0x10, %r13 + // 71: 45 85 f6 testl %r14d, %r14d + // 74: 74 20 je 0x96 <__JIT_ENTRY+0x96> + // 76: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 7a: 48 83 c4 10 addq $0x10, %rsp + // 7e: 5d popq %rbp + // 7f: e9 00 00 00 00 jmp 0x84 <__JIT_ENTRY+0x84> + // 0000000000000080: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 84: 48 89 df movq %rbx, %rdi + // 87: ff 15 00 00 00 00 callq *(%rip) ## 0x8d <__JIT_ENTRY+0x8d> + // 0000000000000089: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8d: 49 83 c5 f0 addq $-0x10, %r13 + // 91: 45 85 f6 testl %r14d, %r14d + // 94: 75 e0 jne 0x76 <__JIT_ENTRY+0x76> + // 96: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 9a: 48 83 c4 10 addq $0x10, %rsp + // 9e: 5d popq %rbp + // 9f: e9 00 00 00 00 jmp 0xa4 <__JIT_ENTRY+0xa4> + // 00000000000000a0: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[159] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x74, 0xc8, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0x4c, 0x89, 0xfa, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x17, 0x49, 0x83, 0xc5, + 0xf0, 0x45, 0x85, 0xf6, 0x74, 0x20, 0x4c, 0x8b, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, + 0xf0, 0x45, 0x85, 0xf6, 0x75, 0xe0, 0x4c, 0x8b, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_SetAttr+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetAttr); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + -0x4); + patch_32r(code + 0x80, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + -0x4); +} + +void +emit__STORE_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_INSTANCE_VALUE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 49 83 c5 f0 addq $-0x10, %r13 + // c: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 13: 48 8b 1c 07 movq (%rdi,%rax), %rbx + // 17: 48 89 0c 07 movq %rcx, (%rdi,%rax) + // 1b: 48 85 db testq %rbx, %rbx + // 1e: 75 38 jne 0x58 <__JIT_ENTRY+0x58> + // 20: 48 01 f8 addq %rdi, %rax + // 23: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 27: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 2b: 48 8d 14 0f leaq (%rdi,%rcx), %rdx + // 2f: 48 8d 34 0f leaq (%rdi,%rcx), %rsi + // 33: 48 83 c6 08 addq $0x8, %rsi + // 37: 29 f0 subl %esi, %eax + // 39: c1 e8 03 shrl $0x3, %eax + // 3c: 0f b6 74 0f 01 movzbl 0x1(%rdi,%rcx), %esi + // 41: 44 0f b6 04 0f movzbl (%rdi,%rcx), %r8d + // 46: 4a 8d 14 c2 leaq (%rdx,%r8,8), %rdx + // 4a: 48 83 c2 08 addq $0x8, %rdx + // 4e: 88 04 16 movb %al, (%rsi,%rdx) + // 51: 8d 46 01 leal 0x1(%rsi), %eax + // 54: 88 44 0f 01 movb %al, 0x1(%rdi,%rcx) + // 58: 55 pushq %rbp + // 59: 48 89 e5 movq %rsp, %rbp + // 5c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 61: 8b 07 movl (%rdi), %eax + // 63: 85 c0 testl %eax, %eax + // 65: 78 0c js 0x73 <__JIT_ENTRY+0x73> + // 67: ff c8 decl %eax + // 69: 89 07 movl %eax, (%rdi) + // 6b: 75 06 jne 0x73 <__JIT_ENTRY+0x73> + // 6d: ff 15 00 00 00 00 callq *(%rip) ## 0x73 <__JIT_ENTRY+0x73> + // 000000000000006f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 73: 48 85 db testq %rbx, %rbx + // 76: 74 0c je 0x84 <__JIT_ENTRY+0x84> + // 78: 8b 03 movl (%rbx), %eax + // 7a: 85 c0 testl %eax, %eax + // 7c: 78 06 js 0x84 <__JIT_ENTRY+0x84> + // 7e: ff c8 decl %eax + // 80: 89 03 movl %eax, (%rbx) + // 82: 74 14 je 0x98 <__JIT_ENTRY+0x98> + // 84: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 89: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 92: 5d popq %rbp + // 93: e9 00 00 00 00 jmp 0x98 <__JIT_ENTRY+0x98> + // 0000000000000094: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 98: 48 89 df movq %rbx, %rdi + // 9b: ff 15 00 00 00 00 callq *(%rip) ## 0xa1 <__JIT_ENTRY+0xa1> + // 000000000000009d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a1: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a6: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // af: 5d popq %rbp + // b0: e9 00 00 00 00 jmp 0xb5 <__JIT_ENTRY+0xb5> + // 00000000000000b1: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[176] = { + 0x49, 0x8b, 0x4d, 0xf0, 0x49, 0x8b, 0x7d, 0xf8, + 0x49, 0x83, 0xc5, 0xf0, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x1c, 0x07, 0x48, + 0x89, 0x0c, 0x07, 0x48, 0x85, 0xdb, 0x75, 0x38, + 0x48, 0x01, 0xf8, 0x48, 0x8b, 0x4f, 0x08, 0x48, + 0x8b, 0x49, 0x20, 0x48, 0x8d, 0x14, 0x0f, 0x48, + 0x8d, 0x34, 0x0f, 0x48, 0x83, 0xc6, 0x08, 0x29, + 0xf0, 0xc1, 0xe8, 0x03, 0x0f, 0xb6, 0x74, 0x0f, + 0x01, 0x44, 0x0f, 0xb6, 0x04, 0x0f, 0x4a, 0x8d, + 0x14, 0xc2, 0x48, 0x83, 0xc2, 0x08, 0x88, 0x04, + 0x16, 0x8d, 0x46, 0x01, 0x88, 0x44, 0x0f, 0x01, + 0x55, 0x48, 0x89, 0xe5, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x74, 0x0c, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x03, 0x74, 0x14, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + -0x4); + patch_32r(code + 0x94, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x9d, (uintptr_t)data + -0x4); +} + +void +emit__STORE_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_SLOT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 49 8b 7d f8 movq -0x8(%r13), %rdi + // c: 49 83 c5 f0 addq $-0x10, %r13 + // 10: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 17: 48 8b 1c 0f movq (%rdi,%rcx), %rbx + // 1b: 48 89 04 0f movq %rax, (%rdi,%rcx) + // 1f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 24: 8b 07 movl (%rdi), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 0c js 0x36 <__JIT_ENTRY+0x36> + // 2a: ff c8 decl %eax + // 2c: 89 07 movl %eax, (%rdi) + // 2e: 75 06 jne 0x36 <__JIT_ENTRY+0x36> + // 30: ff 15 00 00 00 00 callq *(%rip) ## 0x36 <__JIT_ENTRY+0x36> + // 0000000000000032: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 36: 48 85 db testq %rbx, %rbx + // 39: 74 0c je 0x47 <__JIT_ENTRY+0x47> + // 3b: 8b 03 movl (%rbx), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 06 js 0x47 <__JIT_ENTRY+0x47> + // 41: ff c8 decl %eax + // 43: 89 03 movl %eax, (%rbx) + // 45: 74 14 je 0x5b <__JIT_ENTRY+0x5b> + // 47: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 55: 5d popq %rbp + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5b: 48 89 df movq %rbx, %rdi + // 5e: ff 15 00 00 00 00 callq *(%rip) ## 0x64 <__JIT_ENTRY+0x64> + // 0000000000000060: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 64: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 69: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 72: 5d popq %rbp + // 73: e9 00 00 00 00 jmp 0x78 <__JIT_ENTRY+0x78> + // 0000000000000074: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[115] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, 0xf0, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x1c, 0x0f, 0x48, 0x89, 0x04, 0x0f, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xdb, 0x74, 0x0c, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x14, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + -0x4); + patch_32r(code + 0x57, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + -0x4); +} + +void +emit__STORE_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_WITH_HINT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 4: 48 8b 53 e8 movq -0x18(%rbx), %rdx + // 8: 48 85 d2 testq %rdx, %rdx + // b: 0f 84 00 00 00 00 je 0x11 <__JIT_ENTRY+0x11> + // 000000000000000d: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 11: 0f b7 35 00 00 00 00 movzwl (%rip), %esi ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT __JIT_OPERAND0@GOTPCREL + // 18: 48 8b 7a 20 movq 0x20(%rdx), %rdi + // 1c: 48 39 77 18 cmpq %rsi, 0x18(%rdi) + // 20: 0f 86 00 00 00 00 jbe 0x26 <__JIT_ENTRY+0x26> + // 0000000000000022: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 26: 80 7f 0a 00 cmpb $0x0, 0xa(%rdi) + // 2a: 0f 84 00 00 00 00 je 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 30: 49 8b 04 24 movq (%r12), %rax + // 34: 48 8b 40 20 movq 0x20(%rax), %rax + // 38: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 3f: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 44: 0f b6 4f 09 movzbl 0x9(%rdi), %ecx + // 48: 41 b8 01 00 00 00 movl $0x1, %r8d + // 4e: 49 d3 e0 shlq %cl, %r8 + // 51: 49 01 f8 addq %rdi, %r8 + // 54: c1 e6 04 shll $0x4, %esi + // 57: 4a 39 44 06 20 cmpq %rax, 0x20(%rsi,%r8) + // 5c: 0f 85 00 00 00 00 jne 0x62 <__JIT_ENTRY+0x62> + // 000000000000005e: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 62: 4e 8d 3c 06 leaq (%rsi,%r8), %r15 + // 66: 49 83 c7 20 addq $0x20, %r15 + // 6a: 49 8b 4f 08 movq 0x8(%r15), %rcx + // 6e: 48 85 c9 testq %rcx, %rcx + // 71: 0f 84 00 00 00 00 je 0x77 <__JIT_ENTRY+0x77> + // 0000000000000073: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 77: 55 pushq %rbp + // 78: 48 89 e5 movq %rsp, %rbp + // 7b: 48 83 ec 10 subq $0x10, %rsp + // 7f: 4d 8b 45 f0 movq -0x10(%r13), %r8 + // 83: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 88: 0f b6 7a 18 movzbl 0x18(%rdx), %edi + // 8c: 85 ff testl %edi, %edi + // 8e: 74 21 je 0xb1 <__JIT_ENTRY+0xb1> + // 90: be 01 00 00 00 movl $0x1, %esi + // 95: 48 89 4d f8 movq %rcx, -0x8(%rbp) + // 99: 48 89 c1 movq %rax, %rcx + // 9c: 4d 89 c5 movq %r8, %r13 + // 9f: ff 15 00 00 00 00 callq *(%rip) ## 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_GOT __PyDict_SendEvent@GOTPCREL + // a5: 4d 89 e8 movq %r13, %r8 + // a8: 48 8b 4d f8 movq -0x8(%rbp), %rcx + // ac: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b1: 4d 89 47 08 movq %r8, 0x8(%r15) + // b5: 49 83 c5 f0 addq $-0x10, %r13 + // b9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // be: 8b 03 movl (%rbx), %eax + // c0: 85 c0 testl %eax, %eax + // c2: 78 15 js 0xd9 <__JIT_ENTRY+0xd9> + // c4: ff c8 decl %eax + // c6: 89 03 movl %eax, (%rbx) + // c8: 75 0f jne 0xd9 <__JIT_ENTRY+0xd9> + // ca: 48 89 df movq %rbx, %rdi + // cd: 48 89 cb movq %rcx, %rbx + // d0: ff 15 00 00 00 00 callq *(%rip) ## 0xd6 <__JIT_ENTRY+0xd6> + // 00000000000000d2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // d6: 48 89 d9 movq %rbx, %rcx + // d9: 8b 01 movl (%rcx), %eax + // db: 85 c0 testl %eax, %eax + // dd: 78 0f js 0xee <__JIT_ENTRY+0xee> + // df: ff c8 decl %eax + // e1: 89 01 movl %eax, (%rcx) + // e3: 75 09 jne 0xee <__JIT_ENTRY+0xee> + // e5: 48 89 cf movq %rcx, %rdi + // e8: ff 15 00 00 00 00 callq *(%rip) ## 0xee <__JIT_ENTRY+0xee> + // 00000000000000ea: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // ee: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fc: 48 83 c4 10 addq $0x10, %rsp + // 100: 5d popq %rbp + // 101: e9 00 00 00 00 jmp 0x106 <__JIT_ENTRY+0x106> + // 0000000000000102: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[257] = { + 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x53, 0xe8, + 0x48, 0x85, 0xd2, 0x0f, 0x84, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x7a, 0x20, 0x48, 0x39, 0x77, 0x18, + 0x0f, 0x86, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, + 0x0a, 0x00, 0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x20, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0xc8, 0x18, 0x0f, 0xb6, 0x4f, 0x09, + 0x41, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x49, 0xd3, + 0xe0, 0x49, 0x01, 0xf8, 0xc1, 0xe6, 0x04, 0x4a, + 0x39, 0x44, 0x06, 0x20, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x8d, 0x3c, 0x06, 0x49, 0x83, + 0xc7, 0x20, 0x49, 0x8b, 0x4f, 0x08, 0x48, 0x85, + 0xc9, 0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x55, + 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, 0x4d, + 0x8b, 0x45, 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x0f, 0xb6, 0x7a, 0x18, 0x85, 0xff, 0x74, 0x21, + 0xbe, 0x01, 0x00, 0x00, 0x00, 0x48, 0x89, 0x4d, + 0xf8, 0x48, 0x89, 0xc1, 0x4d, 0x89, 0xc5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xe8, + 0x48, 0x8b, 0x4d, 0xf8, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x4d, 0x89, 0x47, 0x08, 0x49, 0x83, 0xc5, + 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x15, 0xff, 0xc8, 0x89, 0x03, + 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xcb, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd9, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x09, 0x48, 0x89, 0xcf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x10, + 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyDict_SendEvent+0x0 + // 10: OPARG + // 18: OPERAND0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyDict_SendEvent); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xd, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x14); + patch_32r(code + 0x22, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x2c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0xc); + patch_32r(code + 0x5e, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x73, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xea, (uintptr_t)data + -0x4); +} + +void +emit__STORE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_DEREF.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: 49 8b 4c cc 50 movq 0x50(%r12,%rcx,8), %rcx + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: 48 8b 79 10 movq 0x10(%rcx), %rdi + // 19: 48 89 41 10 movq %rax, 0x10(%rcx) + // 1d: 48 85 ff testq %rdi, %rdi + // 20: 74 0c je 0x2e <__JIT_ENTRY+0x2e> + // 22: 8b 07 movl (%rdi), %eax + // 24: 85 c0 testl %eax, %eax + // 26: 78 06 js 0x2e <__JIT_ENTRY+0x2e> + // 28: ff c8 decl %eax + // 2a: 89 07 movl %eax, (%rdi) + // 2c: 74 17 je 0x45 <__JIT_ENTRY+0x45> + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: 49 83 c5 f8 addq $-0x8, %r13 + // 40: e9 00 00 00 00 jmp 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 45: 55 pushq %rbp + // 46: 48 89 e5 movq %rsp, %rbp + // 49: ff 15 00 00 00 00 callq *(%rip) ## 0x4f <__JIT_ENTRY+0x4f> + // 000000000000004b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4f: 5d popq %rbp + // 50: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 55: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5e: 49 83 c5 f8 addq $-0x8, %r13 + // 62: e9 00 00 00 00 jmp 0x67 <__JIT_ENTRY+0x67> + // 0000000000000063: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[98] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xcc, 0x50, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x79, + 0x10, 0x48, 0x89, 0x41, 0x10, 0x48, 0x85, 0xff, + 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x17, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, + 0xe9, 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, + 0xe5, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_32r(code + 0x41, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // f: 49 8b 7c cc 50 movq 0x50(%r12,%rcx,8), %rdi + // 14: 49 89 44 cc 50 movq %rax, 0x50(%r12,%rcx,8) + // 19: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1e: 48 85 ff testq %rdi, %rdi + // 21: 74 0c je 0x2f <__JIT_ENTRY+0x2f> + // 23: 8b 07 movl (%rdi), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 06 js 0x2f <__JIT_ENTRY+0x2f> + // 29: ff c8 decl %eax + // 2b: 89 07 movl %eax, (%rdi) + // 2d: 74 13 je 0x42 <__JIT_ENTRY+0x42> + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 000000000000003e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 42: 55 pushq %rbp + // 43: 48 89 e5 movq %rsp, %rbp + // 46: ff 15 00 00 00 00 callq *(%rip) ## 0x4c <__JIT_ENTRY+0x4c> + // 0000000000000048: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4c: 5d popq %rbp + // 4d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 52: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5b: e9 00 00 00 00 jmp 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[91] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x7c, 0xcc, 0x50, 0x49, 0x89, 0x44, 0xcc, + 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, + 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_32r(code + 0x3e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_0.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b 7c 24 50 movq 0x50(%r12), %rdi + // d: 49 89 44 24 50 movq %rax, 0x50(%r12) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 74 0c je 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0x7c, 0x24, 0x50, 0x49, 0x89, 0x44, + 0x24, 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_1.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b 7c 24 58 movq 0x58(%r12), %rdi + // d: 49 89 44 24 58 movq %rax, 0x58(%r12) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 74 0c je 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0x7c, 0x24, 0x58, 0x49, 0x89, 0x44, + 0x24, 0x58, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_2.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b 7c 24 60 movq 0x60(%r12), %rdi + // d: 49 89 44 24 60 movq %rax, 0x60(%r12) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 74 0c je 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0x7c, 0x24, 0x60, 0x49, 0x89, 0x44, + 0x24, 0x60, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_3.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b 7c 24 68 movq 0x68(%r12), %rdi + // d: 49 89 44 24 68 movq %rax, 0x68(%r12) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 74 0c je 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0x7c, 0x24, 0x68, 0x49, 0x89, 0x44, + 0x24, 0x68, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_4.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b 7c 24 70 movq 0x70(%r12), %rdi + // d: 49 89 44 24 70 movq %rax, 0x70(%r12) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 74 0c je 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0x7c, 0x24, 0x70, 0x49, 0x89, 0x44, + 0x24, 0x70, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_5.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b 7c 24 78 movq 0x78(%r12), %rdi + // d: 49 89 44 24 78 movq %rax, 0x78(%r12) + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 74 0c je 0x28 <__JIT_ENTRY+0x28> + // 1c: 8b 07 movl (%rdi), %eax + // 1e: 85 c0 testl %eax, %eax + // 20: 78 06 js 0x28 <__JIT_ENTRY+0x28> + // 22: ff c8 decl %eax + // 24: 89 07 movl %eax, (%rdi) + // 26: 74 13 je 0x3b <__JIT_ENTRY+0x3b> + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: e9 00 00 00 00 jmp 0x3b <__JIT_ENTRY+0x3b> + // 0000000000000037: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3b: 55 pushq %rbp + // 3c: 48 89 e5 movq %rsp, %rbp + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 5d popq %rbp + // 46: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 54: e9 00 00 00 00 jmp 0x59 <__JIT_ENTRY+0x59> + // 0000000000000055: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[84] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0x7c, 0x24, 0x78, 0x49, 0x89, 0x44, + 0x24, 0x78, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x37, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_6.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b bc 24 80 00 00 00 movq 0x80(%r12), %rdi + // 10: 49 89 84 24 80 00 00 00 movq %rax, 0x80(%r12) + // 18: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1d: 48 85 ff testq %rdi, %rdi + // 20: 74 0c je 0x2e <__JIT_ENTRY+0x2e> + // 22: 8b 07 movl (%rdi), %eax + // 24: 85 c0 testl %eax, %eax + // 26: 78 06 js 0x2e <__JIT_ENTRY+0x2e> + // 28: ff c8 decl %eax + // 2a: 89 07 movl %eax, (%rdi) + // 2c: 74 13 je 0x41 <__JIT_ENTRY+0x41> + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 41: 55 pushq %rbp + // 42: 48 89 e5 movq %rsp, %rbp + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 5d popq %rbp + // 4c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 51: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5a: e9 00 00 00 00 jmp 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[90] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0xbc, 0x24, 0x80, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, 0xff, + 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); +} + +void +emit__STORE_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_7.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 49 8b bc 24 88 00 00 00 movq 0x88(%r12), %rdi + // 10: 49 89 84 24 88 00 00 00 movq %rax, 0x88(%r12) + // 18: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1d: 48 85 ff testq %rdi, %rdi + // 20: 74 0c je 0x2e <__JIT_ENTRY+0x2e> + // 22: 8b 07 movl (%rdi), %eax + // 24: 85 c0 testl %eax, %eax + // 26: 78 06 js 0x2e <__JIT_ENTRY+0x2e> + // 28: ff c8 decl %eax + // 2a: 89 07 movl %eax, (%rdi) + // 2c: 74 13 je 0x41 <__JIT_ENTRY+0x41> + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: e9 00 00 00 00 jmp 0x41 <__JIT_ENTRY+0x41> + // 000000000000003d: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 41: 55 pushq %rbp + // 42: 48 89 e5 movq %rsp, %rbp + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 5d popq %rbp + // 4c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 51: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5a: e9 00 00 00 00 jmp 0x5f <__JIT_ENTRY+0x5f> + // 000000000000005b: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[90] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x49, 0x8b, 0xbc, 0x24, 0x88, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x84, 0x24, 0x88, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, 0xff, + 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x13, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3d, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); +} + +void +emit__STORE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_GLOBAL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 49 8b 7c 24 18 movq 0x18(%r12), %rdi + // 11: 48 8b 40 20 movq 0x20(%rax), %rax + // 15: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 1c: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 48 89 da movq %rbx, %rdx + // 29: ff 15 00 00 00 00 callq *(%rip) ## 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_GOT _PyDict_SetItem@GOTPCREL + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 8b 0b movl (%rbx), %ecx + // 3f: 85 c9 testl %ecx, %ecx + // 41: 78 06 js 0x49 <__JIT_ENTRY+0x49> + // 43: ff c9 decl %ecx + // 45: 89 0b movl %ecx, (%rbx) + // 47: 74 0e je 0x57 <__JIT_ENTRY+0x57> + // 49: 49 83 c5 f8 addq $-0x8, %r13 + // 4d: 85 c0 testl %eax, %eax + // 4f: 74 1b je 0x6c <__JIT_ENTRY+0x6c> + // 51: 5d popq %rbp + // 52: e9 00 00 00 00 jmp 0x57 <__JIT_ENTRY+0x57> + // 0000000000000053: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 57: 48 89 df movq %rbx, %rdi + // 5a: 89 c3 movl %eax, %ebx + // 5c: ff 15 00 00 00 00 callq *(%rip) ## 0x62 <__JIT_ENTRY+0x62> + // 000000000000005e: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 62: 89 d8 movl %ebx, %eax + // 64: 49 83 c5 f8 addq $-0x8, %r13 + // 68: 85 c0 testl %eax, %eax + // 6a: 75 e5 jne 0x51 <__JIT_ENTRY+0x51> + // 6c: 5d popq %rbp + // 6d: e9 00 00 00 00 jmp 0x72 <__JIT_ENTRY+0x72> + // 000000000000006e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[109] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x7c, 0x24, + 0x18, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x74, 0xc8, + 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, + 0x0e, 0x49, 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x74, + 0x1b, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd8, 0x49, 0x83, 0xc5, 0xf8, + 0x85, 0xc0, 0x75, 0xe5, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyDict_SetItem+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_32r(code + 0x53, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + -0x4); +} + +void +emit__STORE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_NAME.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // 11: 48 8b 40 20 movq 0x20(%rax), %rax + // 15: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx ## 0x1c <__JIT_ENTRY+0x1c> + // 0000000000000018: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 1c: 48 8b 4c c8 18 movq 0x18(%rax,%rcx,8), %rcx + // 21: 48 85 ff testq %rdi, %rdi + // 24: 74 20 je 0x46 <__JIT_ENTRY+0x46> + // 26: 48 8b 47 08 movq 0x8(%rdi), %rax + // 2a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2f: 48 89 ce movq %rcx, %rsi + // 32: 48 89 da movq %rbx, %rdx + // 35: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // 3c: 74 4d je 0x8b <__JIT_ENTRY+0x8b> + // 3e: ff 15 00 00 00 00 callq *(%rip) ## 0x44 <__JIT_ENTRY+0x44> + // 0000000000000040: X86_64_RELOC_GOT _PyObject_SetItem@GOTPCREL + // 44: eb 4b jmp 0x91 <__JIT_ENTRY+0x91> + // 46: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4b: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_GOT_LOAD _PyExc_SystemError@GOTPCREL + // 52: 48 8b 30 movq (%rax), %rsi + // 55: 48 8d 15 8b 00 00 00 leaq 0x8b(%rip), %rdx ## 0xe7 <__JIT_ENTRY+0xe7> + // 0000000000000058: X86_64_RELOC_SIGNED __cstring + // 5c: 4c 89 f7 movq %r14, %rdi + // 5f: 31 c0 xorl %eax, %eax + // 61: ff 15 00 00 00 00 callq *(%rip) ## 0x67 <__JIT_ENTRY+0x67> + // 0000000000000063: X86_64_RELOC_GOT __PyErr_Format@GOTPCREL + // 67: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 75: 8b 03 movl (%rbx), %eax + // 77: 85 c0 testl %eax, %eax + // 79: 78 06 js 0x81 <__JIT_ENTRY+0x81> + // 7b: ff c8 decl %eax + // 7d: 89 03 movl %eax, (%rbx) + // 7f: 74 53 je 0xd4 <__JIT_ENTRY+0xd4> + // 81: 49 83 c5 f8 addq $-0x8, %r13 + // 85: 5d popq %rbp + // 86: e9 00 00 00 00 jmp 0x8b <__JIT_ENTRY+0x8b> + // 0000000000000087: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 8b: ff 15 00 00 00 00 callq *(%rip) ## 0x91 <__JIT_ENTRY+0x91> + // 000000000000008d: X86_64_RELOC_GOT _PyDict_SetItem@GOTPCREL + // 91: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: 8b 0b movl (%rbx), %ecx + // a1: 85 c9 testl %ecx, %ecx + // a3: 78 06 js 0xab <__JIT_ENTRY+0xab> + // a5: ff c9 decl %ecx + // a7: 89 0b movl %ecx, (%rbx) + // a9: 74 0e je 0xb9 <__JIT_ENTRY+0xb9> + // ab: 49 83 c5 f8 addq $-0x8, %r13 + // af: 85 c0 testl %eax, %eax + // b1: 74 1b je 0xce <__JIT_ENTRY+0xce> + // b3: 5d popq %rbp + // b4: e9 00 00 00 00 jmp 0xb9 <__JIT_ENTRY+0xb9> + // 00000000000000b5: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // b9: 48 89 df movq %rbx, %rdi + // bc: 89 c3 movl %eax, %ebx + // be: ff 15 00 00 00 00 callq *(%rip) ## 0xc4 <__JIT_ENTRY+0xc4> + // 00000000000000c0: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c4: 89 d8 movl %ebx, %eax + // c6: 49 83 c5 f8 addq $-0x8, %r13 + // ca: 85 c0 testl %eax, %eax + // cc: 75 e5 jne 0xb3 <__JIT_ENTRY+0xb3> + // ce: 5d popq %rbp + // cf: e9 00 00 00 00 jmp 0xd4 <__JIT_ENTRY+0xd4> + // 00000000000000d0: X86_64_RELOC_BRANCH __JIT_CONTINUE + // d4: 48 89 df movq %rbx, %rdi + // d7: ff 15 00 00 00 00 callq *(%rip) ## 0xdd <__JIT_ENTRY+0xdd> + // 00000000000000d9: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // dd: 49 83 c5 f8 addq $-0x8, %r13 + // e1: 5d popq %rbp + // e2: e9 00 00 00 00 jmp 0xe7 <__JIT_ENTRY+0xe7> + // 00000000000000e3: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[231] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x7c, 0x24, + 0x28, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x4c, 0xc8, + 0x18, 0x48, 0x85, 0xff, 0x74, 0x20, 0x48, 0x8b, + 0x47, 0x08, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x89, 0xce, 0x48, 0x89, 0xda, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x4d, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0x4b, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x30, 0x48, 0x8d, 0x15, + 0x8b, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x31, + 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x53, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0b, 0x74, 0x0e, 0x49, 0x83, 0xc5, 0xf8, 0x85, + 0xc0, 0x74, 0x1b, 0x5d, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x49, 0x83, + 0xc5, 0xf8, 0x85, 0xc0, 0x75, 0xe5, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'no locals found when storing %R\x00' + // 20: &_Py_Dealloc+0x0 + // 28: &PyDict_SetItem+0x0 + // 30: &_PyErr_Format+0x0 + // 38: &PyExc_SystemError+0x0 + // 40: &PyObject_SetItem+0x0 + // 48: &PyDict_Type+0x0 + // 50: OPARG + const unsigned char data_body[88] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x30, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x38, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x40, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x48, (uintptr_t)&PyDict_Type); + patch_64(data + 0x50, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x34); + patch_32r(code + 0x58, (uintptr_t)data + 0x16e); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x2c); + patch_32r(code + 0x87, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + 0x24); + patch_32r(code + 0xb5, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0xc0, (uintptr_t)data + 0x1c); + patch_32r(code + 0xd0, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd9, (uintptr_t)data + 0x1c); + patch_32r(code + 0xe3, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__STORE_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SLICE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 10: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 14: 4d 8b 7d e0 movq -0x20(%r13), %r15 + // 18: 4d 8b 75 e8 movq -0x18(%r13), %r14 + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: ff 15 00 00 00 00 callq *(%rip) ## 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_GOT __PyBuildSlice_ConsumeRefs@GOTPCREL + // 27: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 35: 48 85 c0 testq %rax, %rax + // 38: 74 54 je 0x8e <__JIT_ENTRY+0x8e> + // 3a: 48 89 c3 movq %rax, %rbx + // 3d: 49 83 c5 f0 addq $-0x10, %r13 + // 41: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 46: 4c 89 f7 movq %r14, %rdi + // 49: 48 89 c6 movq %rax, %rsi + // 4c: 4c 89 fa movq %r15, %rdx + // 4f: ff 15 00 00 00 00 callq *(%rip) ## 0x55 <__JIT_ENTRY+0x55> + // 0000000000000051: X86_64_RELOC_GOT _PyObject_SetItem@GOTPCREL + // 55: 8b 0b movl (%rbx), %ecx + // 57: 85 c9 testl %ecx, %ecx + // 59: 78 13 js 0x6e <__JIT_ENTRY+0x6e> + // 5b: ff c9 decl %ecx + // 5d: 89 0b movl %ecx, (%rbx) + // 5f: 75 0d jne 0x6e <__JIT_ENTRY+0x6e> + // 61: 48 89 df movq %rbx, %rdi + // 64: 89 c3 movl %eax, %ebx + // 66: ff 15 00 00 00 00 callq *(%rip) ## 0x6c <__JIT_ENTRY+0x6c> + // 0000000000000068: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 6c: 89 d8 movl %ebx, %eax + // 6e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 73: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7c: 49 83 c5 10 addq $0x10, %r13 + // 80: 85 c0 testl %eax, %eax + // 82: 0f 94 c3 sete %bl + // 85: 41 8b 07 movl (%r15), %eax + // 88: 85 c0 testl %eax, %eax + // 8a: 79 0b jns 0x97 <__JIT_ENTRY+0x97> + // 8c: eb 19 jmp 0xa7 <__JIT_ENTRY+0xa7> + // 8e: 31 db xorl %ebx, %ebx + // 90: 41 8b 07 movl (%r15), %eax + // 93: 85 c0 testl %eax, %eax + // 95: 78 10 js 0xa7 <__JIT_ENTRY+0xa7> + // 97: ff c8 decl %eax + // 99: 41 89 07 movl %eax, (%r15) + // 9c: 75 09 jne 0xa7 <__JIT_ENTRY+0xa7> + // 9e: 4c 89 ff movq %r15, %rdi + // a1: ff 15 00 00 00 00 callq *(%rip) ## 0xa7 <__JIT_ENTRY+0xa7> + // 00000000000000a3: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a7: 41 8b 06 movl (%r14), %eax + // aa: 85 c0 testl %eax, %eax + // ac: 78 07 js 0xb5 <__JIT_ENTRY+0xb5> + // ae: ff c8 decl %eax + // b0: 41 89 06 movl %eax, (%r14) + // b3: 74 16 je 0xcb <__JIT_ENTRY+0xcb> + // b5: 49 83 c5 e0 addq $-0x20, %r13 + // b9: 84 db testb %bl, %bl + // bb: 74 1f je 0xdc <__JIT_ENTRY+0xdc> + // bd: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // c1: 48 83 c4 10 addq $0x10, %rsp + // c5: 5d popq %rbp + // c6: e9 00 00 00 00 jmp 0xcb <__JIT_ENTRY+0xcb> + // 00000000000000c7: X86_64_RELOC_BRANCH __JIT_CONTINUE + // cb: 4c 89 f7 movq %r14, %rdi + // ce: ff 15 00 00 00 00 callq *(%rip) ## 0xd4 <__JIT_ENTRY+0xd4> + // 00000000000000d0: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // d4: 49 83 c5 e0 addq $-0x20, %r13 + // d8: 84 db testb %bl, %bl + // da: 75 e1 jne 0xbd <__JIT_ENTRY+0xbd> + // dc: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // e0: 48 83 c4 10 addq $0x10, %rsp + // e4: 5d popq %rbp + // e5: e9 00 00 00 00 jmp 0xea <__JIT_ENTRY+0xea> + // 00000000000000e6: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[234] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x7d, 0xf0, 0x4d, 0x8b, 0x7d, 0xe0, + 0x4d, 0x8b, 0x75, 0xe8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x54, 0x48, 0x89, 0xc3, 0x49, 0x83, 0xc5, + 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf7, 0x48, 0x89, 0xc6, 0x4c, 0x89, 0xfa, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x13, 0xff, 0xc9, 0x89, 0x0b, 0x75, + 0x0d, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0x10, + 0x85, 0xc0, 0x0f, 0x94, 0xc3, 0x41, 0x8b, 0x07, + 0x85, 0xc0, 0x79, 0x0b, 0xeb, 0x19, 0x31, 0xdb, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x07, 0xff, 0xc8, + 0x41, 0x89, 0x06, 0x74, 0x16, 0x49, 0x83, 0xc5, + 0xe0, 0x84, 0xdb, 0x74, 0x1f, 0x4c, 0x8b, 0x75, + 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xe0, + 0x84, 0xdb, 0x75, 0xe1, 0x4c, 0x8b, 0x75, 0xf8, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_SetItem+0x0 + // 10: &_PyBuildSlice_ConsumeRefs+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x10, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + -0x4); + patch_32r(code + 0xc7, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + -0x4); + patch_32r(code + 0xe6, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__STORE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: 4d 8b 75 e8 movq -0x18(%r13), %r14 + // 14: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 18: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1d: 4c 89 ff movq %r15, %rdi + // 20: 48 89 de movq %rbx, %rsi + // 23: 4c 89 f2 movq %r14, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) ## 0x2c <__JIT_ENTRY+0x2c> + // 0000000000000028: X86_64_RELOC_GOT _PyObject_SetItem@GOTPCREL + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 41 8b 0e movl (%r14), %ecx + // 3d: 85 c9 testl %ecx, %ecx + // 3f: 78 16 js 0x57 <__JIT_ENTRY+0x57> + // 41: ff c9 decl %ecx + // 43: 41 89 0e movl %ecx, (%r14) + // 46: 75 0f jne 0x57 <__JIT_ENTRY+0x57> + // 48: 4c 89 f7 movq %r14, %rdi + // 4b: 41 89 c6 movl %eax, %r14d + // 4e: ff 15 00 00 00 00 callq *(%rip) ## 0x54 <__JIT_ENTRY+0x54> + // 0000000000000050: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 54: 44 89 f0 movl %r14d, %eax + // 57: 41 8b 0f movl (%r15), %ecx + // 5a: 85 c9 testl %ecx, %ecx + // 5c: 78 16 js 0x74 <__JIT_ENTRY+0x74> + // 5e: ff c9 decl %ecx + // 60: 41 89 0f movl %ecx, (%r15) + // 63: 75 0f jne 0x74 <__JIT_ENTRY+0x74> + // 65: 4c 89 ff movq %r15, %rdi + // 68: 41 89 c6 movl %eax, %r14d + // 6b: ff 15 00 00 00 00 callq *(%rip) ## 0x71 <__JIT_ENTRY+0x71> + // 000000000000006d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 71: 44 89 f0 movl %r14d, %eax + // 74: 8b 0b movl (%rbx), %ecx + // 76: 85 c9 testl %ecx, %ecx + // 78: 78 06 js 0x80 <__JIT_ENTRY+0x80> + // 7a: ff c9 decl %ecx + // 7c: 89 0b movl %ecx, (%rbx) + // 7e: 74 16 je 0x96 <__JIT_ENTRY+0x96> + // 80: 49 83 c5 e8 addq $-0x18, %r13 + // 84: 85 c0 testl %eax, %eax + // 86: 74 23 je 0xab <__JIT_ENTRY+0xab> + // 88: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 8c: 48 83 c4 10 addq $0x10, %rsp + // 90: 5d popq %rbp + // 91: e9 00 00 00 00 jmp 0x96 <__JIT_ENTRY+0x96> + // 0000000000000092: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 96: 48 89 df movq %rbx, %rdi + // 99: 89 c3 movl %eax, %ebx + // 9b: ff 15 00 00 00 00 callq *(%rip) ## 0xa1 <__JIT_ENTRY+0xa1> + // 000000000000009d: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // a1: 89 d8 movl %ebx, %eax + // a3: 49 83 c5 e8 addq $-0x18, %r13 + // a7: 85 c0 testl %eax, %eax + // a9: 75 dd jne 0x88 <__JIT_ENTRY+0x88> + // ab: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // af: 48 83 c4 10 addq $0x10, %rsp + // b3: 5d popq %rbp + // b4: e9 00 00 00 00 jmp 0xb9 <__JIT_ENTRY+0xb9> + // 00000000000000b5: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[180] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0x75, 0xf8, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x8b, 0x75, 0xe8, 0x4d, 0x8b, 0x7d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xff, + 0x48, 0x89, 0xde, 0x4c, 0x89, 0xf2, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x16, 0xff, 0xc9, 0x41, 0x89, 0x0e, 0x75, 0x0f, + 0x4c, 0x89, 0xf7, 0x41, 0x89, 0xc6, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x89, 0xf0, 0x41, + 0x8b, 0x0f, 0x85, 0xc9, 0x78, 0x16, 0xff, 0xc9, + 0x41, 0x89, 0x0f, 0x75, 0x0f, 0x4c, 0x89, 0xff, + 0x41, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x89, 0xf0, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x16, + 0x49, 0x83, 0xc5, 0xe8, 0x85, 0xc0, 0x74, 0x23, + 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xd8, 0x49, 0x83, 0xc5, 0xe8, 0x85, + 0xc0, 0x75, 0xdd, 0x4c, 0x8b, 0x75, 0xf8, 0x48, + 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyObject_SetItem+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetItem); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + -0x4); + patch_32r(code + 0x92, state->instruction_starts[instruction->error_target] + -0x4); + patch_x86_64_32rx(code + 0x9d, (uintptr_t)data + -0x4); +} + +void +emit__STORE_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_DICT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 4: 48 8b 43 08 movq 0x8(%rbx), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyDict_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 55 pushq %rbp + // 16: 48 89 e5 movq %rsp, %rbp + // 19: 49 8b 55 e8 movq -0x18(%r13), %rdx + // 1d: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 48 89 df movq %rbx, %rdi + // 29: ff 15 00 00 00 00 callq *(%rip) ## 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_GOT __PyDict_SetItem_Take2@GOTPCREL + // 2f: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 35: 8b 0b movl (%rbx), %ecx + // 37: 85 c9 testl %ecx, %ecx + // 39: 78 13 js 0x4e <__JIT_ENTRY+0x4e> + // 3b: ff c9 decl %ecx + // 3d: 89 0b movl %ecx, (%rbx) + // 3f: 75 0d jne 0x4e <__JIT_ENTRY+0x4e> + // 41: 48 89 df movq %rbx, %rdi + // 44: 89 c3 movl %eax, %ebx + // 46: ff 15 00 00 00 00 callq *(%rip) ## 0x4c <__JIT_ENTRY+0x4c> + // 0000000000000048: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4c: 89 d8 movl %ebx, %eax + // 4e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 53: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5c: 85 c0 testl %eax, %eax + // 5e: 5d popq %rbp + // 5f: 0f 85 00 00 00 00 jne 0x65 <__JIT_ENTRY+0x65> + // 0000000000000061: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 0000000000000066: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[101] = { + 0x49, 0x8b, 0x5d, 0xf0, 0x48, 0x8b, 0x43, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, + 0xe5, 0x49, 0x8b, 0x55, 0xe8, 0x49, 0x8b, 0x75, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x13, 0xff, 0xc9, 0x89, 0x0b, 0x75, + 0x0d, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x5d, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyDict_SetItem_Take2+0x0 + // 10: &PyDict_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x10, (uintptr_t)&PyDict_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0xc); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + -0x4); + patch_32r(code + 0x61, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__STORE_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_LIST_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 4: 49 8b 47 08 movq 0x8(%r15), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 19: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x24 <__JIT_ENTRY+0x24> + // 0000000000000020: X86_64_RELOC_GOT _PyList_Type@GOTPCREL + // 24: 0f 85 00 00 00 00 jne 0x2a <__JIT_ENTRY+0x2a> + // 0000000000000026: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 2a: 49 8b 47 10 movq 0x10(%r15), %rax + // 2e: 48 83 e0 fb andq $-0x5, %rax + // 32: 48 83 f8 09 cmpq $0x9, %rax + // 36: 0f 83 00 00 00 00 jae 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 3c: 41 8b 47 18 movl 0x18(%r15), %eax + // 40: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 44: 0f 8e 00 00 00 00 jle 0x4a <__JIT_ENTRY+0x4a> + // 0000000000000046: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 4a: 55 pushq %rbp + // 4b: 48 89 e5 movq %rsp, %rbp + // 4e: 48 83 ec 10 subq $0x10, %rsp + // 52: 49 8b 4d e8 movq -0x18(%r13), %rcx + // 56: 49 83 c5 e8 addq $-0x18, %r13 + // 5a: 48 8b 53 18 movq 0x18(%rbx), %rdx + // 5e: 48 8b 3c c2 movq (%rdx,%rax,8), %rdi + // 62: 48 89 0c c2 movq %rcx, (%rdx,%rax,8) + // 66: 41 8b 07 movl (%r15), %eax + // 69: 85 c0 testl %eax, %eax + // 6b: 78 3c js 0xa9 <__JIT_ENTRY+0xa9> + // 6d: ff c8 decl %eax + // 6f: 41 89 07 movl %eax, (%r15) + // 72: 75 35 jne 0xa9 <__JIT_ENTRY+0xa9> + // 74: 48 89 7d f8 movq %rdi, -0x8(%rbp) + // 78: 48 8b 0d 00 00 00 00 movq (%rip), %rcx ## 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_GOT_LOAD __PyRuntime@GOTPCREL + // 7f: 48 8b 81 40 26 00 00 movq 0x2640(%rcx), %rax + // 86: 48 85 c0 testq %rax, %rax + // 89: 74 11 je 0x9c <__JIT_ENTRY+0x9c> + // 8b: 48 8b 91 48 26 00 00 movq 0x2648(%rcx), %rdx + // 92: 4c 89 ff movq %r15, %rdi + // 95: be 01 00 00 00 movl $0x1, %esi + // 9a: ff d0 callq *%rax + // 9c: 4c 89 ff movq %r15, %rdi + // 9f: ff 15 00 00 00 00 callq *(%rip) ## 0xa5 <__JIT_ENTRY+0xa5> + // 00000000000000a1: X86_64_RELOC_GOT __PyLong_ExactDealloc@GOTPCREL + // a5: 48 8b 7d f8 movq -0x8(%rbp), %rdi + // a9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // ae: 8b 03 movl (%rbx), %eax + // b0: 85 c0 testl %eax, %eax + // b2: 78 15 js 0xc9 <__JIT_ENTRY+0xc9> + // b4: ff c8 decl %eax + // b6: 89 03 movl %eax, (%rbx) + // b8: 75 0f jne 0xc9 <__JIT_ENTRY+0xc9> + // ba: 49 89 ff movq %rdi, %r15 + // bd: 48 89 df movq %rbx, %rdi + // c0: ff 15 00 00 00 00 callq *(%rip) ## 0xc6 <__JIT_ENTRY+0xc6> + // 00000000000000c2: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // c6: 4c 89 ff movq %r15, %rdi + // c9: 8b 07 movl (%rdi), %eax + // cb: 85 c0 testl %eax, %eax + // cd: 78 0c js 0xdb <__JIT_ENTRY+0xdb> + // cf: ff c8 decl %eax + // d1: 89 07 movl %eax, (%rdi) + // d3: 75 06 jne 0xdb <__JIT_ENTRY+0xdb> + // d5: ff 15 00 00 00 00 callq *(%rip) ## 0xdb <__JIT_ENTRY+0xdb> + // 00000000000000d7: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // db: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e0: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // e9: 48 83 c4 10 addq $0x10, %rsp + // ed: 5d popq %rbp + // ee: e9 00 00 00 00 jmp 0xf3 <__JIT_ENTRY+0xf3> + // 00000000000000ef: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[238] = { + 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, + 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, 0x83, + 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, 0x18, + 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, + 0xec, 0x10, 0x49, 0x8b, 0x4d, 0xe8, 0x49, 0x83, + 0xc5, 0xe8, 0x48, 0x8b, 0x53, 0x18, 0x48, 0x8b, + 0x3c, 0xc2, 0x48, 0x89, 0x0c, 0xc2, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x3c, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x75, 0x35, 0x48, 0x89, 0x7d, 0xf8, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x40, 0x26, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x48, 0x26, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x7d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x15, 0xff, 0xc8, 0x89, 0x03, + 0x75, 0x0f, 0x49, 0x89, 0xff, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xff, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyLong_ExactDealloc+0x0 + // 10: &_PyRuntime+0x0 + // 18: &PyList_Type+0x0 + // 20: &PyLong_Type+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&PyList_Type); + patch_64(data + 0x20, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x1c); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x14); + patch_32r(code + 0x26, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x38, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x46, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + -0x4); +} + +void +emit__SWAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SWAP.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // b: c1 e0 03 shll $0x3, %eax + // e: 4c 89 e9 movq %r13, %rcx + // 11: 48 29 c1 subq %rax, %rcx + // 14: 48 8b 01 movq (%rcx), %rax + // 17: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 1b: 48 89 11 movq %rdx, (%rcx) + // 1e: 49 89 45 f8 movq %rax, -0x8(%r13) + // 22: 5d popq %rbp + // 23: e9 00 00 00 00 jmp 0x28 <__JIT_ENTRY+0x28> + // 0000000000000024: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[35] = { + 0x55, 0x48, 0x89, 0xe5, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, + 0xe9, 0x48, 0x29, 0xc1, 0x48, 0x8b, 0x01, 0x49, + 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x11, 0x49, 0x89, + 0x45, 0xf8, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__TIER2_RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TIER2_RESUME_CHECK.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 46 18 movq 0x18(%r14), %rax + // 8: 84 c0 testb %al, %al + // a: 74 06 je 0x12 <__JIT_ENTRY+0x12> + // c: 5d popq %rbp + // d: e9 00 00 00 00 jmp 0x12 <__JIT_ENTRY+0x12> + // 000000000000000e: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 12: 5d popq %rbp + // 13: e9 00 00 00 00 jmp 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[19] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x46, 0x18, + 0x84, 0xc0, 0x74, 0x06, 0x5d, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x5d, + }; + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xe, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__TO_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 df movq %rbx, %rdi + // 10: ff 15 00 00 00 00 callq *(%rip) ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyObject_IsTrue@GOTPCREL + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0b movl (%rbx), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <__JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0b movl %ecx, (%rbx) + // 2e: 74 28 je 0x58 <__JIT_ENTRY+0x58> + // 30: 85 c0 testl %eax, %eax + // 32: 78 35 js 0x69 <__JIT_ENTRY+0x69> + // 34: 75 11 jne 0x47 <__JIT_ENTRY+0x47> + // 36: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x3d <__JIT_ENTRY+0x3d> + // 0000000000000039: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 3d: 49 89 45 f8 movq %rax, -0x8(%r13) + // 41: 5d popq %rbp + // 42: e9 00 00 00 00 jmp 0x47 <__JIT_ENTRY+0x47> + // 0000000000000043: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 47: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x4e <__JIT_ENTRY+0x4e> + // 000000000000004a: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 4e: 49 89 45 f8 movq %rax, -0x8(%r13) + // 52: 5d popq %rbp + // 53: e9 00 00 00 00 jmp 0x58 <__JIT_ENTRY+0x58> + // 0000000000000054: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 58: 48 89 df movq %rbx, %rdi + // 5b: 89 c3 movl %eax, %ebx + // 5d: ff 15 00 00 00 00 callq *(%rip) ## 0x63 <__JIT_ENTRY+0x63> + // 000000000000005f: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 63: 89 d8 movl %ebx, %eax + // 65: 85 c0 testl %eax, %eax + // 67: 79 cb jns 0x34 <__JIT_ENTRY+0x34> + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 5d popq %rbp + // 6e: e9 00 00 00 00 jmp 0x73 <__JIT_ENTRY+0x73> + // 000000000000006f: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[115] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x28, + 0x85, 0xc0, 0x78, 0x35, 0x75, 0x11, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x85, 0xc0, 0x79, + 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &PyObject_IsTrue+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&PyObject_IsTrue); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0xc); + patch_32r(code + 0x43, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x4); + patch_32r(code + 0x54, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + -0x4); + patch_32r(code + 0x6f, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__TO_BOOL_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_BOOL.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 40 08 movq 0x8(%rax), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0x13 <__JIT_ENTRY+0x13> + // 000000000000000f: X86_64_RELOC_GOT _PyBool_Type@GOTPCREL + // 13: 74 06 je 0x1b <__JIT_ENTRY+0x1b> + // 15: 5d popq %rbp + // 16: e9 00 00 00 00 jmp 0x1b <__JIT_ENTRY+0x1b> + // 0000000000000017: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 1b: 5d popq %rbp + // 1c: e9 00 00 00 00 jmp 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[28] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x5d, + }; + // 0: &PyBool_Type+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyBool_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x17, state->instruction_starts[instruction->jump_target] + -0x4); +} + +void +emit__TO_BOOL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_INT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 08 movq 0x8(%rdi), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyLong_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 8b 47 10 movl 0x10(%rdi), %eax + // 18: 83 e0 03 andl $0x3, %eax + // 1b: 83 f8 01 cmpl $0x1, %eax + // 1e: 75 10 jne 0x30 <__JIT_ENTRY+0x30> + // 20: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x27 <__JIT_ENTRY+0x27> + // 0000000000000023: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 27: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 2b: e9 00 00 00 00 jmp 0x30 <__JIT_ENTRY+0x30> + // 000000000000002c: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 30: 8b 07 movl (%rdi), %eax + // 32: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x39 <__JIT_ENTRY+0x39> + // 0000000000000035: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 39: 85 c0 testl %eax, %eax + // 3b: 78 06 js 0x43 <__JIT_ENTRY+0x43> + // 3d: ff c8 decl %eax + // 3f: 89 07 movl %eax, (%rdi) + // 41: 74 09 je 0x4c <__JIT_ENTRY+0x4c> + // 43: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 47: e9 00 00 00 00 jmp 0x4c <__JIT_ENTRY+0x4c> + // 0000000000000048: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 4c: 55 pushq %rbp + // 4d: 48 89 e5 movq %rsp, %rbp + // 50: ff 15 00 00 00 00 callq *(%rip) ## 0x56 <__JIT_ENTRY+0x56> + // 0000000000000052: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 56: 5d popq %rbp + // 57: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 5b: e9 00 00 00 00 jmp 0x60 <__JIT_ENTRY+0x60> + // 000000000000005c: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[91] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x47, 0x10, + 0x83, 0xe0, 0x03, 0x83, 0xf8, 0x01, 0x75, 0x10, + 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x07, 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x07, 0x74, 0x09, 0x49, 0x89, 0x5d, 0xf8, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x49, + 0x89, 0x5d, 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_TrueStruct+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &PyLong_Type+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&PyLong_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x14); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0xc); + patch_32r(code + 0x2c, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x4); + patch_32r(code + 0x48, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + -0x4); +} + +void +emit__TO_BOOL_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_LIST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 08 movq 0x8(%rdi), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyList_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 55 pushq %rbp + // 16: 48 89 e5 movq %rsp, %rbp + // 19: 48 8b 5f 10 movq 0x10(%rdi), %rbx + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <__JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 16 je 0x3f <__JIT_ENTRY+0x3f> + // 29: 48 85 db testq %rbx, %rbx + // 2c: 75 1c jne 0x4a <__JIT_ENTRY+0x4a> + // 2e: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x35 <__JIT_ENTRY+0x35> + // 0000000000000031: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: ff 15 00 00 00 00 callq *(%rip) ## 0x45 <__JIT_ENTRY+0x45> + // 0000000000000041: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 45: 48 85 db testq %rbx, %rbx + // 48: 74 e4 je 0x2e <__JIT_ENTRY+0x2e> + // 4a: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x51 <__JIT_ENTRY+0x51> + // 000000000000004d: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 51: 49 89 45 f8 movq %rax, -0x8(%r13) + // 55: 5d popq %rbp + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[86] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, + 0xe5, 0x48, 0x8b, 0x5f, 0x10, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x16, 0x48, 0x85, 0xdb, 0x75, 0x1c, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xdb, + 0x74, 0xe4, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x45, 0xf8, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: &PyList_Type+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)&PyList_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x14); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0xc); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + -0x4); +} + +void +emit__TO_BOOL_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_NONE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT __Py_NoneStruct@GOTPCREL + // f: 74 06 je 0x17 <__JIT_ENTRY+0x17> + // 11: 5d popq %rbp + // 12: e9 00 00 00 00 jmp 0x17 <__JIT_ENTRY+0x17> + // 0000000000000013: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 17: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x1e <__JIT_ENTRY+0x1e> + // 000000000000001a: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 1e: 49 89 45 f8 movq %rax, -0x8(%r13) + // 22: 5d popq %rbp + // 23: e9 00 00 00 00 jmp 0x28 <__JIT_ENTRY+0x28> + // 0000000000000024: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[35] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0xf8, 0x5d, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_NoneStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_32r(code + 0x13, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); +} + +void +emit__TO_BOOL_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_STR.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 08 movq 0x8(%rdi), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyUnicode_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: b8 e0 87 00 00 movl $0x87e0, %eax ## imm = 0x87E0 + // 1a: 48 03 05 00 00 00 00 addq (%rip), %rax ## 0x21 <__JIT_ENTRY+0x21> + // 000000000000001d: X86_64_RELOC_GOT __PyRuntime@GOTPCREL + // 21: 48 39 c7 cmpq %rax, %rdi + // 24: 74 1c je 0x42 <__JIT_ENTRY+0x42> + // 26: 8b 07 movl (%rdi), %eax + // 28: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x2f <__JIT_ENTRY+0x2f> + // 000000000000002b: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 2f: 85 c0 testl %eax, %eax + // 31: 78 06 js 0x39 <__JIT_ENTRY+0x39> + // 33: ff c8 decl %eax + // 35: 89 07 movl %eax, (%rdi) + // 37: 74 19 je 0x52 <__JIT_ENTRY+0x52> + // 39: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 3d: e9 00 00 00 00 jmp 0x42 <__JIT_ENTRY+0x42> + // 000000000000003e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 42: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x49 <__JIT_ENTRY+0x49> + // 0000000000000045: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // 49: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 4d: e9 00 00 00 00 jmp 0x52 <__JIT_ENTRY+0x52> + // 000000000000004e: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 52: 55 pushq %rbp + // 53: 48 89 e5 movq %rsp, %rbp + // 56: ff 15 00 00 00 00 callq *(%rip) ## 0x5c <__JIT_ENTRY+0x5c> + // 0000000000000058: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 5c: 5d popq %rbp + // 5d: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 61: e9 00 00 00 00 jmp 0x66 <__JIT_ENTRY+0x66> + // 0000000000000062: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[97] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xe0, 0x87, + 0x00, 0x00, 0x48, 0x03, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x39, 0xc7, 0x74, 0x1c, 0x8b, 0x07, + 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x19, 0x49, 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x5d, 0xf8, 0xe9, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x49, 0x89, 0x5d, + 0xf8, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: &_Py_TrueStruct+0x0 + // 18: &_PyRuntime+0x0 + // 20: &PyUnicode_Type+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + patch_64(data + 0x20, (uintptr_t)&PyUnicode_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x1c); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0xc); + patch_32r(code + 0x3e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0x4); + patch_32r(code + 0x4e, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); +} + +void +emit__UNARY_INVERT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_INVERT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 df movq %rbx, %rdi + // 10: ff 15 00 00 00 00 callq *(%rip) ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyNumber_Invert@GOTPCREL + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0b movl (%rbx), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <__JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0b movl %ecx, (%rbx) + // 2e: 74 0f je 0x3f <__JIT_ENTRY+0x3f> + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 1e je 0x53 <__JIT_ENTRY+0x53> + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: 48 89 df movq %rbx, %rdi + // 42: 48 89 c3 movq %rax, %rbx + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 48 89 d8 movq %rbx, %rax + // 4e: 48 85 c0 testq %rax, %rax + // 51: 75 e2 jne 0x35 <__JIT_ENTRY+0x35> + // 53: 49 83 c5 f8 addq $-0x8, %r13 + // 57: 5d popq %rbp + // 58: e9 00 00 00 00 jmp 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[93] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0f, + 0x48, 0x85, 0xc0, 0x74, 0x1e, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, + 0xc0, 0x75, 0xe2, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyNumber_Invert+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyNumber_Invert); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_32r(code + 0x59, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNARY_NEGATIVE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NEGATIVE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 df movq %rbx, %rdi + // 10: ff 15 00 00 00 00 callq *(%rip) ## 0x16 <__JIT_ENTRY+0x16> + // 0000000000000012: X86_64_RELOC_GOT _PyNumber_Negative@GOTPCREL + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0b movl (%rbx), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <__JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0b movl %ecx, (%rbx) + // 2e: 74 0f je 0x3f <__JIT_ENTRY+0x3f> + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 1e je 0x53 <__JIT_ENTRY+0x53> + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 5d popq %rbp + // 3a: e9 00 00 00 00 jmp 0x3f <__JIT_ENTRY+0x3f> + // 000000000000003b: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 3f: 48 89 df movq %rbx, %rdi + // 42: 48 89 c3 movq %rax, %rbx + // 45: ff 15 00 00 00 00 callq *(%rip) ## 0x4b <__JIT_ENTRY+0x4b> + // 0000000000000047: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4b: 48 89 d8 movq %rbx, %rax + // 4e: 48 85 c0 testq %rax, %rax + // 51: 75 e2 jne 0x35 <__JIT_ENTRY+0x35> + // 53: 49 83 c5 f8 addq $-0x8, %r13 + // 57: 5d popq %rbp + // 58: e9 00 00 00 00 jmp 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[93] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0f, + 0x48, 0x85, 0xc0, 0x74, 0x1e, 0x49, 0x89, 0x45, + 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, + 0xc0, 0x75, 0xe2, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyNumber_Negative+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyNumber_Negative); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_32r(code + 0x3b, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_32r(code + 0x59, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNARY_NOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NOT.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __Py_FalseStruct@GOTPCREL + // b: 49 39 45 f8 cmpq %rax, -0x8(%r13) + // f: 75 07 jne 0x18 <__JIT_ENTRY+0x18> + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x18 <__JIT_ENTRY+0x18> + // 0000000000000014: X86_64_RELOC_GOT_LOAD __Py_TrueStruct@GOTPCREL + // 18: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1c: 5d popq %rbp + // 1d: e9 00 00 00 00 jmp 0x22 <__JIT_ENTRY+0x22> + // 000000000000001e: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[29] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x39, 0x45, 0xf8, 0x75, + 0x07, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0xf8, 0x5d, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); +} + +void +emit__UNPACK_EX( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_EX.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 10 subq $0x10, %rsp + // 8: 4c 89 f7 movq %r14, %rdi + // b: 8b 05 00 00 00 00 movl (%rip), %eax ## 0x11 <__JIT_ENTRY+0x11> + // 000000000000000d: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 11: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 15: 0f b6 d8 movzbl %al, %ebx + // 18: 49 8d 54 dd 00 leaq (%r13,%rbx,8), %rdx + // 1d: 0f b6 cc movzbl %ah, %ecx + // 20: 4c 8d 04 ca leaq (%rdx,%rcx,8), %r8 + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // 2d: 4c 89 fe movq %r15, %rsi + // 30: 89 da movl %ebx, %edx + // 32: 48 89 4d f0 movq %rcx, -0x10(%rbp) + // 36: ff 15 00 00 00 00 callq *(%rip) ## 0x3c <__JIT_ENTRY+0x3c> + // 0000000000000038: X86_64_RELOC_GOT __PyEval_UnpackIterableStackRef@GOTPCREL + // 3c: 41 89 c6 movl %eax, %r14d + // 3f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 44: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4d: 41 8b 07 movl (%r15), %eax + // 50: 85 c0 testl %eax, %eax + // 52: 78 07 js 0x5b <__JIT_ENTRY+0x5b> + // 54: ff c8 decl %eax + // 56: 41 89 07 movl %eax, (%r15) + // 59: 74 1b je 0x76 <__JIT_ENTRY+0x76> + // 5b: 45 85 f6 testl %r14d, %r14d + // 5e: 74 24 je 0x84 <__JIT_ENTRY+0x84> + // 60: 03 5d f0 addl -0x10(%rbp), %ebx + // 63: 4d 8d 6c dd 00 leaq (%r13,%rbx,8), %r13 + // 68: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 6c: 48 83 c4 10 addq $0x10, %rsp + // 70: 5d popq %rbp + // 71: e9 00 00 00 00 jmp 0x76 <__JIT_ENTRY+0x76> + // 0000000000000072: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 76: 4c 89 ff movq %r15, %rdi + // 79: ff 15 00 00 00 00 callq *(%rip) ## 0x7f <__JIT_ENTRY+0x7f> + // 000000000000007b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 7f: 45 85 f6 testl %r14d, %r14d + // 82: 75 dc jne 0x60 <__JIT_ENTRY+0x60> + // 84: 49 83 c5 f8 addq $-0x8, %r13 + // 88: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // 8c: 48 83 c4 10 addq $0x10, %rsp + // 90: 5d popq %rbp + // 91: e9 00 00 00 00 jmp 0x96 <__JIT_ENTRY+0x96> + // 0000000000000092: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[150] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, + 0x4c, 0x89, 0xf7, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x7d, 0xf8, 0x0f, 0xb6, 0xd8, + 0x49, 0x8d, 0x54, 0xdd, 0x00, 0x0f, 0xb6, 0xcc, + 0x4c, 0x8d, 0x04, 0xca, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0x75, 0xf8, 0x4c, 0x89, 0xfe, + 0x89, 0xda, 0x48, 0x89, 0x4d, 0xf0, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, 0xc6, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, + 0x07, 0x74, 0x1b, 0x45, 0x85, 0xf6, 0x74, 0x24, + 0x03, 0x5d, 0xf0, 0x4d, 0x8d, 0x6c, 0xdd, 0x00, + 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x85, 0xf6, 0x75, 0xdc, 0x49, 0x83, 0xc5, 0xf8, + 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0x4); + patch_32r(code + 0x72, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + -0x4); + patch_32r(code + 0x92, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNPACK_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 ## 0xb <__JIT_ENTRY+0xb> + // 0000000000000007: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // b: 41 0f b7 d7 movzwl %r15w, %edx + // f: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 13: 4d 8d 44 d5 f8 leaq -0x8(%r13,%rdx,8), %r8 + // 18: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1d: 4c 89 f7 movq %r14, %rdi + // 20: 48 89 de movq %rbx, %rsi + // 23: b9 ff ff ff ff movl $0xffffffff, %ecx ## imm = 0xFFFFFFFF + // 28: ff 15 00 00 00 00 callq *(%rip) ## 0x2e <__JIT_ENTRY+0x2e> + // 000000000000002a: X86_64_RELOC_GOT __PyEval_UnpackIterableStackRef@GOTPCREL + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: 8b 0b movl (%rbx), %ecx + // 3e: 85 c9 testl %ecx, %ecx + // 40: 78 06 js 0x48 <__JIT_ENTRY+0x48> + // 42: ff c9 decl %ecx + // 44: 89 0b movl %ecx, (%rbx) + // 46: 74 13 je 0x5b <__JIT_ENTRY+0x5b> + // 48: 85 c0 testl %eax, %eax + // 4a: 74 20 je 0x6c <__JIT_ENTRY+0x6c> + // 4c: 41 0f b7 c7 movzwl %r15w, %eax + // 50: 4d 8d 6c c5 f8 leaq -0x8(%r13,%rax,8), %r13 + // 55: 5d popq %rbp + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5b: 48 89 df movq %rbx, %rdi + // 5e: 89 c3 movl %eax, %ebx + // 60: ff 15 00 00 00 00 callq *(%rip) ## 0x66 <__JIT_ENTRY+0x66> + // 0000000000000062: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 66: 89 d8 movl %ebx, %eax + // 68: 85 c0 testl %eax, %eax + // 6a: 75 e0 jne 0x4c <__JIT_ENTRY+0x4c> + // 6c: 49 83 c5 f8 addq $-0x8, %r13 + // 70: 5d popq %rbp + // 71: e9 00 00 00 00 jmp 0x76 <__JIT_ENTRY+0x76> + // 0000000000000072: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[118] = { + 0x55, 0x48, 0x89, 0xe5, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x0f, 0xb7, 0xd7, 0x49, + 0x8b, 0x5d, 0xf8, 0x4d, 0x8d, 0x44, 0xd5, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, + 0x48, 0x89, 0xde, 0xb9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x13, + 0x85, 0xc0, 0x74, 0x20, 0x41, 0x0f, 0xb7, 0xc7, + 0x4d, 0x8d, 0x6c, 0xc5, 0xf8, 0x5d, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, + 0x85, 0xc0, 0x75, 0xe0, 0x49, 0x83, 0xc5, 0xf8, + 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: OPARG + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_32r(code + 0x57, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)data + -0x4); + patch_32r(code + 0x72, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__UNPACK_SEQUENCE_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_LIST.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 08 movq 0x8(%rdi), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyList_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 48 8b 5f 10 movq 0x10(%rdi), %rbx + // 19: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 20: 48 39 c3 cmpq %rax, %rbx + // 23: 0f 85 00 00 00 00 jne 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 29: 55 pushq %rbp + // 2a: 48 89 e5 movq %rsp, %rbp + // 2d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 34: 66 85 c0 testw %ax, %ax + // 37: 74 3c je 0x75 <__JIT_ENTRY+0x75> + // 39: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 3d: 48 8b 4f 18 movq 0x18(%rdi), %rcx + // 41: 48 8d 53 01 leaq 0x1(%rbx), %rdx + // 45: eb 19 jmp 0x60 <__JIT_ENTRY+0x60> + // 47: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 50: 48 89 30 movq %rsi, (%rax) + // 53: 48 83 c0 08 addq $0x8, %rax + // 57: 48 ff ca decq %rdx + // 5a: 48 83 fa 01 cmpq $0x1, %rdx + // 5e: 76 15 jbe 0x75 <__JIT_ENTRY+0x75> + // 60: 48 8b 74 d1 f0 movq -0x10(%rcx,%rdx,8), %rsi + // 65: 44 8b 06 movl (%rsi), %r8d + // 68: 45 85 c0 testl %r8d, %r8d + // 6b: 78 e3 js 0x50 <__JIT_ENTRY+0x50> + // 6d: 41 ff c0 incl %r8d + // 70: 44 89 06 movl %r8d, (%rsi) + // 73: eb db jmp 0x50 <__JIT_ENTRY+0x50> + // 75: 8b 07 movl (%rdi), %eax + // 77: 85 c0 testl %eax, %eax + // 79: 78 06 js 0x81 <__JIT_ENTRY+0x81> + // 7b: ff c8 decl %eax + // 7d: 89 07 movl %eax, (%rdi) + // 7f: 74 0b je 0x8c <__JIT_ENTRY+0x8c> + // 81: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 86: 5d popq %rbp + // 87: e9 00 00 00 00 jmp 0x8c <__JIT_ENTRY+0x8c> + // 0000000000000088: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 8c: ff 15 00 00 00 00 callq *(%rip) ## 0x92 <__JIT_ENTRY+0x92> + // 000000000000008e: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 92: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 97: 5d popq %rbp + // 98: e9 00 00 00 00 jmp 0x9d <__JIT_ENTRY+0x9d> + // 0000000000000099: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[152] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5f, + 0x10, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x39, 0xc3, 0x0f, 0x85, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x3c, 0x49, 0x8d, 0x45, 0xf8, 0x48, 0x8b, 0x4f, + 0x18, 0x48, 0x8d, 0x53, 0x01, 0xeb, 0x19, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0x30, 0x48, 0x83, 0xc0, 0x08, 0x48, + 0xff, 0xca, 0x48, 0x83, 0xfa, 0x01, 0x76, 0x15, + 0x48, 0x8b, 0x74, 0xd1, 0xf0, 0x44, 0x8b, 0x06, + 0x45, 0x85, 0xc0, 0x78, 0xe3, 0x41, 0xff, 0xc0, + 0x44, 0x89, 0x06, 0xeb, 0xdb, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x0b, 0x4d, 0x8d, 0x6c, 0xdd, 0xf8, 0x5d, 0xe9, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8d, 0x6c, 0xdd, 0xf8, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyList_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyList_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0xc); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_32r(code + 0x25, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); + patch_32r(code + 0x88, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8e, (uintptr_t)data + -0x4); +} + +void +emit__UNPACK_SEQUENCE_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 08 movq 0x8(%rdi), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyTuple_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 48 8b 5f 10 movq 0x10(%rdi), %rbx + // 19: 0f b7 05 00 00 00 00 movzwl (%rip), %eax ## 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 20: 48 39 c3 cmpq %rax, %rbx + // 23: 0f 85 00 00 00 00 jne 0x29 <__JIT_ENTRY+0x29> + // 0000000000000025: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 29: 55 pushq %rbp + // 2a: 48 89 e5 movq %rsp, %rbp + // 2d: 48 8b 05 00 00 00 00 movq (%rip), %rax ## 0x34 <__JIT_ENTRY+0x34> + // 0000000000000030: X86_64_RELOC_GOT_LOAD __JIT_OPARG@GOTPCREL + // 34: 66 85 c0 testw %ax, %ax + // 37: 74 38 je 0x71 <__JIT_ENTRY+0x71> + // 39: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 3d: 48 8d 4b 01 leaq 0x1(%rbx), %rcx + // 41: eb 1d jmp 0x60 <__JIT_ENTRY+0x60> + // 43: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 50: 48 89 10 movq %rdx, (%rax) + // 53: 48 83 c0 08 addq $0x8, %rax + // 57: 48 ff c9 decq %rcx + // 5a: 48 83 f9 01 cmpq $0x1, %rcx + // 5e: 76 11 jbe 0x71 <__JIT_ENTRY+0x71> + // 60: 48 8b 54 cf 08 movq 0x8(%rdi,%rcx,8), %rdx + // 65: 8b 32 movl (%rdx), %esi + // 67: 85 f6 testl %esi, %esi + // 69: 78 e5 js 0x50 <__JIT_ENTRY+0x50> + // 6b: ff c6 incl %esi + // 6d: 89 32 movl %esi, (%rdx) + // 6f: eb df jmp 0x50 <__JIT_ENTRY+0x50> + // 71: 8b 07 movl (%rdi), %eax + // 73: 85 c0 testl %eax, %eax + // 75: 78 06 js 0x7d <__JIT_ENTRY+0x7d> + // 77: ff c8 decl %eax + // 79: 89 07 movl %eax, (%rdi) + // 7b: 74 0b je 0x88 <__JIT_ENTRY+0x88> + // 7d: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 82: 5d popq %rbp + // 83: e9 00 00 00 00 jmp 0x88 <__JIT_ENTRY+0x88> + // 0000000000000084: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 88: ff 15 00 00 00 00 callq *(%rip) ## 0x8e <__JIT_ENTRY+0x8e> + // 000000000000008a: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 8e: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 93: 5d popq %rbp + // 94: e9 00 00 00 00 jmp 0x99 <__JIT_ENTRY+0x99> + // 0000000000000095: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[148] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5f, + 0x10, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x39, 0xc3, 0x0f, 0x85, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x48, 0x89, 0xe5, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x38, 0x49, 0x8d, 0x45, 0xf8, 0x48, 0x8d, 0x4b, + 0x01, 0xeb, 0x1d, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0x10, 0x48, 0x83, 0xc0, 0x08, 0x48, + 0xff, 0xc9, 0x48, 0x83, 0xf9, 0x01, 0x76, 0x11, + 0x48, 0x8b, 0x54, 0xcf, 0x08, 0x8b, 0x32, 0x85, + 0xf6, 0x78, 0xe5, 0xff, 0xc6, 0x89, 0x32, 0xeb, + 0xdf, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x07, 0x74, 0x0b, 0x4d, 0x8d, 0x6c, + 0xdd, 0xf8, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8d, + 0x6c, 0xdd, 0xf8, 0x5d, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &PyTuple_Type+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0xc); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_32r(code + 0x25, state->instruction_starts[instruction->jump_target] + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); + patch_32r(code + 0x84, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + -0x4); +} + +void +emit__UNPACK_SEQUENCE_TWO_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TWO_TUPLE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 4: 48 8b 47 08 movq 0x8(%rdi), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax ## 0xf <__JIT_ENTRY+0xf> + // 000000000000000b: X86_64_RELOC_GOT _PyTuple_Type@GOTPCREL + // f: 0f 85 00 00 00 00 jne 0x15 <__JIT_ENTRY+0x15> + // 0000000000000011: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 15: 48 83 7f 10 02 cmpq $0x2, 0x10(%rdi) + // 1a: 0f 85 00 00 00 00 jne 0x20 <__JIT_ENTRY+0x20> + // 000000000000001c: X86_64_RELOC_BRANCH __JIT_JUMP_TARGET + // 20: 48 8b 5f 18 movq 0x18(%rdi), %rbx + // 24: 8b 03 movl (%rbx), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 04 js 0x2e <__JIT_ENTRY+0x2e> + // 2a: ff c0 incl %eax + // 2c: 89 03 movl %eax, (%rbx) + // 2e: 4c 8b 7f 20 movq 0x20(%rdi), %r15 + // 32: 41 8b 07 movl (%r15), %eax + // 35: 85 c0 testl %eax, %eax + // 37: 78 05 js 0x3e <__JIT_ENTRY+0x3e> + // 39: ff c0 incl %eax + // 3b: 41 89 07 movl %eax, (%r15) + // 3e: 8b 07 movl (%rdi), %eax + // 40: 85 c0 testl %eax, %eax + // 42: 78 06 js 0x4a <__JIT_ENTRY+0x4a> + // 44: ff c8 decl %eax + // 46: 89 07 movl %eax, (%rdi) + // 48: 74 11 je 0x5b <__JIT_ENTRY+0x5b> + // 4a: 4d 89 7d f8 movq %r15, -0x8(%r13) + // 4e: 49 89 5d 00 movq %rbx, (%r13) + // 52: 49 83 c5 08 addq $0x8, %r13 + // 56: e9 00 00 00 00 jmp 0x5b <__JIT_ENTRY+0x5b> + // 0000000000000057: X86_64_RELOC_BRANCH __JIT_CONTINUE + // 5b: 55 pushq %rbp + // 5c: 48 89 e5 movq %rsp, %rbp + // 5f: ff 15 00 00 00 00 callq *(%rip) ## 0x65 <__JIT_ENTRY+0x65> + // 0000000000000061: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 65: 5d popq %rbp + // 66: 4d 89 7d f8 movq %r15, -0x8(%r13) + // 6a: 49 89 5d 00 movq %rbx, (%r13) + // 6e: 49 83 c5 08 addq $0x8, %r13 + // 72: e9 00 00 00 00 jmp 0x77 <__JIT_ENTRY+0x77> + // 0000000000000073: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[114] = { + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0x7f, + 0x10, 0x02, 0x0f, 0x85, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x5f, 0x18, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x04, 0xff, 0xc0, 0x89, 0x03, 0x4c, 0x8b, + 0x7f, 0x20, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x05, 0xff, 0xc0, 0x41, 0x89, 0x07, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x11, 0x4d, 0x89, 0x7d, 0xf8, 0x49, 0x89, + 0x5d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x48, 0x89, 0xe5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x4d, 0x89, + 0x7d, 0xf8, 0x49, 0x89, 0x5d, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &PyTuple_Type+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&PyTuple_Type); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x4); + patch_32r(code + 0x11, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x1c, state->instruction_starts[instruction->jump_target] + -0x4); + patch_32r(code + 0x57, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + -0x4); +} + +void +emit__WITH_EXCEPT_START( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _WITH_EXCEPT_START.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 48 83 ec 40 subq $0x40, %rsp + // 8: 4c 89 75 f8 movq %r14, -0x8(%rbp) + // c: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 10: 49 8b 45 d8 movq -0x28(%r13), %rax + // 14: 48 89 45 e8 movq %rax, -0x18(%rbp) + // 18: 4d 8b 75 e0 movq -0x20(%r13), %r14 + // 1c: 49 8b 47 08 movq 0x8(%r15), %rax + // 20: 48 89 45 f0 movq %rax, -0x10(%rbp) + // 24: 4c 89 ff movq %r15, %rdi + // 27: ff 15 00 00 00 00 callq *(%rip) ## 0x2d <__JIT_ENTRY+0x2d> + // 0000000000000029: X86_64_RELOC_GOT _PyException_GetTraceback@GOTPCREL + // 2d: 48 85 c0 testq %rax, %rax + // 30: 74 24 je 0x56 <__JIT_ENTRY+0x56> + // 32: 48 89 c3 movq %rax, %rbx + // 35: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 3a: 8b 00 movl (%rax), %eax + // 3c: 85 c0 testl %eax, %eax + // 3e: 78 0f js 0x4f <__JIT_ENTRY+0x4f> + // 40: ff c8 decl %eax + // 42: 89 03 movl %eax, (%rbx) + // 44: 75 09 jne 0x4f <__JIT_ENTRY+0x4f> + // 46: 48 89 df movq %rbx, %rdi + // 49: ff 15 00 00 00 00 callq *(%rip) ## 0x4f <__JIT_ENTRY+0x4f> + // 000000000000004b: X86_64_RELOC_GOT __Py_Dealloc@GOTPCREL + // 4f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 54: eb 07 jmp 0x5d <__JIT_ENTRY+0x5d> + // 56: 48 8b 1d 00 00 00 00 movq (%rip), %rbx ## 0x5d <__JIT_ENTRY+0x5d> + // 0000000000000059: X86_64_RELOC_GOT_LOAD __Py_NoneStruct@GOTPCREL + // 5d: 48 c7 45 c0 00 00 00 00 movq $0x0, -0x40(%rbp) + // 65: 4c 89 75 c8 movq %r14, -0x38(%rbp) + // 69: 48 8d 75 d0 leaq -0x30(%rbp), %rsi + // 6d: 48 8b 45 f0 movq -0x10(%rbp), %rax + // 71: 48 89 45 d0 movq %rax, -0x30(%rbp) + // 75: 4c 89 7d d8 movq %r15, -0x28(%rbp) + // 79: 48 89 5d e0 movq %rbx, -0x20(%rbp) + // 7d: 48 b8 03 00 00 00 00 00 00 80 movabsq $-0x7ffffffffffffffd, %rax ## imm = 0x8000000000000003 + // 87: 48 8d 50 01 leaq 0x1(%rax), %rdx + // 8b: 31 c9 xorl %ecx, %ecx + // 8d: 4d 85 f6 testq %r14, %r14 + // 90: 0f 95 c1 setne %cl + // 93: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 98: 48 0f 44 d0 cmoveq %rax, %rdx + // 9c: c1 e1 03 shll $0x3, %ecx + // 9f: 48 29 ce subq %rcx, %rsi + // a2: 48 8b 7d e8 movq -0x18(%rbp), %rdi + // a6: 31 c9 xorl %ecx, %ecx + // a8: ff 15 00 00 00 00 callq *(%rip) ## 0xae <__JIT_ENTRY+0xae> + // 00000000000000aa: X86_64_RELOC_GOT _PyObject_Vectorcall@GOTPCREL + // ae: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // bc: 48 85 c0 testq %rax, %rax + // bf: 74 16 je 0xd7 <__JIT_ENTRY+0xd7> + // c1: 49 89 45 00 movq %rax, (%r13) + // c5: 49 83 c5 08 addq $0x8, %r13 + // c9: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // cd: 48 83 c4 40 addq $0x40, %rsp + // d1: 5d popq %rbp + // d2: e9 00 00 00 00 jmp 0xd7 <__JIT_ENTRY+0xd7> + // 00000000000000d3: X86_64_RELOC_BRANCH __JIT_CONTINUE + // d7: 4c 8b 75 f8 movq -0x8(%rbp), %r14 + // db: 48 83 c4 40 addq $0x40, %rsp + // df: 5d popq %rbp + // e0: e9 00 00 00 00 jmp 0xe5 <__JIT_ENTRY+0xe5> + // 00000000000000e1: X86_64_RELOC_BRANCH __JIT_ERROR_TARGET + const unsigned char code_body[229] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x40, + 0x4c, 0x89, 0x75, 0xf8, 0x4d, 0x8b, 0x7d, 0xf8, + 0x49, 0x8b, 0x45, 0xd8, 0x48, 0x89, 0x45, 0xe8, + 0x4d, 0x8b, 0x75, 0xe0, 0x49, 0x8b, 0x47, 0x08, + 0x48, 0x89, 0x45, 0xf0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x24, 0x48, 0x89, 0xc3, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x8b, 0x00, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0xeb, 0x07, 0x48, 0x8b, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x45, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x75, + 0xc8, 0x48, 0x8d, 0x75, 0xd0, 0x48, 0x8b, 0x45, + 0xf0, 0x48, 0x89, 0x45, 0xd0, 0x4c, 0x89, 0x7d, + 0xd8, 0x48, 0x89, 0x5d, 0xe0, 0x48, 0xb8, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x48, + 0x8d, 0x50, 0x01, 0x31, 0xc9, 0x4d, 0x85, 0xf6, + 0x0f, 0x95, 0xc1, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x0f, 0x44, 0xd0, 0xc1, 0xe1, 0x03, 0x48, + 0x29, 0xce, 0x48, 0x8b, 0x7d, 0xe8, 0x31, 0xc9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x16, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x4c, 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x40, 0x5d, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x40, 0x5d, + 0xe9, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_Vectorcall+0x0 + // 8: &_Py_NoneStruct+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &PyException_GetTraceback+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&PyException_GetTraceback); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + -0x4); + patch_32r(code + 0xd3, (uintptr_t)code + sizeof(code_body) + -0x4); + patch_32r(code + 0xe1, state->instruction_starts[instruction->error_target] + -0x4); +} + +void +emit__YIELD_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _YIELD_VALUE.o: file format mach-o 64-bit x86-64 + // + // Disassembly of section __TEXT,__text: + // + // 0000000000000000 <__JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 89 e5 movq %rsp, %rbp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 49 83 44 24 38 02 addq $0x2, 0x38(%r12) + // e: 49 83 c5 f8 addq $-0x8, %r13 + // 12: 0f b6 05 00 00 00 00 movzbl (%rip), %eax ## 0x19 <__JIT_ENTRY+0x19> + // 0000000000000015: X86_64_RELOC_GOT __JIT_OPARG@GOTPCREL + // 19: 04 fe addb $-0x2, %al + // 1b: 41 88 44 24 fb movb %al, -0x5(%r12) + // 20: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 25: 49 8b 44 24 e8 movq -0x18(%r12), %rax + // 2a: 49 89 46 78 movq %rax, 0x78(%r14) + // 2e: 49 c7 44 24 e8 00 00 00 00 movq $0x0, -0x18(%r12) + // 37: 41 ff 46 2c incl 0x2c(%r14) + // 3b: 49 8b 44 24 08 movq 0x8(%r12), %rax + // 40: 49 89 46 48 movq %rax, 0x48(%r14) + // 44: 49 c7 44 24 08 00 00 00 00 movq $0x0, 0x8(%r12) + // 4d: 4c 8b 68 40 movq 0x40(%rax), %r13 + // 51: 48 c7 40 40 00 00 00 00 movq $0x0, 0x40(%rax) + // 59: 49 89 4d 00 movq %rcx, (%r13) + // 5d: 49 83 c5 08 addq $0x8, %r13 + // 61: 49 89 c4 movq %rax, %r12 + // 64: 5d popq %rbp + // 65: e9 00 00 00 00 jmp 0x6a <__JIT_ENTRY+0x6a> + // 0000000000000066: X86_64_RELOC_BRANCH __JIT_CONTINUE + const unsigned char code_body[101] = { + 0x55, 0x48, 0x89, 0xe5, 0x49, 0x8b, 0x4d, 0xf8, + 0x49, 0x83, 0x44, 0x24, 0x38, 0x02, 0x49, 0x83, + 0xc5, 0xf8, 0x0f, 0xb6, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x04, 0xfe, 0x41, 0x88, 0x44, 0x24, 0xfb, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x44, + 0x24, 0xe8, 0x49, 0x89, 0x46, 0x78, 0x49, 0xc7, + 0x44, 0x24, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x41, + 0xff, 0x46, 0x2c, 0x49, 0x8b, 0x44, 0x24, 0x08, + 0x49, 0x89, 0x46, 0x48, 0x49, 0xc7, 0x44, 0x24, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x68, + 0x40, 0x48, 0xc7, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x4d, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x49, 0x89, 0xc4, 0x5d, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + -0x4); +} + +static_assert(SYMBOL_MASK_WORDS >= 1, "SYMBOL_MASK_WORDS too small"); + +typedef struct { + void (*emit)( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state); + size_t code_size; + size_t data_size; + symbol_mask trampoline_mask; +} StencilGroup; + +static const StencilGroup shim = {emit_shim, 43, 0, {0}}; + +static const StencilGroup stencil_groups[MAX_UOP_ID + 1] = { + [_BINARY_OP] = {emit__BINARY_OP, 159, 24, {0}}, + [_BINARY_OP_ADD_FLOAT] = {emit__BINARY_OP_ADD_FLOAT, 59, 8, {0}}, + [_BINARY_OP_ADD_INT] = {emit__BINARY_OP_ADD_INT, 207, 24, {0}}, + [_BINARY_OP_ADD_UNICODE] = {emit__BINARY_OP_ADD_UNICODE, 207, 24, {0}}, + [_BINARY_OP_EXTEND] = {emit__BINARY_OP_EXTEND, 119, 16, {0}}, + [_BINARY_OP_INPLACE_ADD_UNICODE] = {emit__BINARY_OP_INPLACE_ADD_UNICODE, 235, 32, {0}}, + [_BINARY_OP_MULTIPLY_FLOAT] = {emit__BINARY_OP_MULTIPLY_FLOAT, 59, 8, {0}}, + [_BINARY_OP_MULTIPLY_INT] = {emit__BINARY_OP_MULTIPLY_INT, 207, 24, {0}}, + [_BINARY_OP_SUBSCR_CHECK_FUNC] = {emit__BINARY_OP_SUBSCR_CHECK_FUNC, 116, 0, {0}}, + [_BINARY_OP_SUBSCR_DICT] = {emit__BINARY_OP_SUBSCR_DICT, 210, 32, {0}}, + [_BINARY_OP_SUBSCR_INIT_CALL] = {emit__BINARY_OP_SUBSCR_INIT_CALL, 177, 0, {0}}, + [_BINARY_OP_SUBSCR_LIST_INT] = {emit__BINARY_OP_SUBSCR_LIST_INT, 230, 40, {0}}, + [_BINARY_OP_SUBSCR_STR_INT] = {emit__BINARY_OP_SUBSCR_STR_INT, 378, 40, {0}}, + [_BINARY_OP_SUBSCR_TUPLE_INT] = {emit__BINARY_OP_SUBSCR_TUPLE_INT, 227, 40, {0}}, + [_BINARY_OP_SUBTRACT_FLOAT] = {emit__BINARY_OP_SUBTRACT_FLOAT, 59, 8, {0}}, + [_BINARY_OP_SUBTRACT_INT] = {emit__BINARY_OP_SUBTRACT_INT, 207, 24, {0}}, + [_BINARY_SLICE] = {emit__BINARY_SLICE, 191, 24, {0}}, + [_BUILD_LIST] = {emit__BUILD_LIST, 75, 16, {0}}, + [_BUILD_MAP] = {emit__BUILD_MAP, 250, 24, {0}}, + [_BUILD_SET] = {emit__BUILD_SET, 445, 32, {0}}, + [_BUILD_SLICE] = {emit__BUILD_SLICE, 227, 24, {0}}, + [_BUILD_STRING] = {emit__BUILD_STRING, 220, 32, {0}}, + [_BUILD_TUPLE] = {emit__BUILD_TUPLE, 75, 16, {0}}, + [_CALL_BUILTIN_CLASS] = {emit__CALL_BUILTIN_CLASS, 345, 16, {0}}, + [_CALL_BUILTIN_FAST] = {emit__CALL_BUILTIN_FAST, 360, 24, {0}}, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = {emit__CALL_BUILTIN_FAST_WITH_KEYWORDS, 360, 24, {0}}, + [_CALL_BUILTIN_O] = {emit__CALL_BUILTIN_O, 273, 24, {0}}, + [_CALL_INTRINSIC_1] = {emit__CALL_INTRINSIC_1, 110, 24, {0}}, + [_CALL_INTRINSIC_2] = {emit__CALL_INTRINSIC_2, 165, 24, {0}}, + [_CALL_ISINSTANCE] = {emit__CALL_ISINSTANCE, 333, 40, {0}}, + [_CALL_KW_NON_PY] = {emit__CALL_KW_NON_PY, 380, 24, {0}}, + [_CALL_LEN] = {emit__CALL_LEN, 299, 32, {0}}, + [_CALL_LIST_APPEND] = {emit__CALL_LIST_APPEND, 197, 16, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST] = {emit__CALL_METHOD_DESCRIPTOR_FAST, 362, 24, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 362, 24, {0}}, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = {emit__CALL_METHOD_DESCRIPTOR_NOARGS, 281, 24, {0}}, + [_CALL_METHOD_DESCRIPTOR_O] = {emit__CALL_METHOD_DESCRIPTOR_O, 366, 24, {0}}, + [_CALL_NON_PY_GENERAL] = {emit__CALL_NON_PY_GENERAL, 319, 24, {0}}, + [_CALL_STR_1] = {emit__CALL_STR_1, 120, 24, {0}}, + [_CALL_TUPLE_1] = {emit__CALL_TUPLE_1, 120, 24, {0}}, + [_CALL_TYPE_1] = {emit__CALL_TYPE_1, 115, 16, {0}}, + [_CHECK_AND_ALLOCATE_OBJECT] = {emit__CHECK_AND_ALLOCATE_OBJECT, 283, 40, {0}}, + [_CHECK_ATTR_CLASS] = {emit__CHECK_ATTR_CLASS, 47, 8, {0}}, + [_CHECK_ATTR_METHOD_LAZY_DICT] = {emit__CHECK_ATTR_METHOD_LAZY_DICT, 30, 8, {0}}, + [_CHECK_ATTR_MODULE_PUSH_KEYS] = {emit__CHECK_ATTR_MODULE_PUSH_KEYS, 74, 16, {0}}, + [_CHECK_ATTR_WITH_HINT] = {emit__CHECK_ATTR_WITH_HINT, 37, 0, {0}}, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 61, 16, {0}}, + [_CHECK_EG_MATCH] = {emit__CHECK_EG_MATCH, 346, 40, {0}}, + [_CHECK_EXC_MATCH] = {emit__CHECK_EXC_MATCH, 186, 40, {0}}, + [_CHECK_FUNCTION] = {emit__CHECK_FUNCTION, 35, 8, {0}}, + [_CHECK_FUNCTION_EXACT_ARGS] = {emit__CHECK_FUNCTION_EXACT_ARGS, 63, 8, {0}}, + [_CHECK_FUNCTION_VERSION] = {emit__CHECK_FUNCTION_VERSION, 65, 24, {0}}, + [_CHECK_FUNCTION_VERSION_INLINE] = {emit__CHECK_FUNCTION_VERSION_INLINE, 37, 16, {0}}, + [_CHECK_FUNCTION_VERSION_KW] = {emit__CHECK_FUNCTION_VERSION_KW, 65, 24, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE] = {emit__CHECK_IS_NOT_PY_CALLABLE, 60, 24, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = {emit__CHECK_IS_NOT_PY_CALLABLE_KW, 60, 24, {0}}, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = {emit__CHECK_MANAGED_OBJECT_HAS_VALUES, 35, 0, {0}}, + [_CHECK_METHOD_VERSION] = {emit__CHECK_METHOD_VERSION, 89, 32, {0}}, + [_CHECK_METHOD_VERSION_KW] = {emit__CHECK_METHOD_VERSION_KW, 95, 32, {0}}, + [_CHECK_PEP_523] = {emit__CHECK_PEP_523, 25, 0, {0}}, + [_CHECK_PERIODIC] = {emit__CHECK_PERIODIC, 58, 8, {0}}, + [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = {emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM, 73, 16, {0}}, + [_CHECK_STACK_SPACE] = {emit__CHECK_STACK_SPACE, 79, 8, {0}}, + [_CHECK_STACK_SPACE_OPERAND] = {emit__CHECK_STACK_SPACE_OPERAND, 56, 8, {0}}, + [_CHECK_VALIDITY] = {emit__CHECK_VALIDITY, 24, 8, {0}}, + [_CHECK_VALIDITY_AND_SET_IP] = {emit__CHECK_VALIDITY_AND_SET_IP, 36, 16, {0}}, + [_COMPARE_OP] = {emit__COMPARE_OP, 285, 48, {0}}, + [_COMPARE_OP_FLOAT] = {emit__COMPARE_OP_FLOAT, 248, 40, {0}}, + [_COMPARE_OP_INT] = {emit__COMPARE_OP_INT, 316, 40, {0}}, + [_COMPARE_OP_STR] = {emit__COMPARE_OP_STR, 204, 48, {0}}, + [_CONTAINS_OP] = {emit__CONTAINS_OP, 176, 40, {0}}, + [_CONTAINS_OP_DICT] = {emit__CONTAINS_OP_DICT, 187, 48, {0}}, + [_CONTAINS_OP_SET] = {emit__CONTAINS_OP_SET, 214, 56, {0}}, + [_CONVERT_VALUE] = {emit__CONVERT_VALUE, 124, 24, {0}}, + [_COPY] = {emit__COPY, 42, 8, {0}}, + [_COPY_FREE_VARS] = {emit__COPY_FREE_VARS, 166, 8, {0}}, + [_CREATE_INIT_FRAME] = {emit__CREATE_INIT_FRAME, 286, 40, {0}}, + [_DELETE_ATTR] = {emit__DELETE_ATTR, 104, 24, {0}}, + [_DELETE_DEREF] = {emit__DELETE_DEREF, 136, 24, {0}}, + [_DELETE_FAST] = {emit__DELETE_FAST, 165, 120, {0}}, + [_DELETE_GLOBAL] = {emit__DELETE_GLOBAL, 131, 64, {0}}, + [_DELETE_NAME] = {emit__DELETE_NAME, 172, 104, {0}}, + [_DELETE_SUBSCR] = {emit__DELETE_SUBSCR, 139, 16, {0}}, + [_DEOPT] = {emit__DEOPT, 45, 16, {0}}, + [_DICT_MERGE] = {emit__DICT_MERGE, 192, 32, {0}}, + [_DICT_UPDATE] = {emit__DICT_UPDATE, 245, 96, {0}}, + [_END_FOR] = {emit__END_FOR, 69, 8, {0}}, + [_END_SEND] = {emit__END_SEND, 51, 8, {0}}, + [_ERROR_POP_N] = {emit__ERROR_POP_N, 52, 16, {0}}, + [_EXIT_INIT_CHECK] = {emit__EXIT_INIT_CHECK, 79, 72, {0}}, + [_EXIT_TRACE] = {emit__EXIT_TRACE, 451, 32, {0}}, + [_EXPAND_METHOD] = {emit__EXPAND_METHOD, 131, 16, {0}}, + [_EXPAND_METHOD_KW] = {emit__EXPAND_METHOD_KW, 131, 16, {0}}, + [_FATAL_ERROR] = {emit__FATAL_ERROR, 24, 48, {0}}, + [_FORMAT_SIMPLE] = {emit__FORMAT_SIMPLE, 149, 24, {0}}, + [_FORMAT_WITH_SPEC] = {emit__FORMAT_WITH_SPEC, 148, 16, {0}}, + [_FOR_ITER_GEN_FRAME] = {emit__FOR_ITER_GEN_FRAME, 110, 24, {0}}, + [_FOR_ITER_TIER_TWO] = {emit__FOR_ITER_TIER_TWO, 171, 32, {0}}, + [_GET_AITER] = {emit__GET_AITER, 326, 184, {0}}, + [_GET_ANEXT] = {emit__GET_ANEXT, 58, 8, {0}}, + [_GET_AWAITABLE] = {emit__GET_AWAITABLE, 100, 24, {0}}, + [_GET_ITER] = {emit__GET_ITER, 93, 16, {0}}, + [_GET_LEN] = {emit__GET_LEN, 72, 16, {0}}, + [_GET_YIELD_FROM_ITER] = {emit__GET_YIELD_FROM_ITER, 194, 120, {0}}, + [_GUARD_BINARY_OP_EXTEND] = {emit__GUARD_BINARY_OP_EXTEND, 57, 8, {0}}, + [_GUARD_BOTH_FLOAT] = {emit__GUARD_BOTH_FLOAT, 45, 8, {0}}, + [_GUARD_BOTH_INT] = {emit__GUARD_BOTH_INT, 45, 8, {0}}, + [_GUARD_BOTH_UNICODE] = {emit__GUARD_BOTH_UNICODE, 45, 8, {0}}, + [_GUARD_BUILTINS_VERSION_PUSH_KEYS] = {emit__GUARD_BUILTINS_VERSION_PUSH_KEYS, 58, 16, {0}}, + [_GUARD_DORV_NO_DICT] = {emit__GUARD_DORV_NO_DICT, 37, 0, {0}}, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = {emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 35, 0, {0}}, + [_GUARD_GLOBALS_VERSION] = {emit__GUARD_GLOBALS_VERSION, 50, 16, {0}}, + [_GUARD_GLOBALS_VERSION_PUSH_KEYS] = {emit__GUARD_GLOBALS_VERSION_PUSH_KEYS, 58, 16, {0}}, + [_GUARD_IS_FALSE_POP] = {emit__GUARD_IS_FALSE_POP, 28, 8, {0}}, + [_GUARD_IS_NONE_POP] = {emit__GUARD_IS_NONE_POP, 87, 16, {0}}, + [_GUARD_IS_NOT_NONE_POP] = {emit__GUARD_IS_NOT_NONE_POP, 96, 16, {0}}, + [_GUARD_IS_TRUE_POP] = {emit__GUARD_IS_TRUE_POP, 28, 8, {0}}, + [_GUARD_KEYS_VERSION] = {emit__GUARD_KEYS_VERSION, 42, 8, {0}}, + [_GUARD_NOS_FLOAT] = {emit__GUARD_NOS_FLOAT, 28, 8, {0}}, + [_GUARD_NOS_INT] = {emit__GUARD_NOS_INT, 28, 8, {0}}, + [_GUARD_NOT_EXHAUSTED_LIST] = {emit__GUARD_NOT_EXHAUSTED_LIST, 53, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_RANGE] = {emit__GUARD_NOT_EXHAUSTED_RANGE, 27, 0, {0}}, + [_GUARD_NOT_EXHAUSTED_TUPLE] = {emit__GUARD_NOT_EXHAUSTED_TUPLE, 39, 0, {0}}, + [_GUARD_TOS_FLOAT] = {emit__GUARD_TOS_FLOAT, 28, 8, {0}}, + [_GUARD_TOS_INT] = {emit__GUARD_TOS_INT, 28, 8, {0}}, + [_GUARD_TYPE_VERSION] = {emit__GUARD_TYPE_VERSION, 38, 8, {0}}, + [_GUARD_TYPE_VERSION_AND_LOCK] = {emit__GUARD_TYPE_VERSION_AND_LOCK, 38, 8, {0}}, + [_IMPORT_FROM] = {emit__IMPORT_FROM, 81, 16, {0}}, + [_IMPORT_NAME] = {emit__IMPORT_NAME, 174, 24, {0}}, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS, 131, 16, {0}}, + [_INIT_CALL_PY_EXACT_ARGS] = {emit__INIT_CALL_PY_EXACT_ARGS, 513, 8, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_0] = {emit__INIT_CALL_PY_EXACT_ARGS_0, 196, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_1] = {emit__INIT_CALL_PY_EXACT_ARGS_1, 198, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_2] = {emit__INIT_CALL_PY_EXACT_ARGS_2, 207, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_3] = {emit__INIT_CALL_PY_EXACT_ARGS_3, 216, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_4] = {emit__INIT_CALL_PY_EXACT_ARGS_4, 225, 0, {0}}, + [_IS_NONE] = {emit__IS_NONE, 72, 32, {0}}, + [_IS_OP] = {emit__IS_OP, 115, 32, {0}}, + [_ITER_CHECK_LIST] = {emit__ITER_CHECK_LIST, 28, 8, {0}}, + [_ITER_CHECK_RANGE] = {emit__ITER_CHECK_RANGE, 28, 8, {0}}, + [_ITER_CHECK_TUPLE] = {emit__ITER_CHECK_TUPLE, 28, 8, {0}}, + [_ITER_NEXT_LIST] = {emit__ITER_NEXT_LIST, 51, 0, {0}}, + [_ITER_NEXT_RANGE] = {emit__ITER_NEXT_RANGE, 58, 8, {0}}, + [_ITER_NEXT_TUPLE] = {emit__ITER_NEXT_TUPLE, 48, 0, {0}}, + [_JUMP_TO_TOP] = {emit__JUMP_TO_TOP, 10, 0, {0}}, + [_LIST_APPEND] = {emit__LIST_APPEND, 87, 16, {0}}, + [_LIST_EXTEND] = {emit__LIST_EXTEND, 275, 112, {0}}, + [_LOAD_ATTR] = {emit__LOAD_ATTR, 253, 32, {0}}, + [_LOAD_ATTR_CLASS] = {emit__LOAD_ATTR_CLASS, 57, 16, {0}}, + [_LOAD_ATTR_INSTANCE_VALUE] = {emit__LOAD_ATTR_INSTANCE_VALUE, 99, 16, {0}}, + [_LOAD_ATTR_METHOD_LAZY_DICT] = {emit__LOAD_ATTR_METHOD_LAZY_DICT, 38, 8, {0}}, + [_LOAD_ATTR_METHOD_NO_DICT] = {emit__LOAD_ATTR_METHOD_NO_DICT, 38, 8, {0}}, + [_LOAD_ATTR_METHOD_WITH_VALUES] = {emit__LOAD_ATTR_METHOD_WITH_VALUES, 38, 8, {0}}, + [_LOAD_ATTR_MODULE] = {emit__LOAD_ATTR_MODULE, 97, 16, {0}}, + [_LOAD_ATTR_MODULE_FROM_KEYS] = {emit__LOAD_ATTR_MODULE_FROM_KEYS, 129, 16, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 48, 16, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 48, 16, {0}}, + [_LOAD_ATTR_PROPERTY_FRAME] = {emit__LOAD_ATTR_PROPERTY_FRAME, 245, 8, {0}}, + [_LOAD_ATTR_SLOT] = {emit__LOAD_ATTR_SLOT, 70, 16, {0}}, + [_LOAD_ATTR_WITH_HINT] = {emit__LOAD_ATTR_WITH_HINT, 168, 24, {0}}, + [_LOAD_BUILD_CLASS] = {emit__LOAD_BUILD_CLASS, 140, 64, {0}}, + [_LOAD_COMMON_CONSTANT] = {emit__LOAD_COMMON_CONSTANT, 44, 24, {0}}, + [_LOAD_CONST_IMMORTAL] = {emit__LOAD_CONST_IMMORTAL, 33, 8, {0}}, + [_LOAD_CONST_INLINE] = {emit__LOAD_CONST_INLINE, 30, 8, {0}}, + [_LOAD_CONST_INLINE_BORROW] = {emit__LOAD_CONST_INLINE_BORROW, 20, 8, {0}}, + [_LOAD_CONST_MORTAL] = {emit__LOAD_CONST_MORTAL, 43, 8, {0}}, + [_LOAD_DEREF] = {emit__LOAD_DEREF, 93, 16, {0}}, + [_LOAD_FAST] = {emit__LOAD_FAST, 35, 8, {0}}, + [_LOAD_FAST_0] = {emit__LOAD_FAST_0, 28, 0, {0}}, + [_LOAD_FAST_1] = {emit__LOAD_FAST_1, 28, 0, {0}}, + [_LOAD_FAST_2] = {emit__LOAD_FAST_2, 28, 0, {0}}, + [_LOAD_FAST_3] = {emit__LOAD_FAST_3, 28, 0, {0}}, + [_LOAD_FAST_4] = {emit__LOAD_FAST_4, 28, 0, {0}}, + [_LOAD_FAST_5] = {emit__LOAD_FAST_5, 28, 0, {0}}, + [_LOAD_FAST_6] = {emit__LOAD_FAST_6, 31, 0, {0}}, + [_LOAD_FAST_7] = {emit__LOAD_FAST_7, 31, 0, {0}}, + [_LOAD_FAST_AND_CLEAR] = {emit__LOAD_FAST_AND_CLEAR, 34, 8, {0}}, + [_LOAD_FAST_CHECK] = {emit__LOAD_FAST_CHECK, 121, 112, {0}}, + [_LOAD_FROM_DICT_OR_DEREF] = {emit__LOAD_FROM_DICT_OR_DEREF, 240, 32, {0}}, + [_LOAD_GLOBAL] = {emit__LOAD_GLOBAL, 90, 16, {0}}, + [_LOAD_GLOBAL_BUILTINS] = {emit__LOAD_GLOBAL_BUILTINS, 78, 8, {0}}, + [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = {emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS, 73, 8, {0}}, + [_LOAD_GLOBAL_MODULE] = {emit__LOAD_GLOBAL_MODULE, 78, 8, {0}}, + [_LOAD_GLOBAL_MODULE_FROM_KEYS] = {emit__LOAD_GLOBAL_MODULE_FROM_KEYS, 73, 8, {0}}, + [_LOAD_LOCALS] = {emit__LOAD_LOCALS, 88, 32, {0}}, + [_LOAD_NAME] = {emit__LOAD_NAME, 80, 16, {0}}, + [_LOAD_SMALL_INT] = {emit__LOAD_SMALL_INT, 39, 16, {0}}, + [_LOAD_SMALL_INT_0] = {emit__LOAD_SMALL_INT_0, 25, 8, {0}}, + [_LOAD_SMALL_INT_1] = {emit__LOAD_SMALL_INT_1, 25, 8, {0}}, + [_LOAD_SMALL_INT_2] = {emit__LOAD_SMALL_INT_2, 25, 8, {0}}, + [_LOAD_SMALL_INT_3] = {emit__LOAD_SMALL_INT_3, 25, 8, {0}}, + [_LOAD_SPECIAL] = {emit__LOAD_SPECIAL, 212, 40, {0}}, + [_LOAD_SUPER_ATTR_ATTR] = {emit__LOAD_SUPER_ATTR_ATTR, 241, 32, {0}}, + [_LOAD_SUPER_ATTR_METHOD] = {emit__LOAD_SUPER_ATTR_METHOD, 314, 40, {0}}, + [_MAKE_CALLARGS_A_TUPLE] = {emit__MAKE_CALLARGS_A_TUPLE, 178, 32, {0}}, + [_MAKE_CELL] = {emit__MAKE_CELL, 112, 24, {0}}, + [_MAKE_FUNCTION] = {emit__MAKE_FUNCTION, 127, 24, {0}}, + [_MAKE_WARM] = {emit__MAKE_WARM, 44, 8, {0}}, + [_MAP_ADD] = {emit__MAP_ADD, 74, 16, {0}}, + [_MATCH_CLASS] = {emit__MATCH_CLASS, 222, 32, {0}}, + [_MATCH_KEYS] = {emit__MATCH_KEYS, 65, 8, {0}}, + [_MATCH_MAPPING] = {emit__MATCH_MAPPING, 58, 16, {0}}, + [_MATCH_SEQUENCE] = {emit__MATCH_SEQUENCE, 58, 16, {0}}, + [_MAYBE_EXPAND_METHOD] = {emit__MAYBE_EXPAND_METHOD, 159, 24, {0}}, + [_MAYBE_EXPAND_METHOD_KW] = {emit__MAYBE_EXPAND_METHOD_KW, 162, 24, {0}}, + [_NOP] = {emit__NOP, 5, 0, {0}}, + [_POP_EXCEPT] = {emit__POP_EXCEPT, 101, 16, {0}}, + [_POP_TOP] = {emit__POP_TOP, 39, 8, {0}}, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = {emit__POP_TOP_LOAD_CONST_INLINE_BORROW, 65, 16, {0}}, + [_PUSH_EXC_INFO] = {emit__PUSH_EXC_INFO, 53, 8, {0}}, + [_PUSH_FRAME] = {emit__PUSH_FRAME, 41, 0, {0}}, + [_PUSH_NULL] = {emit__PUSH_NULL, 17, 0, {0}}, + [_PUSH_NULL_CONDITIONAL] = {emit__PUSH_NULL_CONDITIONAL, 34, 8, {0}}, + [_PY_FRAME_GENERAL] = {emit__PY_FRAME_GENERAL, 187, 16, {0}}, + [_PY_FRAME_KW] = {emit__PY_FRAME_KW, 231, 24, {0}}, + [_REPLACE_WITH_TRUE] = {emit__REPLACE_WITH_TRUE, 55, 16, {0}}, + [_RESUME_CHECK] = {emit__RESUME_CHECK, 33, 0, {0}}, + [_RETURN_GENERATOR] = {emit__RETURN_GENERATOR, 479, 16, {0}}, + [_RETURN_VALUE] = {emit__RETURN_VALUE, 65, 8, {0}}, + [_SAVE_RETURN_OFFSET] = {emit__SAVE_RETURN_OFFSET, 18, 8, {0}}, + [_SEND_GEN_FRAME] = {emit__SEND_GEN_FRAME, 118, 24, {0}}, + [_SETUP_ANNOTATIONS] = {emit__SETUP_ANNOTATIONS, 280, 104, {0}}, + [_SET_ADD] = {emit__SET_ADD, 106, 24, {0}}, + [_SET_FUNCTION_ATTRIBUTE] = {emit__SET_FUNCTION_ATTRIBUTE, 46, 16, {0}}, + [_SET_IP] = {emit__SET_IP, 17, 8, {0}}, + [_SET_UPDATE] = {emit__SET_UPDATE, 111, 24, {0}}, + [_START_EXECUTOR] = {emit__START_EXECUTOR, 84, 8, {0}}, + [_STORE_ATTR] = {emit__STORE_ATTR, 159, 24, {0}}, + [_STORE_ATTR_INSTANCE_VALUE] = {emit__STORE_ATTR_INSTANCE_VALUE, 176, 16, {0}}, + [_STORE_ATTR_SLOT] = {emit__STORE_ATTR_SLOT, 115, 16, {0}}, + [_STORE_ATTR_WITH_HINT] = {emit__STORE_ATTR_WITH_HINT, 257, 32, {0}}, + [_STORE_DEREF] = {emit__STORE_DEREF, 98, 16, {0}}, + [_STORE_FAST] = {emit__STORE_FAST, 91, 16, {0}}, + [_STORE_FAST_0] = {emit__STORE_FAST_0, 84, 8, {0}}, + [_STORE_FAST_1] = {emit__STORE_FAST_1, 84, 8, {0}}, + [_STORE_FAST_2] = {emit__STORE_FAST_2, 84, 8, {0}}, + [_STORE_FAST_3] = {emit__STORE_FAST_3, 84, 8, {0}}, + [_STORE_FAST_4] = {emit__STORE_FAST_4, 84, 8, {0}}, + [_STORE_FAST_5] = {emit__STORE_FAST_5, 84, 8, {0}}, + [_STORE_FAST_6] = {emit__STORE_FAST_6, 90, 8, {0}}, + [_STORE_FAST_7] = {emit__STORE_FAST_7, 90, 8, {0}}, + [_STORE_GLOBAL] = {emit__STORE_GLOBAL, 109, 24, {0}}, + [_STORE_NAME] = {emit__STORE_NAME, 231, 88, {0}}, + [_STORE_SLICE] = {emit__STORE_SLICE, 234, 24, {0}}, + [_STORE_SUBSCR] = {emit__STORE_SUBSCR, 180, 16, {0}}, + [_STORE_SUBSCR_DICT] = {emit__STORE_SUBSCR_DICT, 101, 24, {0}}, + [_STORE_SUBSCR_LIST_INT] = {emit__STORE_SUBSCR_LIST_INT, 238, 40, {0}}, + [_SWAP] = {emit__SWAP, 35, 8, {0}}, + [_TIER2_RESUME_CHECK] = {emit__TIER2_RESUME_CHECK, 19, 0, {0}}, + [_TO_BOOL] = {emit__TO_BOOL, 115, 32, {0}}, + [_TO_BOOL_BOOL] = {emit__TO_BOOL_BOOL, 28, 8, {0}}, + [_TO_BOOL_INT] = {emit__TO_BOOL_INT, 91, 32, {0}}, + [_TO_BOOL_LIST] = {emit__TO_BOOL_LIST, 86, 32, {0}}, + [_TO_BOOL_NONE] = {emit__TO_BOOL_NONE, 35, 16, {0}}, + [_TO_BOOL_STR] = {emit__TO_BOOL_STR, 97, 40, {0}}, + [_UNARY_INVERT] = {emit__UNARY_INVERT, 93, 16, {0}}, + [_UNARY_NEGATIVE] = {emit__UNARY_NEGATIVE, 93, 16, {0}}, + [_UNARY_NOT] = {emit__UNARY_NOT, 29, 16, {0}}, + [_UNPACK_EX] = {emit__UNPACK_EX, 150, 24, {0}}, + [_UNPACK_SEQUENCE] = {emit__UNPACK_SEQUENCE, 118, 24, {0}}, + [_UNPACK_SEQUENCE_LIST] = {emit__UNPACK_SEQUENCE_LIST, 152, 24, {0}}, + [_UNPACK_SEQUENCE_TUPLE] = {emit__UNPACK_SEQUENCE_TUPLE, 148, 24, {0}}, + [_UNPACK_SEQUENCE_TWO_TUPLE] = {emit__UNPACK_SEQUENCE_TWO_TUPLE, 114, 16, {0}}, + [_WITH_EXCEPT_START] = {emit__WITH_EXCEPT_START, 229, 32, {0}}, + [_YIELD_VALUE] = {emit__YIELD_VALUE, 101, 8, {0}}, +}; + +static const void * const symbols_map[1] = { + 0 +}; diff --git a/Tools/jit/stencils/x86_64-pc-linux-gnu.h b/Tools/jit/stencils/x86_64-pc-linux-gnu.h new file mode 100644 index 00000000000000..50af1b3bb1a098 --- /dev/null +++ b/Tools/jit/stencils/x86_64-pc-linux-gnu.h @@ -0,0 +1,23194 @@ +void +emit_shim( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // shim.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 41 57 pushq %r15 + // 2: 41 56 pushq %r14 + // 4: 41 55 pushq %r13 + // 6: 41 54 pushq %r12 + // 8: 53 pushq %rbx + // 9: 49 89 fc movq %rdi, %r12 + // c: 49 89 f5 movq %rsi, %r13 + // f: 49 89 d6 movq %rdx, %r14 + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 18: 5b popq %rbx + // 19: 41 5c popq %r12 + // 1b: 41 5d popq %r13 + // 1d: 41 5e popq %r14 + // 1f: 41 5f popq %r15 + // 21: c3 retq + const unsigned char code_body[34] = { + 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, + 0x53, 0x49, 0x89, 0xfc, 0x49, 0x89, 0xf5, 0x49, + 0x89, 0xd6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x41, 0x5c, 0x41, 0x5d, 0x41, 0x5e, 0x41, + 0x5f, 0xc3, + }; + // 0: CONTINUE + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); +} + +void +emit__BINARY_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 15: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_REX_GOTPCRELX _PyEval_BinaryOps-0x4 + // 1c: 48 89 ef movq %rbp, %rdi + // 1f: 48 89 de movq %rbx, %rsi + // 22: ff 14 c1 callq *(%rcx,%rax,8) + // 25: 49 89 c7 movq %rax, %r15 + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: 8b 45 00 movl (%rbp), %eax + // 39: 85 c0 testl %eax, %eax + // 3b: 78 10 js 0x4d <_JIT_ENTRY+0x4d> + // 3d: ff c8 decl %eax + // 3f: 89 45 00 movl %eax, (%rbp) + // 42: 75 09 jne 0x4d <_JIT_ENTRY+0x4d> + // 44: 48 89 ef movq %rbp, %rdi + // 47: ff 15 00 00 00 00 callq *(%rip) # 0x4d <_JIT_ENTRY+0x4d> + // 0000000000000049: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4d: 8b 03 movl (%rbx), %eax + // 4f: 85 c0 testl %eax, %eax + // 51: 78 06 js 0x59 <_JIT_ENTRY+0x59> + // 53: ff c8 decl %eax + // 55: 89 03 movl %eax, (%rbx) + // 57: 74 14 je 0x6d <_JIT_ENTRY+0x6d> + // 59: 4d 85 ff testq %r15, %r15 + // 5c: 74 1d je 0x7b <_JIT_ENTRY+0x7b> + // 5e: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 62: 49 83 c5 f8 addq $-0x8, %r13 + // 66: 5d popq %rbp + // 67: ff 25 00 00 00 00 jmpq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6d: 48 89 df movq %rbx, %rdi + // 70: ff 15 00 00 00 00 callq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 76: 4d 85 ff testq %r15, %r15 + // 79: 75 e3 jne 0x5e <_JIT_ENTRY+0x5e> + // 7b: 49 83 c5 f0 addq $-0x10, %r13 + // 7f: 5d popq %rbp + // 80: ff 25 00 00 00 00 jmpq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[134] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xef, 0x48, + 0x89, 0xde, 0xff, 0x14, 0xc1, 0x49, 0x89, 0xc7, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x45, + 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x89, + 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x14, 0x4d, 0x85, 0xff, 0x74, 0x1d, 0x4d, 0x89, + 0x7d, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, + 0xff, 0x75, 0xe3, 0x49, 0x83, 0xc5, 0xf0, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_BinaryOps+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_BinaryOps); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x49, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_ADD_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 5: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 9: 49 8d 5d f0 leaq -0x10(%r13), %rbx + // d: f2 0f 10 47 10 movsd 0x10(%rdi), %xmm0 + // 12: f2 0f 58 46 10 addsd 0x10(%rsi), %xmm0 + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _PyFloat_FromDouble_ConsumeInputs-0x4 + // 1d: 48 85 c0 testq %rax, %rax + // 20: 74 0e je 0x30 <_JIT_ENTRY+0x30> + // 22: 49 83 c5 f8 addq $-0x8, %r13 + // 26: 48 89 03 movq %rax, (%rbx) + // 29: 58 popq %rax + // 2a: ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 30: 49 89 dd movq %rbx, %r13 + // 33: 58 popq %rax + // 34: ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[58] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x75, + 0xf8, 0x49, 0x8d, 0x5d, 0xf0, 0xf2, 0x0f, 0x10, + 0x47, 0x10, 0xf2, 0x0f, 0x58, 0x46, 0x10, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0e, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x03, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xdd, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0xc); +} + +void +emit__BINARY_OP_ADD_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 5: 49 8b 6d f8 movq -0x8(%r13), %rbp + // 9: 4c 89 ff movq %r15, %rdi + // c: 48 89 ee movq %rbp, %rsi + // f: ff 15 00 00 00 00 callq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX _PyLong_Add-0x4 + // 15: 48 89 c3 movq %rax, %rbx + // 18: 8b 45 00 movl (%rbp), %eax + // 1b: 85 c0 testl %eax, %eax + // 1d: 78 34 js 0x53 <_JIT_ENTRY+0x53> + // 1f: ff c8 decl %eax + // 21: 89 45 00 movl %eax, (%rbp) + // 24: 75 2d jne 0x53 <_JIT_ENTRY+0x53> + // 26: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 2d: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 11 je 0x4a <_JIT_ENTRY+0x4a> + // 39: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 40: 48 89 ef movq %rbp, %rdi + // 43: be 01 00 00 00 movl $0x1, %esi + // 48: ff d0 callq *%rax + // 4a: 48 89 ef movq %rbp, %rdi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 53: 41 8b 07 movl (%r15), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 07 js 0x61 <_JIT_ENTRY+0x61> + // 5a: ff c8 decl %eax + // 5c: 41 89 07 movl %eax, (%r15) + // 5f: 74 17 je 0x78 <_JIT_ENTRY+0x78> + // 61: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 65: 48 85 db testq %rbx, %rbx + // 68: 74 44 je 0xae <_JIT_ENTRY+0xae> + // 6a: 49 83 c5 f8 addq $-0x8, %r13 + // 6e: 48 89 18 movq %rbx, (%rax) + // 71: 5d popq %rbp + // 72: ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 78: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 7f: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 86: 48 85 c0 testq %rax, %rax + // 89: 74 11 je 0x9c <_JIT_ENTRY+0x9c> + // 8b: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 92: 4c 89 ff movq %r15, %rdi + // 95: be 01 00 00 00 movl $0x1, %esi + // 9a: ff d0 callq *%rax + // 9c: 4c 89 ff movq %r15, %rdi + // 9f: ff 15 00 00 00 00 callq *(%rip) # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // a5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // a9: 48 85 db testq %rbx, %rbx + // ac: 75 bc jne 0x6a <_JIT_ENTRY+0x6a> + // ae: 49 89 c5 movq %rax, %r13 + // b1: 5d popq %rbp + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[184] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x6d, + 0xf8, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xee, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, + 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x34, 0xff, + 0xc8, 0x89, 0x45, 0x00, 0x75, 0x2d, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, + 0x48, 0x89, 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, + 0x17, 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xdb, + 0x74, 0x44, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x18, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x48, 0x85, 0xdb, 0x75, 0xbc, 0x49, 0x89, + 0xc5, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Add+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Add); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_UNICODE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 5: 49 8b 6d f8 movq -0x8(%r13), %rbp + // 9: 4c 89 ff movq %r15, %rdi + // c: 48 89 ee movq %rbp, %rsi + // f: ff 15 00 00 00 00 callq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX PyUnicode_Concat-0x4 + // 15: 48 89 c3 movq %rax, %rbx + // 18: 8b 45 00 movl (%rbp), %eax + // 1b: 85 c0 testl %eax, %eax + // 1d: 78 34 js 0x53 <_JIT_ENTRY+0x53> + // 1f: ff c8 decl %eax + // 21: 89 45 00 movl %eax, (%rbp) + // 24: 75 2d jne 0x53 <_JIT_ENTRY+0x53> + // 26: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 2d: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 11 je 0x4a <_JIT_ENTRY+0x4a> + // 39: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 40: 48 89 ef movq %rbp, %rdi + // 43: be 01 00 00 00 movl $0x1, %esi + // 48: ff d0 callq *%rax + // 4a: 48 89 ef movq %rbp, %rdi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _PyUnicode_ExactDealloc-0x4 + // 53: 41 8b 07 movl (%r15), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 07 js 0x61 <_JIT_ENTRY+0x61> + // 5a: ff c8 decl %eax + // 5c: 41 89 07 movl %eax, (%r15) + // 5f: 74 17 je 0x78 <_JIT_ENTRY+0x78> + // 61: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 65: 48 85 db testq %rbx, %rbx + // 68: 74 44 je 0xae <_JIT_ENTRY+0xae> + // 6a: 49 83 c5 f8 addq $-0x8, %r13 + // 6e: 48 89 18 movq %rbx, (%rax) + // 71: 5d popq %rbp + // 72: ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 78: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 7f: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 86: 48 85 c0 testq %rax, %rax + // 89: 74 11 je 0x9c <_JIT_ENTRY+0x9c> + // 8b: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 92: 4c 89 ff movq %r15, %rdi + // 95: be 01 00 00 00 movl $0x1, %esi + // 9a: ff d0 callq *%rax + // 9c: 4c 89 ff movq %r15, %rdi + // 9f: ff 15 00 00 00 00 callq *(%rip) # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: R_X86_64_GOTPCRELX _PyUnicode_ExactDealloc-0x4 + // a5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // a9: 48 85 db testq %rbx, %rbx + // ac: 75 bc jne 0x6a <_JIT_ENTRY+0x6a> + // ae: 49 89 c5 movq %rax, %r13 + // b1: 5d popq %rbp + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[184] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x6d, + 0xf8, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xee, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, + 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x34, 0xff, + 0xc8, 0x89, 0x45, 0x00, 0x75, 0x2d, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, + 0x48, 0x89, 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, + 0x17, 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xdb, + 0x74, 0x44, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x18, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x48, 0x85, 0xdb, 0x75, 0xbc, 0x49, 0x89, + 0xc5, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Concat+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Concat); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_EXTEND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 15: 48 89 ef movq %rbp, %rdi + // 18: 48 89 de movq %rbx, %rsi + // 1b: ff 50 10 callq *0x10(%rax) + // 1e: 49 89 c7 movq %rax, %r15 + // 21: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 26: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2f: 8b 45 00 movl (%rbp), %eax + // 32: 85 c0 testl %eax, %eax + // 34: 78 10 js 0x46 <_JIT_ENTRY+0x46> + // 36: ff c8 decl %eax + // 38: 89 45 00 movl %eax, (%rbp) + // 3b: 75 09 jne 0x46 <_JIT_ENTRY+0x46> + // 3d: 48 89 ef movq %rbp, %rdi + // 40: ff 15 00 00 00 00 callq *(%rip) # 0x46 <_JIT_ENTRY+0x46> + // 0000000000000042: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 46: 8b 03 movl (%rbx), %eax + // 48: 85 c0 testl %eax, %eax + // 4a: 78 06 js 0x52 <_JIT_ENTRY+0x52> + // 4c: ff c8 decl %eax + // 4e: 89 03 movl %eax, (%rbx) + // 50: 74 0f je 0x61 <_JIT_ENTRY+0x61> + // 52: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 56: 49 83 c5 f8 addq $-0x8, %r13 + // 5a: 5d popq %rbp + // 5b: ff 25 00 00 00 00 jmpq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 61: 48 89 df movq %rbx, %rdi + // 64: ff 15 00 00 00 00 callq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 6a: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 6e: 49 83 c5 f8 addq $-0x8, %r13 + // 72: 5d popq %rbp + // 73: ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[115] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xef, + 0x48, 0x89, 0xde, 0xff, 0x50, 0x10, 0x49, 0x89, + 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x45, 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x89, 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, + 0x74, 0x0f, 0x4d, 0x89, 0x7d, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x89, 0x7d, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x42, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0x4); +} + +void +emit__BINARY_OP_INPLACE_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_INPLACE_ADD_UNICODE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 9: 48 63 2d 00 00 00 00 movslq (%rip), %rbp # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 10: 4d 39 7c ec 50 cmpq %r15, 0x50(%r12,%rbp,8) + // 15: 74 0b je 0x22 <_JIT_ENTRY+0x22> + // 17: 48 83 c4 10 addq $0x10, %rsp + // 1b: 5d popq %rbp + // 1c: ff 25 00 00 00 00 jmpq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 22: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 26: 41 8b 07 movl (%r15), %eax + // 29: 85 c0 testl %eax, %eax + // 2b: 78 34 js 0x61 <_JIT_ENTRY+0x61> + // 2d: ff c8 decl %eax + // 2f: 41 89 07 movl %eax, (%r15) + // 32: 75 2d jne 0x61 <_JIT_ENTRY+0x61> + // 34: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 3b: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 42: 48 85 c0 testq %rax, %rax + // 45: 74 11 je 0x58 <_JIT_ENTRY+0x58> + // 47: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 4e: 4c 89 ff movq %r15, %rdi + // 51: be 01 00 00 00 movl $0x1, %esi + // 56: ff d0 callq *%rax + // 58: 4c 89 ff movq %r15, %rdi + // 5b: ff 15 00 00 00 00 callq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: R_X86_64_GOTPCRELX _PyUnicode_ExactDealloc-0x4 + // 61: 49 8b 44 ec 50 movq 0x50(%r12,%rbp,8), %rax + // 66: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 6b: 48 8d 7c 24 08 leaq 0x8(%rsp), %rdi + // 70: 48 89 de movq %rbx, %rsi + // 73: ff 15 00 00 00 00 callq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: R_X86_64_GOTPCRELX PyUnicode_Append-0x4 + // 79: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // 7e: 49 89 44 ec 50 movq %rax, 0x50(%r12,%rbp,8) + // 83: 8b 0b movl (%rbx), %ecx + // 85: 85 c9 testl %ecx, %ecx + // 87: 78 38 js 0xc1 <_JIT_ENTRY+0xc1> + // 89: ff c9 decl %ecx + // 8b: 89 0b movl %ecx, (%rbx) + // 8d: 75 2d jne 0xbc <_JIT_ENTRY+0xbc> + // 8f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x96 <_JIT_ENTRY+0x96> + // 0000000000000092: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 96: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 9d: 48 85 c0 testq %rax, %rax + // a0: 74 11 je 0xb3 <_JIT_ENTRY+0xb3> + // a2: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // a9: 48 89 df movq %rbx, %rdi + // ac: be 01 00 00 00 movl $0x1, %esi + // b1: ff d0 callq *%rax + // b3: 48 89 df movq %rbx, %rdi + // b6: ff 15 00 00 00 00 callq *(%rip) # 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000b8: R_X86_64_GOTPCRELX _PyUnicode_ExactDealloc-0x4 + // bc: 49 8b 44 ec 50 movq 0x50(%r12,%rbp,8), %rax + // c1: 49 83 c5 f0 addq $-0x10, %r13 + // c5: 48 83 c4 10 addq $0x10, %rsp + // c9: 48 85 c0 testq %rax, %rax + // cc: 74 07 je 0xd5 <_JIT_ENTRY+0xd5> + // ce: 5d popq %rbp + // cf: ff 25 00 00 00 00 jmpq *(%rip) # 0xd5 <_JIT_ENTRY+0xd5> + // 00000000000000d1: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // d5: 5d popq %rbp + // d6: ff 25 00 00 00 00 jmpq *(%rip) # 0xdc <_JIT_ENTRY+0xdc> + // 00000000000000d8: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[220] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4d, 0x8b, 0x7d, + 0xf0, 0x48, 0x63, 0x2d, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x39, 0x7c, 0xec, 0x50, 0x74, 0x0b, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x34, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x90, 0x28, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, + 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, 0x4c, 0x89, + 0xff, 0xbe, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x44, 0xec, 0x50, 0x48, 0x89, + 0x44, 0x24, 0x08, 0x48, 0x8d, 0x7c, 0x24, 0x08, + 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x44, 0x24, 0x08, 0x49, 0x89, + 0x44, 0xec, 0x50, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x38, 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x44, 0xec, + 0x50, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, + 0x10, 0x48, 0x85, 0xc0, 0x74, 0x07, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: JUMP_TARGET + // 10: &_PyRuntime+0x0 + // 18: &_PyUnicode_ExactDealloc+0x0 + // 20: &PyUnicode_Append+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&PyUnicode_Append); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x92, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd1, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xd8, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_MULTIPLY_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 5: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 9: 49 8d 5d f0 leaq -0x10(%r13), %rbx + // d: f2 0f 10 47 10 movsd 0x10(%rdi), %xmm0 + // 12: f2 0f 59 46 10 mulsd 0x10(%rsi), %xmm0 + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _PyFloat_FromDouble_ConsumeInputs-0x4 + // 1d: 48 85 c0 testq %rax, %rax + // 20: 74 0e je 0x30 <_JIT_ENTRY+0x30> + // 22: 49 83 c5 f8 addq $-0x8, %r13 + // 26: 48 89 03 movq %rax, (%rbx) + // 29: 58 popq %rax + // 2a: ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 30: 49 89 dd movq %rbx, %r13 + // 33: 58 popq %rax + // 34: ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[58] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x75, + 0xf8, 0x49, 0x8d, 0x5d, 0xf0, 0xf2, 0x0f, 0x10, + 0x47, 0x10, 0xf2, 0x0f, 0x59, 0x46, 0x10, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0e, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x03, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xdd, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0xc); +} + +void +emit__BINARY_OP_MULTIPLY_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 5: 49 8b 6d f8 movq -0x8(%r13), %rbp + // 9: 4c 89 ff movq %r15, %rdi + // c: 48 89 ee movq %rbp, %rsi + // f: ff 15 00 00 00 00 callq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX _PyLong_Multiply-0x4 + // 15: 48 89 c3 movq %rax, %rbx + // 18: 8b 45 00 movl (%rbp), %eax + // 1b: 85 c0 testl %eax, %eax + // 1d: 78 34 js 0x53 <_JIT_ENTRY+0x53> + // 1f: ff c8 decl %eax + // 21: 89 45 00 movl %eax, (%rbp) + // 24: 75 2d jne 0x53 <_JIT_ENTRY+0x53> + // 26: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 2d: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 11 je 0x4a <_JIT_ENTRY+0x4a> + // 39: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 40: 48 89 ef movq %rbp, %rdi + // 43: be 01 00 00 00 movl $0x1, %esi + // 48: ff d0 callq *%rax + // 4a: 48 89 ef movq %rbp, %rdi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 53: 41 8b 07 movl (%r15), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 07 js 0x61 <_JIT_ENTRY+0x61> + // 5a: ff c8 decl %eax + // 5c: 41 89 07 movl %eax, (%r15) + // 5f: 74 17 je 0x78 <_JIT_ENTRY+0x78> + // 61: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 65: 48 85 db testq %rbx, %rbx + // 68: 74 44 je 0xae <_JIT_ENTRY+0xae> + // 6a: 49 83 c5 f8 addq $-0x8, %r13 + // 6e: 48 89 18 movq %rbx, (%rax) + // 71: 5d popq %rbp + // 72: ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 78: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 7f: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 86: 48 85 c0 testq %rax, %rax + // 89: 74 11 je 0x9c <_JIT_ENTRY+0x9c> + // 8b: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 92: 4c 89 ff movq %r15, %rdi + // 95: be 01 00 00 00 movl $0x1, %esi + // 9a: ff d0 callq *%rax + // 9c: 4c 89 ff movq %r15, %rdi + // 9f: ff 15 00 00 00 00 callq *(%rip) # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // a5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // a9: 48 85 db testq %rbx, %rbx + // ac: 75 bc jne 0x6a <_JIT_ENTRY+0x6a> + // ae: 49 89 c5 movq %rax, %r13 + // b1: 5d popq %rbp + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[184] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x6d, + 0xf8, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xee, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, + 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x34, 0xff, + 0xc8, 0x89, 0x45, 0x00, 0x75, 0x2d, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, + 0x48, 0x89, 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, + 0x17, 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xdb, + 0x74, 0x44, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x18, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x48, 0x85, 0xdb, 0x75, 0xbc, 0x49, 0x89, + 0xc5, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Multiply+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Multiply); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_SUBSCR_CHECK_FUNC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_CHECK_FUNC.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: f6 81 a9 00 00 00 02 testb $0x2, 0xa9(%rcx) + // f: 74 59 je 0x6a <_JIT_ENTRY+0x6a> + // 11: 48 8b 81 90 03 00 00 movq 0x390(%rcx), %rax + // 18: 48 85 c0 testq %rax, %rax + // 1b: 74 4d je 0x6a <_JIT_ENTRY+0x6a> + // 1d: 8b 90 90 00 00 00 movl 0x90(%rax), %edx + // 23: 3b 91 98 03 00 00 cmpl 0x398(%rcx), %edx + // 29: 75 3f jne 0x6a <_JIT_ENTRY+0x6a> + // 2b: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 32: 48 85 c9 testq %rcx, %rcx + // 35: 74 33 je 0x6a <_JIT_ENTRY+0x6a> + // 37: 48 8b 50 30 movq 0x30(%rax), %rdx + // 3b: 48 63 52 4c movslq 0x4c(%rdx), %rdx + // 3f: 49 8b b6 f8 00 00 00 movq 0xf8(%r14), %rsi + // 46: 48 29 ce subq %rcx, %rsi + // 49: 48 c1 fe 03 sarq $0x3, %rsi + // 4d: 48 39 d6 cmpq %rdx, %rsi + // 50: 7e 18 jle 0x6a <_JIT_ENTRY+0x6a> + // 52: 8b 08 movl (%rax), %ecx + // 54: 85 c9 testl %ecx, %ecx + // 56: 78 04 js 0x5c <_JIT_ENTRY+0x5c> + // 58: ff c1 incl %ecx + // 5a: 89 08 movl %ecx, (%rax) + // 5c: 49 89 45 00 movq %rax, (%r13) + // 60: 49 83 c5 08 addq $0x8, %r13 + // 64: ff 25 00 00 00 00 jmpq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6a: ff 25 00 00 00 00 jmpq *(%rip) # 0x70 <_JIT_ENTRY+0x70> + // 000000000000006c: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[112] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x48, 0x08, + 0xf6, 0x81, 0xa9, 0x00, 0x00, 0x00, 0x02, 0x74, + 0x59, 0x48, 0x8b, 0x81, 0x90, 0x03, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x4d, 0x8b, 0x90, 0x90, + 0x00, 0x00, 0x00, 0x3b, 0x91, 0x98, 0x03, 0x00, + 0x00, 0x75, 0x3f, 0x49, 0x8b, 0x8e, 0xf0, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x33, 0x48, + 0x8b, 0x50, 0x30, 0x48, 0x63, 0x52, 0x4c, 0x49, + 0x8b, 0xb6, 0xf8, 0x00, 0x00, 0x00, 0x48, 0x29, + 0xce, 0x48, 0xc1, 0xfe, 0x03, 0x48, 0x39, 0xd6, + 0x7e, 0x18, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, + 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)data + 0x4); +} + +void +emit__BINARY_OP_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 9: 48 8b 45 08 movq 0x8(%rbp), %rax + // d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 14: 74 0b je 0x21 <_JIT_ENTRY+0x21> + // 16: 48 83 c4 10 addq $0x10, %rsp + // 1a: 5d popq %rbp + // 1b: ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 21: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 25: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2a: 48 8d 54 24 08 leaq 0x8(%rsp), %rdx + // 2f: 48 89 ef movq %rbp, %rdi + // 32: 48 89 de movq %rbx, %rsi + // 35: ff 15 00 00 00 00 callq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX PyDict_GetItemRef-0x4 + // 3b: 41 89 c7 movl %eax, %r15d + // 3e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 43: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4c: 85 c0 testl %eax, %eax + // 4e: 75 1c jne 0x6c <_JIT_ENTRY+0x6c> + // 50: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 55: 48 89 df movq %rbx, %rdi + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _PyErr_SetKeyError-0x4 + // 5e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 63: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6c: 8b 45 00 movl (%rbp), %eax + // 6f: 85 c0 testl %eax, %eax + // 71: 78 10 js 0x83 <_JIT_ENTRY+0x83> + // 73: ff c8 decl %eax + // 75: 89 45 00 movl %eax, (%rbp) + // 78: 75 09 jne 0x83 <_JIT_ENTRY+0x83> + // 7a: 48 89 ef movq %rbp, %rdi + // 7d: ff 15 00 00 00 00 callq *(%rip) # 0x83 <_JIT_ENTRY+0x83> + // 000000000000007f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 83: 8b 03 movl (%rbx), %eax + // 85: 85 c0 testl %eax, %eax + // 87: 78 06 js 0x8f <_JIT_ENTRY+0x8f> + // 89: ff c8 decl %eax + // 8b: 89 03 movl %eax, (%rbx) + // 8d: 74 1d je 0xac <_JIT_ENTRY+0xac> + // 8f: 45 85 ff testl %r15d, %r15d + // 92: 7e 26 jle 0xba <_JIT_ENTRY+0xba> + // 94: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // 99: 49 89 45 f0 movq %rax, -0x10(%r13) + // 9d: 49 83 c5 f8 addq $-0x8, %r13 + // a1: 48 83 c4 10 addq $0x10, %rsp + // a5: 5d popq %rbp + // a6: ff 25 00 00 00 00 jmpq *(%rip) # 0xac <_JIT_ENTRY+0xac> + // 00000000000000a8: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // ac: 48 89 df movq %rbx, %rdi + // af: ff 15 00 00 00 00 callq *(%rip) # 0xb5 <_JIT_ENTRY+0xb5> + // 00000000000000b1: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b5: 45 85 ff testl %r15d, %r15d + // b8: 7f da jg 0x94 <_JIT_ENTRY+0x94> + // ba: 49 83 c5 f0 addq $-0x10, %r13 + // be: 48 83 c4 10 addq $0x10, %rsp + // c2: 5d popq %rbp + // c3: ff 25 00 00 00 00 jmpq *(%rip) # 0xc9 <_JIT_ENTRY+0xc9> + // 00000000000000c5: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[201] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x49, 0x8b, 0x6d, + 0xf0, 0x48, 0x8b, 0x45, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8d, 0x54, 0x24, 0x08, 0x48, + 0x89, 0xef, 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x89, 0xc7, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x75, 0x1c, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, 0x85, + 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x89, 0x45, 0x00, + 0x75, 0x09, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x1d, 0x45, + 0x85, 0xff, 0x7e, 0x26, 0x48, 0x8b, 0x44, 0x24, + 0x08, 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x45, 0x85, 0xff, + 0x7f, 0xda, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: JUMP_TARGET + // 10: &PyDict_GetItemRef+0x0 + // 18: &_PyErr_SetKeyError+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyDict_GetItemRef); + patch_64(data + 0x18, (uintptr_t)&_PyErr_SetKeyError); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7f, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xa8, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_SUBSCR_INIT_CALL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_INIT_CALL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 4: 41 0f 10 45 e8 movups -0x18(%r13), %xmm0 + // 9: 48 8b 4a 30 movq 0x30(%rdx), %rcx + // d: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // 14: 48 63 71 4c movslq 0x4c(%rcx), %rsi + // 18: 48 8d 34 f0 leaq (%rax,%rsi,8), %rsi + // 1c: 49 89 b6 f0 00 00 00 movq %rsi, 0xf0(%r14) + // 23: 4c 89 60 08 movq %r12, 0x8(%rax) + // 27: 48 89 50 10 movq %rdx, 0x10(%rax) + // 2b: 8b 31 movl (%rcx), %esi + // 2d: 85 f6 testl %esi, %esi + // 2f: 78 04 js 0x35 <_JIT_ENTRY+0x35> + // 31: ff c6 incl %esi + // 33: 89 31 movl %esi, (%rcx) + // 35: 48 89 08 movq %rcx, (%rax) + // 38: 0f 10 4a 10 movups 0x10(%rdx), %xmm1 + // 3c: 0f 11 48 18 movups %xmm1, 0x18(%rax) + // 40: 48 c7 40 28 00 00 00 00 movq $0x0, 0x28(%rax) + // 48: 48 63 51 48 movslq 0x48(%rcx), %rdx + // 4c: 48 8d 74 d0 50 leaq 0x50(%rax,%rdx,8), %rsi + // 51: 48 89 70 40 movq %rsi, 0x40(%rax) + // 55: 48 8d b1 d0 00 00 00 leaq 0xd0(%rcx), %rsi + // 5c: 48 c7 40 30 00 00 00 00 movq $0x0, 0x30(%rax) + // 64: 48 89 70 38 movq %rsi, 0x38(%rax) + // 68: c7 40 48 00 00 00 00 movl $0x0, 0x48(%rax) + // 6f: 48 83 fa 03 cmpq $0x3, %rdx + // 73: 7c 27 jl 0x9c <_JIT_ENTRY+0x9c> + // 75: ba 0c 00 00 00 movl $0xc, %edx + // 7a: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // 80: 48 c7 04 d0 00 00 00 00 movq $0x0, (%rax,%rdx,8) + // 88: 48 63 71 48 movslq 0x48(%rcx), %rsi + // 8c: 48 8d 7a 01 leaq 0x1(%rdx), %rdi + // 90: 48 83 c2 f7 addq $-0x9, %rdx + // 94: 48 39 f2 cmpq %rsi, %rdx + // 97: 48 89 fa movq %rdi, %rdx + // 9a: 7c e4 jl 0x80 <_JIT_ENTRY+0x80> + // 9c: 0f 11 40 50 movups %xmm0, 0x50(%rax) + // a0: 66 41 c7 44 24 48 06 00 movw $0x6, 0x48(%r12) + // a8: 49 89 45 e8 movq %rax, -0x18(%r13) + // ac: 49 83 c5 f0 addq $-0x10, %r13 + // b0: ff 25 00 00 00 00 jmpq *(%rip) # 0xb6 <_JIT_ENTRY+0xb6> + // 00000000000000b2: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[176] = { + 0x49, 0x8b, 0x55, 0xf8, 0x41, 0x0f, 0x10, 0x45, + 0xe8, 0x48, 0x8b, 0x4a, 0x30, 0x49, 0x8b, 0x86, + 0xf0, 0x00, 0x00, 0x00, 0x48, 0x63, 0x71, 0x4c, + 0x48, 0x8d, 0x34, 0xf0, 0x49, 0x89, 0xb6, 0xf0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x60, 0x08, 0x48, + 0x89, 0x50, 0x10, 0x8b, 0x31, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x31, 0x48, 0x89, 0x08, + 0x0f, 0x10, 0x4a, 0x10, 0x0f, 0x11, 0x48, 0x18, + 0x48, 0xc7, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x51, 0x48, 0x48, 0x8d, 0x74, 0xd0, + 0x50, 0x48, 0x89, 0x70, 0x40, 0x48, 0x8d, 0xb1, + 0xd0, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x40, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x70, 0x38, + 0xc7, 0x40, 0x48, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xfa, 0x03, 0x7c, 0x27, 0xba, 0x0c, 0x00, + 0x00, 0x00, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x48, 0xc7, 0x04, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x71, 0x48, 0x48, 0x8d, 0x7a, 0x01, + 0x48, 0x83, 0xc2, 0xf7, 0x48, 0x39, 0xf2, 0x48, + 0x89, 0xfa, 0x7c, 0xe4, 0x0f, 0x11, 0x40, 0x50, + 0x66, 0x41, 0xc7, 0x44, 0x24, 0x48, 0x06, 0x00, + 0x49, 0x89, 0x45, 0xe8, 0x49, 0x83, 0xc5, 0xf0, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_LIST_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 5: 49 8b 47 08 movq 0x8(%r15), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // 10: 0f 85 bf 00 00 00 jne 0xd5 <_JIT_ENTRY+0xd5> + // 16: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 1a: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1e: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_REX_GOTPCRELX PyList_Type-0x4 + // 25: 0f 85 aa 00 00 00 jne 0xd5 <_JIT_ENTRY+0xd5> + // 2b: 49 8b 47 10 movq 0x10(%r15), %rax + // 2f: 48 83 e0 fb andq $-0x5, %rax + // 33: 48 83 f8 09 cmpq $0x9, %rax + // 37: 0f 83 98 00 00 00 jae 0xd5 <_JIT_ENTRY+0xd5> + // 3d: 41 8b 47 18 movl 0x18(%r15), %eax + // 41: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 45: 0f 8e 8a 00 00 00 jle 0xd5 <_JIT_ENTRY+0xd5> + // 4b: 48 8b 4b 18 movq 0x18(%rbx), %rcx + // 4f: 48 8b 2c c1 movq (%rcx,%rax,8), %rbp + // 53: 8b 45 00 movl (%rbp), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 05 js 0x5f <_JIT_ENTRY+0x5f> + // 5a: ff c0 incl %eax + // 5c: 89 45 00 movl %eax, (%rbp) + // 5f: 49 83 c5 f0 addq $-0x10, %r13 + // 63: 41 8b 07 movl (%r15), %eax + // 66: 85 c0 testl %eax, %eax + // 68: 78 34 js 0x9e <_JIT_ENTRY+0x9e> + // 6a: ff c8 decl %eax + // 6c: 41 89 07 movl %eax, (%r15) + // 6f: 75 2d jne 0x9e <_JIT_ENTRY+0x9e> + // 71: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 78: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 7f: 48 85 c0 testq %rax, %rax + // 82: 74 11 je 0x95 <_JIT_ENTRY+0x95> + // 84: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 8b: 4c 89 ff movq %r15, %rdi + // 8e: be 01 00 00 00 movl $0x1, %esi + // 93: ff d0 callq *%rax + // 95: 4c 89 ff movq %r15, %rdi + // 98: ff 15 00 00 00 00 callq *(%rip) # 0x9e <_JIT_ENTRY+0x9e> + // 000000000000009a: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 9e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a3: 8b 03 movl (%rbx), %eax + // a5: 85 c0 testl %eax, %eax + // a7: 78 0f js 0xb8 <_JIT_ENTRY+0xb8> + // a9: ff c8 decl %eax + // ab: 89 03 movl %eax, (%rbx) + // ad: 75 09 jne 0xb8 <_JIT_ENTRY+0xb8> + // af: 48 89 df movq %rbx, %rdi + // b2: ff 15 00 00 00 00 callq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b8: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // bd: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c6: 49 89 6d 00 movq %rbp, (%r13) + // ca: 49 83 c5 08 addq $0x8, %r13 + // ce: 5d popq %rbp + // cf: ff 25 00 00 00 00 jmpq *(%rip) # 0xd5 <_JIT_ENTRY+0xd5> + // 00000000000000d1: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // d5: 5d popq %rbp + // d6: ff 25 00 00 00 00 jmpq *(%rip) # 0xdc <_JIT_ENTRY+0xdc> + // 00000000000000d8: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[220] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xbf, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xaa, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, + 0x83, 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, + 0x83, 0x98, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, + 0x18, 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x8a, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x4b, 0x18, 0x48, + 0x8b, 0x2c, 0xc1, 0x8b, 0x45, 0x00, 0x85, 0xc0, + 0x78, 0x05, 0xff, 0xc0, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0xf0, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x34, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, + 0x2d, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, + 0x28, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x6d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyList_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x9a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd1, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xd8, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_SUBSCR_STR_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_STR_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 5: 49 8b 47 08 movq 0x8(%r15), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // 10: 0f 85 c1 00 00 00 jne 0xd7 <_JIT_ENTRY+0xd7> + // 16: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 1a: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1e: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_REX_GOTPCRELX PyUnicode_Type-0x4 + // 25: 0f 85 ac 00 00 00 jne 0xd7 <_JIT_ENTRY+0xd7> + // 2b: 49 8b 47 10 movq 0x10(%r15), %rax + // 2f: 48 83 e0 fb andq $-0x5, %rax + // 33: 48 83 f8 09 cmpq $0x9, %rax + // 37: 0f 83 9a 00 00 00 jae 0xd7 <_JIT_ENTRY+0xd7> + // 3d: 41 8b 47 18 movl 0x18(%r15), %eax + // 41: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 45: 0f 8e 8c 00 00 00 jle 0xd7 <_JIT_ENTRY+0xd7> + // 4b: 0f b7 4b 22 movzwl 0x22(%rbx), %ecx + // 4f: 89 ca movl %ecx, %edx + // 51: 83 e2 07 andl $0x7, %edx + // 54: 83 fa 02 cmpl $0x2, %edx + // 57: 74 14 je 0x6d <_JIT_ENTRY+0x6d> + // 59: 83 fa 01 cmpl $0x1, %edx + // 5c: 75 1e jne 0x7c <_JIT_ENTRY+0x7c> + // 5e: f6 c1 08 testb $0x8, %cl + // 61: 75 24 jne 0x87 <_JIT_ENTRY+0x87> + // 63: 48 8b 4b 38 movq 0x38(%rbx), %rcx + // 67: 0f b6 2c 01 movzbl (%rcx,%rax), %ebp + // 6b: eb 62 jmp 0xcf <_JIT_ENTRY+0xcf> + // 6d: f6 c1 08 testb $0x8, %cl + // 70: 75 2e jne 0xa0 <_JIT_ENTRY+0xa0> + // 72: 48 8b 4b 38 movq 0x38(%rbx), %rcx + // 76: 0f b7 2c 41 movzwl (%rcx,%rax,2), %ebp + // 7a: eb 53 jmp 0xcf <_JIT_ENTRY+0xcf> + // 7c: f6 c1 08 testb $0x8, %cl + // 7f: 75 38 jne 0xb9 <_JIT_ENTRY+0xb9> + // 81: 48 8b 4b 38 movq 0x38(%rbx), %rcx + // 85: eb 45 jmp 0xcc <_JIT_ENTRY+0xcc> + // 87: 31 d2 xorl %edx, %edx + // 89: f6 c1 10 testb $0x10, %cl + // 8c: 0f 94 c2 sete %dl + // 8f: c1 e2 04 shll $0x4, %edx + // 92: 48 8d 0c 13 leaq (%rbx,%rdx), %rcx + // 96: 48 83 c1 28 addq $0x28, %rcx + // 9a: 0f b6 2c 01 movzbl (%rcx,%rax), %ebp + // 9e: eb 2f jmp 0xcf <_JIT_ENTRY+0xcf> + // a0: 31 d2 xorl %edx, %edx + // a2: f6 c1 10 testb $0x10, %cl + // a5: 0f 94 c2 sete %dl + // a8: c1 e2 04 shll $0x4, %edx + // ab: 48 8d 0c 13 leaq (%rbx,%rdx), %rcx + // af: 48 83 c1 28 addq $0x28, %rcx + // b3: 0f b7 2c 41 movzwl (%rcx,%rax,2), %ebp + // b7: eb 16 jmp 0xcf <_JIT_ENTRY+0xcf> + // b9: 31 d2 xorl %edx, %edx + // bb: f6 c1 10 testb $0x10, %cl + // be: 0f 94 c2 sete %dl + // c1: c1 e2 04 shll $0x4, %edx + // c4: 48 8d 0c 13 leaq (%rbx,%rdx), %rcx + // c8: 48 83 c1 28 addq $0x28, %rcx + // cc: 8b 2c 81 movl (%rcx,%rax,4), %ebp + // cf: 81 fd 80 00 00 00 cmpl $0x80, %ebp + // d5: 72 07 jb 0xde <_JIT_ENTRY+0xde> + // d7: 5d popq %rbp + // d8: ff 25 00 00 00 00 jmpq *(%rip) # 0xde <_JIT_ENTRY+0xde> + // 00000000000000da: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // de: 49 83 c5 f0 addq $-0x10, %r13 + // e2: 41 8b 07 movl (%r15), %eax + // e5: 85 c0 testl %eax, %eax + // e7: 78 34 js 0x11d <_JIT_ENTRY+0x11d> + // e9: ff c8 decl %eax + // eb: 41 89 07 movl %eax, (%r15) + // ee: 75 2d jne 0x11d <_JIT_ENTRY+0x11d> + // f0: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xf7 <_JIT_ENTRY+0xf7> + // 00000000000000f3: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // f7: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // fe: 48 85 c0 testq %rax, %rax + // 101: 74 11 je 0x114 <_JIT_ENTRY+0x114> + // 103: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 10a: 4c 89 ff movq %r15, %rdi + // 10d: be 01 00 00 00 movl $0x1, %esi + // 112: ff d0 callq *%rax + // 114: 4c 89 ff movq %r15, %rdi + // 117: ff 15 00 00 00 00 callq *(%rip) # 0x11d <_JIT_ENTRY+0x11d> + // 0000000000000119: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 11d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 122: 8b 03 movl (%rbx), %eax + // 124: 85 c0 testl %eax, %eax + // 126: 78 0f js 0x137 <_JIT_ENTRY+0x137> + // 128: ff c8 decl %eax + // 12a: 89 03 movl %eax, (%rbx) + // 12c: 75 09 jne 0x137 <_JIT_ENTRY+0x137> + // 12e: 48 89 df movq %rbx, %rdi + // 131: ff 15 00 00 00 00 callq *(%rip) # 0x137 <_JIT_ENTRY+0x137> + // 0000000000000133: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 137: 89 e8 movl %ebp, %eax + // 139: 48 8d 04 40 leaq (%rax,%rax,2), %rax + // 13d: 48 c1 e0 04 shlq $0x4, %rax + // 141: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x148 <_JIT_ENTRY+0x148> + // 0000000000000144: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 148: 48 01 c8 addq %rcx, %rax + // 14b: 48 05 78 23 01 00 addq $0x12378, %rax # imm = 0x12378 + // 151: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 156: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 15f: 49 89 45 00 movq %rax, (%r13) + // 163: 49 83 c5 08 addq $0x8, %r13 + // 167: 5d popq %rbp + // 168: ff 25 00 00 00 00 jmpq *(%rip) # 0x16e <_JIT_ENTRY+0x16e> + // 000000000000016a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[360] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xc1, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xac, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, + 0x83, 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, + 0x83, 0x9a, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, + 0x18, 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x8c, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0x4b, 0x22, 0x89, + 0xca, 0x83, 0xe2, 0x07, 0x83, 0xfa, 0x02, 0x74, + 0x14, 0x83, 0xfa, 0x01, 0x75, 0x1e, 0xf6, 0xc1, + 0x08, 0x75, 0x24, 0x48, 0x8b, 0x4b, 0x38, 0x0f, + 0xb6, 0x2c, 0x01, 0xeb, 0x62, 0xf6, 0xc1, 0x08, + 0x75, 0x2e, 0x48, 0x8b, 0x4b, 0x38, 0x0f, 0xb7, + 0x2c, 0x41, 0xeb, 0x53, 0xf6, 0xc1, 0x08, 0x75, + 0x38, 0x48, 0x8b, 0x4b, 0x38, 0xeb, 0x45, 0x31, + 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, 0xc2, 0xc1, + 0xe2, 0x04, 0x48, 0x8d, 0x0c, 0x13, 0x48, 0x83, + 0xc1, 0x28, 0x0f, 0xb6, 0x2c, 0x01, 0xeb, 0x2f, + 0x31, 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, 0xc2, + 0xc1, 0xe2, 0x04, 0x48, 0x8d, 0x0c, 0x13, 0x48, + 0x83, 0xc1, 0x28, 0x0f, 0xb7, 0x2c, 0x41, 0xeb, + 0x16, 0x31, 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, + 0xc2, 0xc1, 0xe2, 0x04, 0x48, 0x8d, 0x0c, 0x13, + 0x48, 0x83, 0xc1, 0x28, 0x8b, 0x2c, 0x81, 0x81, + 0xfd, 0x80, 0x00, 0x00, 0x00, 0x72, 0x07, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf0, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x34, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x2d, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xe8, 0x48, 0x8d, 0x04, 0x40, 0x48, 0xc1, 0xe0, + 0x04, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x01, 0xc8, 0x48, 0x05, 0x78, 0x23, 0x01, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyUnicode_Type+0x0 + // 10: JUMP_TARGET + // 18: &_PyRuntime+0x0 + // 20: &_PyLong_ExactDealloc+0x0 + // 28: &_Py_Dealloc+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + patch_64(data + 0x20, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xda, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xf3, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x119, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x133, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x144, (uintptr_t)data + 0x14); +} + +void +emit__BINARY_OP_SUBSCR_TUPLE_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_TUPLE_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 5: 49 8b 47 08 movq 0x8(%r15), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // 10: 0f 85 bc 00 00 00 jne 0xd2 <_JIT_ENTRY+0xd2> + // 16: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 1a: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1e: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_REX_GOTPCRELX PyTuple_Type-0x4 + // 25: 0f 85 a7 00 00 00 jne 0xd2 <_JIT_ENTRY+0xd2> + // 2b: 49 8b 47 10 movq 0x10(%r15), %rax + // 2f: 48 83 e0 fb andq $-0x5, %rax + // 33: 48 83 f8 09 cmpq $0x9, %rax + // 37: 0f 83 95 00 00 00 jae 0xd2 <_JIT_ENTRY+0xd2> + // 3d: 41 8b 47 18 movl 0x18(%r15), %eax + // 41: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 45: 0f 8e 87 00 00 00 jle 0xd2 <_JIT_ENTRY+0xd2> + // 4b: 48 8b 6c c3 18 movq 0x18(%rbx,%rax,8), %rbp + // 50: 8b 45 00 movl (%rbp), %eax + // 53: 85 c0 testl %eax, %eax + // 55: 78 05 js 0x5c <_JIT_ENTRY+0x5c> + // 57: ff c0 incl %eax + // 59: 89 45 00 movl %eax, (%rbp) + // 5c: 49 83 c5 f0 addq $-0x10, %r13 + // 60: 41 8b 07 movl (%r15), %eax + // 63: 85 c0 testl %eax, %eax + // 65: 78 34 js 0x9b <_JIT_ENTRY+0x9b> + // 67: ff c8 decl %eax + // 69: 41 89 07 movl %eax, (%r15) + // 6c: 75 2d jne 0x9b <_JIT_ENTRY+0x9b> + // 6e: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x75 <_JIT_ENTRY+0x75> + // 0000000000000071: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 75: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 7c: 48 85 c0 testq %rax, %rax + // 7f: 74 11 je 0x92 <_JIT_ENTRY+0x92> + // 81: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 88: 4c 89 ff movq %r15, %rdi + // 8b: be 01 00 00 00 movl $0x1, %esi + // 90: ff d0 callq *%rax + // 92: 4c 89 ff movq %r15, %rdi + // 95: ff 15 00 00 00 00 callq *(%rip) # 0x9b <_JIT_ENTRY+0x9b> + // 0000000000000097: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 9b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a0: 8b 03 movl (%rbx), %eax + // a2: 85 c0 testl %eax, %eax + // a4: 78 0f js 0xb5 <_JIT_ENTRY+0xb5> + // a6: ff c8 decl %eax + // a8: 89 03 movl %eax, (%rbx) + // aa: 75 09 jne 0xb5 <_JIT_ENTRY+0xb5> + // ac: 48 89 df movq %rbx, %rdi + // af: ff 15 00 00 00 00 callq *(%rip) # 0xb5 <_JIT_ENTRY+0xb5> + // 00000000000000b1: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b5: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ba: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c3: 49 89 6d 00 movq %rbp, (%r13) + // c7: 49 83 c5 08 addq $0x8, %r13 + // cb: 5d popq %rbp + // cc: ff 25 00 00 00 00 jmpq *(%rip) # 0xd2 <_JIT_ENTRY+0xd2> + // 00000000000000ce: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // d2: 5d popq %rbp + // d3: ff 25 00 00 00 00 jmpq *(%rip) # 0xd9 <_JIT_ENTRY+0xd9> + // 00000000000000d5: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[217] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xbc, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xa7, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x47, 0x10, 0x48, + 0x83, 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, + 0x83, 0x95, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x47, + 0x18, 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x87, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x6c, 0xc3, 0x18, + 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x05, 0xff, + 0xc0, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0xf0, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x34, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x2d, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, + 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, + 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x6d, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyTuple_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x71, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xce, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_SUBTRACT_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 5: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 9: 49 8d 5d f0 leaq -0x10(%r13), %rbx + // d: f2 0f 10 47 10 movsd 0x10(%rdi), %xmm0 + // 12: f2 0f 5c 46 10 subsd 0x10(%rsi), %xmm0 + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _PyFloat_FromDouble_ConsumeInputs-0x4 + // 1d: 48 85 c0 testq %rax, %rax + // 20: 74 0e je 0x30 <_JIT_ENTRY+0x30> + // 22: 49 83 c5 f8 addq $-0x8, %r13 + // 26: 48 89 03 movq %rax, (%rbx) + // 29: 58 popq %rax + // 2a: ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 30: 49 89 dd movq %rbx, %r13 + // 33: 58 popq %rax + // 34: ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[58] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x75, + 0xf8, 0x49, 0x8d, 0x5d, 0xf0, 0xf2, 0x0f, 0x10, + 0x47, 0x10, 0xf2, 0x0f, 0x5c, 0x46, 0x10, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0e, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x03, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xdd, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0xc); +} + +void +emit__BINARY_OP_SUBTRACT_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 5: 49 8b 6d f8 movq -0x8(%r13), %rbp + // 9: 4c 89 ff movq %r15, %rdi + // c: 48 89 ee movq %rbp, %rsi + // f: ff 15 00 00 00 00 callq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX _PyLong_Subtract-0x4 + // 15: 48 89 c3 movq %rax, %rbx + // 18: 8b 45 00 movl (%rbp), %eax + // 1b: 85 c0 testl %eax, %eax + // 1d: 78 34 js 0x53 <_JIT_ENTRY+0x53> + // 1f: ff c8 decl %eax + // 21: 89 45 00 movl %eax, (%rbp) + // 24: 75 2d jne 0x53 <_JIT_ENTRY+0x53> + // 26: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 2d: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 11 je 0x4a <_JIT_ENTRY+0x4a> + // 39: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 40: 48 89 ef movq %rbp, %rdi + // 43: be 01 00 00 00 movl $0x1, %esi + // 48: ff d0 callq *%rax + // 4a: 48 89 ef movq %rbp, %rdi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 53: 41 8b 07 movl (%r15), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 07 js 0x61 <_JIT_ENTRY+0x61> + // 5a: ff c8 decl %eax + // 5c: 41 89 07 movl %eax, (%r15) + // 5f: 74 17 je 0x78 <_JIT_ENTRY+0x78> + // 61: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 65: 48 85 db testq %rbx, %rbx + // 68: 74 44 je 0xae <_JIT_ENTRY+0xae> + // 6a: 49 83 c5 f8 addq $-0x8, %r13 + // 6e: 48 89 18 movq %rbx, (%rax) + // 71: 5d popq %rbp + // 72: ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 78: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 7f: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 86: 48 85 c0 testq %rax, %rax + // 89: 74 11 je 0x9c <_JIT_ENTRY+0x9c> + // 8b: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 92: 4c 89 ff movq %r15, %rdi + // 95: be 01 00 00 00 movl $0x1, %esi + // 9a: ff d0 callq *%rax + // 9c: 4c 89 ff movq %r15, %rdi + // 9f: ff 15 00 00 00 00 callq *(%rip) # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // a5: 49 8d 45 f0 leaq -0x10(%r13), %rax + // a9: 48 85 db testq %rbx, %rbx + // ac: 75 bc jne 0x6a <_JIT_ENTRY+0x6a> + // ae: 49 89 c5 movq %rax, %r13 + // b1: 5d popq %rbp + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[184] = { + 0x55, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x6d, + 0xf8, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xee, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, + 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x34, 0xff, + 0xc8, 0x89, 0x45, 0x00, 0x75, 0x2d, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, + 0x48, 0x89, 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, + 0x17, 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xdb, + 0x74, 0x44, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, + 0x18, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf0, 0x48, 0x85, 0xdb, 0x75, 0xbc, 0x49, 0x89, + 0xc5, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Subtract+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Subtract); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_SLICE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 5: 49 8b 5d e8 movq -0x18(%r13), %rbx + // 9: 49 8b 7d f0 movq -0x10(%r13), %rdi + // d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCRELX _PyBuildSlice_ConsumeRefs-0x4 + // 18: 49 89 c5 movq %rax, %r13 + // 1b: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 20: 4d 85 ed testq %r13, %r13 + // 23: 74 3c je 0x61 <_JIT_ENTRY+0x61> + // 25: 48 83 c0 f0 addq $-0x10, %rax + // 29: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 2e: 48 89 df movq %rbx, %rdi + // 31: 4c 89 ee movq %r13, %rsi + // 34: ff 15 00 00 00 00 callq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_GOTPCRELX PyObject_GetItem-0x4 + // 3a: 49 89 c7 movq %rax, %r15 + // 3d: 41 8b 45 00 movl (%r13), %eax + // 41: 85 c0 testl %eax, %eax + // 43: 78 11 js 0x56 <_JIT_ENTRY+0x56> + // 45: ff c8 decl %eax + // 47: 41 89 45 00 movl %eax, (%r13) + // 4b: 75 09 jne 0x56 <_JIT_ENTRY+0x56> + // 4d: 4c 89 ef movq %r13, %rdi + // 50: ff 15 00 00 00 00 callq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 56: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 5b: 48 83 c0 10 addq $0x10, %rax + // 5f: eb 03 jmp 0x64 <_JIT_ENTRY+0x64> + // 61: 45 31 ff xorl %r15d, %r15d + // 64: 48 83 c0 e8 addq $-0x18, %rax + // 68: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 6d: 8b 03 movl (%rbx), %eax + // 6f: 85 c0 testl %eax, %eax + // 71: 78 06 js 0x79 <_JIT_ENTRY+0x79> + // 73: ff c8 decl %eax + // 75: 89 03 movl %eax, (%rbx) + // 77: 74 22 je 0x9b <_JIT_ENTRY+0x9b> + // 79: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 87: 4d 85 ff testq %r15, %r15 + // 8a: 74 2b je 0xb7 <_JIT_ENTRY+0xb7> + // 8c: 4d 89 7d 00 movq %r15, (%r13) + // 90: 49 83 c5 08 addq $0x8, %r13 + // 94: 58 popq %rax + // 95: ff 25 00 00 00 00 jmpq *(%rip) # 0x9b <_JIT_ENTRY+0x9b> + // 0000000000000097: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 9b: 48 89 df movq %rbx, %rdi + // 9e: ff 15 00 00 00 00 callq *(%rip) # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a4: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b2: 4d 85 ff testq %r15, %r15 + // b5: 75 d5 jne 0x8c <_JIT_ENTRY+0x8c> + // b7: 58 popq %rax + // b8: ff 25 00 00 00 00 jmpq *(%rip) # 0xbe <_JIT_ENTRY+0xbe> + // 00000000000000ba: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[190] = { + 0x50, 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8b, 0x5d, + 0xe8, 0x49, 0x8b, 0x7d, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0xc5, 0x49, 0x8b, 0x44, 0x24, 0x40, + 0x4d, 0x85, 0xed, 0x74, 0x3c, 0x48, 0x83, 0xc0, + 0xf0, 0x49, 0x89, 0x44, 0x24, 0x40, 0x48, 0x89, + 0xdf, 0x4c, 0x89, 0xee, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0xc7, 0x41, 0x8b, 0x45, + 0x00, 0x85, 0xc0, 0x78, 0x11, 0xff, 0xc8, 0x41, + 0x89, 0x45, 0x00, 0x75, 0x09, 0x4c, 0x89, 0xef, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x44, 0x24, 0x40, 0x48, 0x83, 0xc0, 0x10, 0xeb, + 0x03, 0x45, 0x31, 0xff, 0x48, 0x83, 0xc0, 0xe8, + 0x49, 0x89, 0x44, 0x24, 0x40, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x22, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x85, 0xff, 0x74, 0x2b, 0x4d, 0x89, 0x7d, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x85, 0xff, 0x75, 0xd5, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyBuildSlice_ConsumeRefs+0x0 + // 8: &PyObject_GetItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xba, (uintptr_t)data + 0x1c); +} + +void +emit__BUILD_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_LIST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8: 41 0f b7 f7 movzwl %r15w, %esi + // c: 8d 04 f5 00 00 00 00 leal (,%rsi,8), %eax + // 13: 4c 89 eb movq %r13, %rbx + // 16: 48 29 c3 subq %rax, %rbx + // 19: 48 89 df movq %rbx, %rdi + // 1c: ff 15 00 00 00 00 callq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _PyList_FromStackRefStealOnSuccess-0x4 + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 1c je 0x43 <_JIT_ENTRY+0x43> + // 27: 41 0f b7 cf movzwl %r15w, %ecx + // 2b: 48 89 03 movq %rax, (%rbx) + // 2e: b8 01 00 00 00 movl $0x1, %eax + // 33: 29 c8 subl %ecx, %eax + // 35: 48 98 cltq + // 37: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 3c: 58 popq %rax + // 3d: ff 25 00 00 00 00 jmpq *(%rip) # 0x43 <_JIT_ENTRY+0x43> + // 000000000000003f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 43: 58 popq %rax + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[74] = { + 0x50, 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x0f, 0xb7, 0xf7, 0x8d, 0x04, 0xf5, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xeb, 0x48, 0x29, + 0xc3, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1c, 0x41, + 0x0f, 0xb7, 0xcf, 0x48, 0x89, 0x03, 0xb8, 0x01, + 0x00, 0x00, 0x00, 0x29, 0xc8, 0x48, 0x98, 0x4d, + 0x8d, 0x6c, 0xc5, 0x00, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyList_FromStackRefStealOnSuccess+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyList_FromStackRefStealOnSuccess); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x14); +} + +void +emit__BUILD_MAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_MAP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 4c 89 74 24 10 movq %r14, 0x10(%rsp) + // a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 11: 0f b7 e8 movzwl %ax, %ebp + // 14: 01 ed addl %ebp, %ebp + // 16: 89 e9 movl %ebp, %ecx + // 18: f7 d9 negl %ecx + // 1a: 4c 63 f9 movslq %ecx, %r15 + // 1d: 4a 8d 1c fd 00 00 00 00 leaq (,%r15,8), %rbx + // 25: 4c 01 eb addq %r13, %rbx + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 4b 8d 54 fd 08 leaq 0x8(%r13,%r15,8), %rdx + // 32: 44 0f b7 e8 movzwl %ax, %r13d + // 36: be 02 00 00 00 movl $0x2, %esi + // 3b: b9 02 00 00 00 movl $0x2, %ecx + // 40: 48 89 df movq %rbx, %rdi + // 43: 4d 89 e8 movq %r13, %r8 + // 46: ff 15 00 00 00 00 callq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: R_X86_64_GOTPCRELX _PyDict_FromItems-0x4 + // 4c: 48 89 44 24 18 movq %rax, 0x18(%rsp) + // 51: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 56: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 5b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 64: 66 45 85 ed testw %r13w, %r13w + // 68: 74 35 je 0x9f <_JIT_ENTRY+0x9f> + // 6a: 4e 8d 2c 6d 01 00 00 00 leaq 0x1(,%r13,2), %r13 + // 72: 4c 8b 35 00 00 00 00 movq (%rip), %r14 # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // 79: eb 0e jmp 0x89 <_JIT_ENTRY+0x89> + // 7b: 0f 1f 44 00 00 nopl (%rax,%rax) + // 80: 49 ff cd decq %r13 + // 83: 49 83 fd 01 cmpq $0x1, %r13 + // 87: 76 16 jbe 0x9f <_JIT_ENTRY+0x9f> + // 89: 4a 8b 7c eb f0 movq -0x10(%rbx,%r13,8), %rdi + // 8e: 8b 07 movl (%rdi), %eax + // 90: 85 c0 testl %eax, %eax + // 92: 78 ec js 0x80 <_JIT_ENTRY+0x80> + // 94: ff c8 decl %eax + // 96: 89 07 movl %eax, (%rdi) + // 98: 75 e6 jne 0x80 <_JIT_ENTRY+0x80> + // 9a: 41 ff d6 callq *%r14 + // 9d: eb e1 jmp 0x80 <_JIT_ENTRY+0x80> + // 9f: 48 8b 44 24 18 movq 0x18(%rsp), %rax + // a4: 48 85 c0 testq %rax, %rax + // a7: 74 26 je 0xcf <_JIT_ENTRY+0xcf> + // a9: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // ae: 4a 89 04 f9 movq %rax, (%rcx,%r15,8) + // b2: b8 01 00 00 00 movl $0x1, %eax + // b7: 29 e8 subl %ebp, %eax + // b9: 48 98 cltq + // bb: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // bf: 4c 8b 74 24 10 movq 0x10(%rsp), %r14 + // c4: 48 83 c4 20 addq $0x20, %rsp + // c8: 5d popq %rbp + // c9: ff 25 00 00 00 00 jmpq *(%rip) # 0xcf <_JIT_ENTRY+0xcf> + // 00000000000000cb: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // cf: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // d4: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // d8: 4c 8b 74 24 10 movq 0x10(%rsp), %r14 + // dd: 48 83 c4 20 addq $0x20, %rsp + // e1: 5d popq %rbp + // e2: ff 25 00 00 00 00 jmpq *(%rip) # 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[232] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x4c, 0x89, 0x74, + 0x24, 0x10, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xe8, 0x01, 0xed, 0x89, 0xe9, + 0xf7, 0xd9, 0x4c, 0x63, 0xf9, 0x4a, 0x8d, 0x1c, + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x01, 0xeb, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4b, 0x8d, 0x54, + 0xfd, 0x08, 0x44, 0x0f, 0xb7, 0xe8, 0xbe, 0x02, + 0x00, 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x4d, 0x89, 0xe8, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, + 0x18, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, + 0x44, 0x24, 0x08, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x45, 0x85, 0xed, + 0x74, 0x35, 0x4e, 0x8d, 0x2c, 0x6d, 0x01, 0x00, + 0x00, 0x00, 0x4c, 0x8b, 0x35, 0x00, 0x00, 0x00, + 0x00, 0xeb, 0x0e, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xff, 0xcd, 0x49, 0x83, 0xfd, 0x01, 0x76, + 0x16, 0x4a, 0x8b, 0x7c, 0xeb, 0xf0, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0xec, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0xe6, 0x41, 0xff, 0xd6, 0xeb, 0xe1, 0x48, + 0x8b, 0x44, 0x24, 0x18, 0x48, 0x85, 0xc0, 0x74, + 0x26, 0x48, 0x8b, 0x4c, 0x24, 0x08, 0x4a, 0x89, + 0x04, 0xf9, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, + 0xe8, 0x48, 0x98, 0x4c, 0x8d, 0x2c, 0xc1, 0x4c, + 0x8b, 0x74, 0x24, 0x10, 0x48, 0x83, 0xc4, 0x20, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0x24, 0x08, 0x4e, 0x8d, 0x2c, 0xf8, + 0x4c, 0x8b, 0x74, 0x24, 0x10, 0x48, 0x83, 0xc4, + 0x20, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyDict_FromItems+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_FromItems); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)data + 0x1c); +} + +void +emit__BUILD_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SET.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // c: 44 0f b7 f8 movzwl %ax, %r15d + // 10: 49 f7 df negq %r15 + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 31 ff xorl %edi, %edi + // 1a: ff 15 00 00 00 00 callq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_GOTPCRELX PySet_New-0x4 + // 20: 49 8b 6c 24 40 movq 0x40(%r12), %rbp + // 25: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2e: 48 85 c0 testq %rax, %rax + // 31: 0f 84 ee 00 00 00 je 0x125 <_JIT_ENTRY+0x125> + // 37: 48 89 c3 movq %rax, %rbx + // 3a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 41: 66 85 c0 testw %ax, %ax + // 44: 0f 84 4b 01 00 00 je 0x195 <_JIT_ENTRY+0x195> + // 4a: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // 4f: 4d 89 fe movq %r15, %r14 + // 52: 45 31 ff xorl %r15d, %r15d + // 55: 4c 89 34 24 movq %r14, (%rsp) + // 59: eb 0a jmp 0x65 <_JIT_ENTRY+0x65> + // 5b: 0f 1f 44 00 00 nopl (%rax,%rax) + // 60: 49 ff c6 incq %r14 + // 63: 74 2b je 0x90 <_JIT_ENTRY+0x90> + // 65: 45 85 ff testl %r15d, %r15d + // 68: 75 f6 jne 0x60 <_JIT_ENTRY+0x60> + // 6a: 49 89 6c 24 40 movq %rbp, 0x40(%r12) + // 6f: 4b 8b 74 f5 00 movq (%r13,%r14,8), %rsi + // 74: 48 89 df movq %rbx, %rdi + // 77: ff 15 00 00 00 00 callq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_GOTPCRELX PySet_Add-0x4 + // 7d: 41 89 c7 movl %eax, %r15d + // 80: 49 8b 6c 24 40 movq 0x40(%r12), %rbp + // 85: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8e: eb d0 jmp 0x60 <_JIT_ENTRY+0x60> + // 90: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x97 <_JIT_ENTRY+0x97> + // 0000000000000093: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 97: 66 85 c0 testw %ax, %ax + // 9a: 74 39 je 0xd5 <_JIT_ENTRY+0xd5> + // 9c: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // a4: 49 ff c6 incq %r14 + // a7: 49 83 c5 f8 addq $-0x8, %r13 + // ab: eb 10 jmp 0xbd <_JIT_ENTRY+0xbd> + // ad: 0f 1f 00 nopl (%rax) + // b0: 49 ff ce decq %r14 + // b3: 49 83 c5 f8 addq $-0x8, %r13 + // b7: 49 83 fe 01 cmpq $0x1, %r14 + // bb: 76 18 jbe 0xd5 <_JIT_ENTRY+0xd5> + // bd: 49 8b 7d 00 movq (%r13), %rdi + // c1: 8b 07 movl (%rdi), %eax + // c3: 85 c0 testl %eax, %eax + // c5: 78 e9 js 0xb0 <_JIT_ENTRY+0xb0> + // c7: ff c8 decl %eax + // c9: 89 07 movl %eax, (%rdi) + // cb: 75 e3 jne 0xb0 <_JIT_ENTRY+0xb0> + // cd: ff 15 00 00 00 00 callq *(%rip) # 0xd3 <_JIT_ENTRY+0xd3> + // 00000000000000cf: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // d3: eb db jmp 0xb0 <_JIT_ENTRY+0xb0> + // d5: 45 85 ff testl %r15d, %r15d + // d8: 0f 84 ae 00 00 00 je 0x18c <_JIT_ENTRY+0x18c> + // de: 48 8b 04 24 movq (%rsp), %rax + // e2: 48 8d 04 c5 00 00 00 00 leaq (,%rax,8), %rax + // ea: 48 01 e8 addq %rbp, %rax + // ed: 49 89 44 24 40 movq %rax, 0x40(%r12) + // f2: 8b 03 movl (%rbx), %eax + // f4: 85 c0 testl %eax, %eax + // f6: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // fb: 78 0f js 0x10c <_JIT_ENTRY+0x10c> + // fd: ff c8 decl %eax + // ff: 89 03 movl %eax, (%rbx) + // 101: 75 09 jne 0x10c <_JIT_ENTRY+0x10c> + // 103: 48 89 df movq %rbx, %rdi + // 106: ff 15 00 00 00 00 callq *(%rip) # 0x10c <_JIT_ENTRY+0x10c> + // 0000000000000108: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 10c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 111: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 11a: 48 83 c4 10 addq $0x10, %rsp + // 11e: 5d popq %rbp + // 11f: ff 25 00 00 00 00 jmpq *(%rip) # 0x125 <_JIT_ENTRY+0x125> + // 0000000000000121: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 125: 4c 89 3c 24 movq %r15, (%rsp) + // 129: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x130 <_JIT_ENTRY+0x130> + // 000000000000012c: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 130: 66 85 c0 testw %ax, %ax + // 133: 74 3d je 0x172 <_JIT_ENTRY+0x172> + // 135: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0x13c <_JIT_ENTRY+0x13c> + // 0000000000000138: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 13c: 48 ff c3 incq %rbx + // 13f: 49 83 c5 f8 addq $-0x8, %r13 + // 143: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x14a <_JIT_ENTRY+0x14a> + // 0000000000000146: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // 14a: eb 11 jmp 0x15d <_JIT_ENTRY+0x15d> + // 14c: 0f 1f 40 00 nopl (%rax) + // 150: 48 ff cb decq %rbx + // 153: 49 83 c5 f8 addq $-0x8, %r13 + // 157: 48 83 fb 01 cmpq $0x1, %rbx + // 15b: 76 15 jbe 0x172 <_JIT_ENTRY+0x172> + // 15d: 49 8b 7d 00 movq (%r13), %rdi + // 161: 8b 07 movl (%rdi), %eax + // 163: 85 c0 testl %eax, %eax + // 165: 78 e9 js 0x150 <_JIT_ENTRY+0x150> + // 167: ff c8 decl %eax + // 169: 89 07 movl %eax, (%rdi) + // 16b: 75 e3 jne 0x150 <_JIT_ENTRY+0x150> + // 16d: 41 ff d7 callq *%r15 + // 170: eb de jmp 0x150 <_JIT_ENTRY+0x150> + // 172: 48 8b 04 24 movq (%rsp), %rax + // 176: 4c 8d 2c c5 00 00 00 00 leaq (,%rax,8), %r13 + // 17e: 49 01 ed addq %rbp, %r13 + // 181: 48 83 c4 10 addq $0x10, %rsp + // 185: 5d popq %rbp + // 186: ff 25 00 00 00 00 jmpq *(%rip) # 0x18c <_JIT_ENTRY+0x18c> + // 0000000000000188: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 18c: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 191: 4c 8b 3c 24 movq (%rsp), %r15 + // 195: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x19c <_JIT_ENTRY+0x19c> + // 0000000000000198: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 19c: 0f b7 c0 movzwl %ax, %eax + // 19f: 4a 89 5c fd 00 movq %rbx, (%rbp,%r15,8) + // 1a4: b9 01 00 00 00 movl $0x1, %ecx + // 1a9: 29 c1 subl %eax, %ecx + // 1ab: 48 63 c1 movslq %ecx, %rax + // 1ae: 4c 8d 2c c5 00 00 00 00 leaq (,%rax,8), %r13 + // 1b6: 49 01 ed addq %rbp, %r13 + // 1b9: 48 83 c4 10 addq $0x10, %rsp + // 1bd: 5d popq %rbp + // 1be: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c4 <_JIT_ENTRY+0x1c4> + // 00000000000001c0: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[446] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x0f, 0xb7, 0xf8, + 0x49, 0xf7, 0xdf, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x31, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x0f, 0x84, 0xee, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xc3, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x0f, 0x84, 0x4b, 0x01, + 0x00, 0x00, 0x4c, 0x89, 0x74, 0x24, 0x08, 0x4d, + 0x89, 0xfe, 0x45, 0x31, 0xff, 0x4c, 0x89, 0x34, + 0x24, 0xeb, 0x0a, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xff, 0xc6, 0x74, 0x2b, 0x45, 0x85, 0xff, + 0x75, 0xf6, 0x49, 0x89, 0x6c, 0x24, 0x40, 0x4b, + 0x8b, 0x74, 0xf5, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, 0xc7, + 0x49, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0xeb, 0xd0, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x39, 0x44, 0x0f, 0xb7, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xc6, 0x49, + 0x83, 0xc5, 0xf8, 0xeb, 0x10, 0x0f, 0x1f, 0x00, + 0x49, 0xff, 0xce, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xfe, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x45, 0x85, 0xff, + 0x0f, 0x84, 0xae, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x04, 0x24, 0x48, 0x8d, 0x04, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x01, 0xe8, 0x49, 0x89, 0x44, + 0x24, 0x40, 0x8b, 0x03, 0x85, 0xc0, 0x4c, 0x8b, + 0x74, 0x24, 0x08, 0x78, 0x0f, 0xff, 0xc8, 0x89, + 0x03, 0x75, 0x09, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x3c, + 0x24, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc0, 0x74, 0x3d, 0x0f, 0xb7, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc3, 0x49, + 0x83, 0xc5, 0xf8, 0x4c, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x8b, 0x04, 0x24, 0x4c, 0x8d, + 0x2c, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x01, + 0xed, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x74, 0x24, + 0x08, 0x4c, 0x8b, 0x3c, 0x24, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc0, 0x4a, + 0x89, 0x5c, 0xfd, 0x00, 0xb9, 0x01, 0x00, 0x00, + 0x00, 0x29, 0xc1, 0x48, 0x63, 0xc1, 0x4c, 0x8d, + 0x2c, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x01, + 0xed, 0x48, 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: OPARG + // 8: &PySet_New+0x0 + // 10: &PySet_Add+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySet_New); + patch_64(data + 0x10, (uintptr_t)&PySet_Add); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + -0x4); + patch_32r(code + 0xa0, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xcf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x108, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x121, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x12c, (uintptr_t)data + -0x4); + patch_32r(code + 0x138, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x146, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x188, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x198, (uintptr_t)data + -0x4); +} + +void +emit__BUILD_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SLICE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // c: 0f b7 d0 movzwl %ax, %edx + // f: 8d 0c d5 00 00 00 00 leal (,%rdx,8), %ecx + // 16: 4c 89 eb movq %r13, %rbx + // 19: 48 29 cb subq %rcx, %rbx + // 1c: 48 8b 3b movq (%rbx), %rdi + // 1f: 48 8b 73 08 movq 0x8(%rbx), %rsi + // 23: 66 83 f8 03 cmpw $0x3, %ax + // 27: 4c 89 74 24 10 movq %r14, 0x10(%rsp) + // 2c: 4c 89 64 24 08 movq %r12, 0x8(%rsp) + // 31: 48 89 54 24 18 movq %rdx, 0x18(%rsp) + // 36: 75 06 jne 0x3e <_JIT_ENTRY+0x3e> + // 38: 48 8b 53 10 movq 0x10(%rbx), %rdx + // 3c: eb 02 jmp 0x40 <_JIT_ENTRY+0x40> + // 3e: 31 d2 xorl %edx, %edx + // 40: ff 15 00 00 00 00 callq *(%rip) # 0x46 <_JIT_ENTRY+0x46> + // 0000000000000042: R_X86_64_GOTPCRELX PySlice_New-0x4 + // 46: 49 89 c7 movq %rax, %r15 + // 49: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 50: 66 85 c0 testw %ax, %ax + // 53: 74 3c je 0x91 <_JIT_ENTRY+0x91> + // 55: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 5c: 48 ff c5 incq %rbp + // 5f: 4d 8d 75 f8 leaq -0x8(%r13), %r14 + // 63: 4c 8b 25 00 00 00 00 movq (%rip), %r12 # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // 6a: eb 11 jmp 0x7d <_JIT_ENTRY+0x7d> + // 6c: 0f 1f 40 00 nopl (%rax) + // 70: 48 ff cd decq %rbp + // 73: 49 83 c6 f8 addq $-0x8, %r14 + // 77: 48 83 fd 01 cmpq $0x1, %rbp + // 7b: 76 14 jbe 0x91 <_JIT_ENTRY+0x91> + // 7d: 49 8b 3e movq (%r14), %rdi + // 80: 8b 07 movl (%rdi), %eax + // 82: 85 c0 testl %eax, %eax + // 84: 78 ea js 0x70 <_JIT_ENTRY+0x70> + // 86: ff c8 decl %eax + // 88: 89 07 movl %eax, (%rdi) + // 8a: 75 e4 jne 0x70 <_JIT_ENTRY+0x70> + // 8c: 41 ff d4 callq *%r12 + // 8f: eb df jmp 0x70 <_JIT_ENTRY+0x70> + // 91: 4d 85 ff testq %r15, %r15 + // 94: 74 28 je 0xbe <_JIT_ENTRY+0xbe> + // 96: 4c 89 3b movq %r15, (%rbx) + // 99: b8 01 00 00 00 movl $0x1, %eax + // 9e: 2b 44 24 18 subl 0x18(%rsp), %eax + // a2: 48 98 cltq + // a4: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // a9: 4c 8b 64 24 08 movq 0x8(%rsp), %r12 + // ae: 4c 8b 74 24 10 movq 0x10(%rsp), %r14 + // b3: 48 83 c4 20 addq $0x20, %rsp + // b7: 5d popq %rbp + // b8: ff 25 00 00 00 00 jmpq *(%rip) # 0xbe <_JIT_ENTRY+0xbe> + // 00000000000000ba: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // be: 4c 8b 64 24 08 movq 0x8(%rsp), %r12 + // c3: 49 89 dd movq %rbx, %r13 + // c6: 4c 8b 74 24 10 movq 0x10(%rsp), %r14 + // cb: 48 83 c4 20 addq $0x20, %rsp + // cf: 5d popq %rbp + // d0: ff 25 00 00 00 00 jmpq *(%rip) # 0xd6 <_JIT_ENTRY+0xd6> + // 00000000000000d2: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[214] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd0, 0x8d, + 0x0c, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xeb, 0x48, 0x29, 0xcb, 0x48, 0x8b, 0x3b, 0x48, + 0x8b, 0x73, 0x08, 0x66, 0x83, 0xf8, 0x03, 0x4c, + 0x89, 0x74, 0x24, 0x10, 0x4c, 0x89, 0x64, 0x24, + 0x08, 0x48, 0x89, 0x54, 0x24, 0x18, 0x75, 0x06, + 0x48, 0x8b, 0x53, 0x10, 0xeb, 0x02, 0x31, 0xd2, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0xc7, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc0, 0x74, 0x3c, 0x0f, 0xb7, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc5, 0x4d, + 0x8d, 0x75, 0xf8, 0x4c, 0x8b, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc6, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x3e, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xea, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0xe4, 0x41, 0xff, 0xd4, 0xeb, + 0xdf, 0x4d, 0x85, 0xff, 0x74, 0x28, 0x4c, 0x89, + 0x3b, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x44, + 0x24, 0x18, 0x48, 0x98, 0x4d, 0x8d, 0x6c, 0xc5, + 0x00, 0x4c, 0x8b, 0x64, 0x24, 0x08, 0x4c, 0x8b, + 0x74, 0x24, 0x10, 0x48, 0x83, 0xc4, 0x20, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, + 0x64, 0x24, 0x08, 0x49, 0x89, 0xdd, 0x4c, 0x8b, + 0x74, 0x24, 0x10, 0x48, 0x83, 0xc4, 0x20, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PySlice_New+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySlice_New); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x42, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + -0x4); + patch_32r(code + 0x58, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xba, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + 0x1c); +} + +void +emit__BUILD_STRING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_STRING.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // a: 4c 89 24 24 movq %r12, (%rsp) + // e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 15: 0f b7 e8 movzwl %ax, %ebp + // 18: 8d 04 ed 00 00 00 00 leal (,%rbp,8), %eax + // 1f: 4c 89 eb movq %r13, %rbx + // 22: 48 29 c3 subq %rax, %rbx + // 25: bf 30 8a 00 00 movl $0x8a30, %edi # imm = 0x8A30 + // 2a: 48 03 3d 00 00 00 00 addq (%rip), %rdi # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 31: 48 89 de movq %rbx, %rsi + // 34: 48 89 ea movq %rbp, %rdx + // 37: ff 15 00 00 00 00 callq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _PyUnicode_JoinArray-0x4 + // 3d: 49 89 c4 movq %rax, %r12 + // 40: 66 85 ed testw %bp, %bp + // 43: 74 3c je 0x81 <_JIT_ENTRY+0x81> + // 45: 48 ff c5 incq %rbp + // 48: 4d 8d 7d f8 leaq -0x8(%r13), %r15 + // 4c: 4c 8b 35 00 00 00 00 movq (%rip), %r14 # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // 53: eb 18 jmp 0x6d <_JIT_ENTRY+0x6d> + // 55: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 60: 48 ff cd decq %rbp + // 63: 49 83 c7 f8 addq $-0x8, %r15 + // 67: 48 83 fd 01 cmpq $0x1, %rbp + // 6b: 76 14 jbe 0x81 <_JIT_ENTRY+0x81> + // 6d: 49 8b 3f movq (%r15), %rdi + // 70: 8b 07 movl (%rdi), %eax + // 72: 85 c0 testl %eax, %eax + // 74: 78 ea js 0x60 <_JIT_ENTRY+0x60> + // 76: ff c8 decl %eax + // 78: 89 07 movl %eax, (%rdi) + // 7a: 75 e4 jne 0x60 <_JIT_ENTRY+0x60> + // 7c: 41 ff d6 callq *%r14 + // 7f: eb df jmp 0x60 <_JIT_ENTRY+0x60> + // 81: 4d 85 e4 testq %r12, %r12 + // 84: 74 30 je 0xb6 <_JIT_ENTRY+0xb6> + // 86: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8d: 0f b7 c0 movzwl %ax, %eax + // 90: 4c 89 23 movq %r12, (%rbx) + // 93: b9 01 00 00 00 movl $0x1, %ecx + // 98: 29 c1 subl %eax, %ecx + // 9a: 48 63 c1 movslq %ecx, %rax + // 9d: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // a2: 4c 8b 24 24 movq (%rsp), %r12 + // a6: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // ab: 48 83 c4 10 addq $0x10, %rsp + // af: 5d popq %rbp + // b0: ff 25 00 00 00 00 jmpq *(%rip) # 0xb6 <_JIT_ENTRY+0xb6> + // 00000000000000b2: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // b6: 4c 8b 24 24 movq (%rsp), %r12 + // ba: 49 89 dd movq %rbx, %r13 + // bd: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // c2: 48 83 c4 10 addq $0x10, %rsp + // c6: 5d popq %rbp + // c7: ff 25 00 00 00 00 jmpq *(%rip) # 0xcd <_JIT_ENTRY+0xcd> + // 00000000000000c9: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[205] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4c, 0x89, 0x74, + 0x24, 0x08, 0x4c, 0x89, 0x24, 0x24, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xe8, + 0x8d, 0x04, 0xed, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xeb, 0x48, 0x29, 0xc3, 0xbf, 0x30, 0x8a, + 0x00, 0x00, 0x48, 0x03, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xde, 0x48, 0x89, 0xea, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc4, + 0x66, 0x85, 0xed, 0x74, 0x3c, 0x48, 0xff, 0xc5, + 0x4d, 0x8d, 0x7d, 0xf8, 0x4c, 0x8b, 0x35, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x18, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc7, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x3f, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xea, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0xe4, 0x41, 0xff, 0xd6, 0xeb, + 0xdf, 0x4d, 0x85, 0xe4, 0x74, 0x30, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc0, + 0x4c, 0x89, 0x23, 0xb9, 0x01, 0x00, 0x00, 0x00, + 0x29, 0xc1, 0x48, 0x63, 0xc1, 0x4d, 0x8d, 0x6c, + 0xc5, 0x00, 0x4c, 0x8b, 0x24, 0x24, 0x4c, 0x8b, + 0x74, 0x24, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, + 0x24, 0x24, 0x49, 0x89, 0xdd, 0x4c, 0x8b, 0x74, + 0x24, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_JoinArray+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_JoinArray); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)data + 0x24); +} + +void +emit__BUILD_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8: 41 0f b7 f7 movzwl %r15w, %esi + // c: 8d 04 f5 00 00 00 00 leal (,%rsi,8), %eax + // 13: 4c 89 eb movq %r13, %rbx + // 16: 48 29 c3 subq %rax, %rbx + // 19: 48 89 df movq %rbx, %rdi + // 1c: ff 15 00 00 00 00 callq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _PyTuple_FromStackRefStealOnSuccess-0x4 + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 1c je 0x43 <_JIT_ENTRY+0x43> + // 27: 41 0f b7 cf movzwl %r15w, %ecx + // 2b: 48 89 03 movq %rax, (%rbx) + // 2e: b8 01 00 00 00 movl $0x1, %eax + // 33: 29 c8 subl %ecx, %eax + // 35: 48 98 cltq + // 37: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 3c: 58 popq %rax + // 3d: ff 25 00 00 00 00 jmpq *(%rip) # 0x43 <_JIT_ENTRY+0x43> + // 000000000000003f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 43: 58 popq %rax + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[74] = { + 0x50, 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x0f, 0xb7, 0xf7, 0x8d, 0x04, 0xf5, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xeb, 0x48, 0x29, + 0xc3, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1c, 0x41, + 0x0f, 0xb7, 0xcf, 0x48, 0x89, 0x03, 0xb8, 0x01, + 0x00, 0x00, 0x00, 0x29, 0xc8, 0x48, 0x98, 0x4d, + 0x8d, 0x6c, 0xc5, 0x00, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyTuple_FromStackRefStealOnSuccess+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyTuple_FromStackRefStealOnSuccess); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x14); +} + +void +emit__CALL_BUILTIN_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_CLASS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 11: 29 c8 subl %ecx, %eax + // 13: 4c 63 f8 movslq %eax, %r15 + // 16: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // 1b: 48 8b 47 08 movq 0x8(%rdi), %rax + // 1f: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 26: 0f 84 e5 00 00 00 je 0x111 <_JIT_ENTRY+0x111> + // 2c: 48 8b 87 90 01 00 00 movq 0x190(%rdi), %rax + // 33: 48 85 c0 testq %rax, %rax + // 36: 0f 84 d5 00 00 00 je 0x111 <_JIT_ENTRY+0x111> + // 3c: 8d 14 cd 00 00 00 00 leal (,%rcx,8), %edx + // 43: 4c 89 ee movq %r13, %rsi + // 46: 48 29 d6 subq %rdx, %rsi + // 49: 89 ca movl %ecx, %edx + // 4b: f7 d2 notl %edx + // 4d: 48 63 da movslq %edx, %rbx + // 50: 45 31 c0 xorl %r8d, %r8d + // 53: 31 d2 xorl %edx, %edx + // 55: 49 83 7c dd 00 00 cmpq $0x0, (%r13,%rbx,8) + // 5b: 41 0f 94 c0 sete %r8b + // 5f: 0f 95 c2 setne %dl + // 62: 01 ca addl %ecx, %edx + // 64: 4a 8d 34 c6 leaq (%rsi,%r8,8), %rsi + // 68: 48 83 c6 f8 addq $-0x8, %rsi + // 6c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 71: 31 c9 xorl %ecx, %ecx + // 73: ff d0 callq *%rax + // 75: 48 89 44 24 18 movq %rax, 0x18(%rsp) + // 7a: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 7f: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 84: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8d: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // 92: 8b 07 movl (%rdi), %eax + // 94: 85 c0 testl %eax, %eax + // 96: 78 0c js 0xa4 <_JIT_ENTRY+0xa4> + // 98: ff c8 decl %eax + // 9a: 89 07 movl %eax, (%rdi) + // 9c: 75 06 jne 0xa4 <_JIT_ENTRY+0xa4> + // 9e: ff 15 00 00 00 00 callq *(%rip) # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a4: 48 89 5c 24 10 movq %rbx, 0x10(%rsp) + // a9: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // ae: 48 85 ff testq %rdi, %rdi + // b1: 74 12 je 0xc5 <_JIT_ENTRY+0xc5> + // b3: 8b 07 movl (%rdi), %eax + // b5: 85 c0 testl %eax, %eax + // b7: 78 0c js 0xc5 <_JIT_ENTRY+0xc5> + // b9: ff c8 decl %eax + // bb: 89 07 movl %eax, (%rdi) + // bd: 75 06 jne 0xc5 <_JIT_ENTRY+0xc5> + // bf: ff 15 00 00 00 00 callq *(%rip) # 0xc5 <_JIT_ENTRY+0xc5> + // 00000000000000c1: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // c5: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000c8: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // cc: 66 85 c0 testw %ax, %ax + // cf: 74 4b je 0x11c <_JIT_ENTRY+0x11c> + // d1: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d4: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // d8: 48 ff c3 incq %rbx + // db: 49 83 c5 f8 addq $-0x8, %r13 + // df: 48 8b 2d 00 00 00 00 movq (%rip), %rbp # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // e6: eb 15 jmp 0xfd <_JIT_ENTRY+0xfd> + // e8: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // f0: 48 ff cb decq %rbx + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 48 83 fb 01 cmpq $0x1, %rbx + // fb: 76 1f jbe 0x11c <_JIT_ENTRY+0x11c> + // fd: 49 8b 7d 00 movq (%r13), %rdi + // 101: 8b 07 movl (%rdi), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <_JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 07 movl %eax, (%rdi) + // 10b: 75 e3 jne 0xf0 <_JIT_ENTRY+0xf0> + // 10d: ff d5 callq *%rbp + // 10f: eb df jmp 0xf0 <_JIT_ENTRY+0xf0> + // 111: 48 83 c4 20 addq $0x20, %rsp + // 115: 5d popq %rbp + // 116: ff 25 00 00 00 00 jmpq *(%rip) # 0x11c <_JIT_ENTRY+0x11c> + // 0000000000000118: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 11c: 48 8b 44 24 18 movq 0x18(%rsp), %rax + // 121: 48 85 c0 testq %rax, %rax + // 124: 74 1d je 0x143 <_JIT_ENTRY+0x143> + // 126: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 12b: 4a 89 04 f9 movq %rax, (%rcx,%r15,8) + // 12f: 48 8b 44 24 10 movq 0x10(%rsp), %rax + // 134: 4c 8d 2c c1 leaq (%rcx,%rax,8), %r13 + // 138: 48 83 c4 20 addq $0x20, %rsp + // 13c: 5d popq %rbp + // 13d: ff 25 00 00 00 00 jmpq *(%rip) # 0x143 <_JIT_ENTRY+0x143> + // 000000000000013f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 143: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // 148: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 14c: 48 83 c4 20 addq $0x20, %rsp + // 150: 5d popq %rbp + // 151: ff 25 00 00 00 00 jmpq *(%rip) # 0x157 <_JIT_ENTRY+0x157> + // 0000000000000153: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[343] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xc8, 0x4c, 0x63, 0xf8, 0x4b, 0x8b, + 0x7c, 0xfd, 0x00, 0x48, 0x8b, 0x47, 0x08, 0xf6, + 0x80, 0xab, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x84, + 0xe5, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x87, 0x90, + 0x01, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x0f, 0x84, + 0xd5, 0x00, 0x00, 0x00, 0x8d, 0x14, 0xcd, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, 0x48, 0x29, + 0xd6, 0x89, 0xca, 0xf7, 0xd2, 0x48, 0x63, 0xda, + 0x45, 0x31, 0xc0, 0x31, 0xd2, 0x49, 0x83, 0x7c, + 0xdd, 0x00, 0x00, 0x41, 0x0f, 0x94, 0xc0, 0x0f, + 0x95, 0xc2, 0x01, 0xca, 0x4a, 0x8d, 0x34, 0xc6, + 0x48, 0x83, 0xc6, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x31, 0xc9, 0xff, 0xd0, 0x48, 0x89, 0x44, + 0x24, 0x18, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, + 0x89, 0x44, 0x24, 0x08, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x7c, + 0xfd, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x5c, 0x24, + 0x10, 0x49, 0x8b, 0x7c, 0xdd, 0x00, 0x48, 0x85, + 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x4b, 0x0f, 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc3, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x8b, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x15, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x1f, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0xd5, 0xeb, + 0xdf, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x44, 0x24, + 0x18, 0x48, 0x85, 0xc0, 0x74, 0x1d, 0x48, 0x8b, + 0x4c, 0x24, 0x08, 0x4a, 0x89, 0x04, 0xf9, 0x48, + 0x8b, 0x44, 0x24, 0x10, 0x4c, 0x8d, 0x2c, 0xc1, + 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x44, 0x24, 0x08, + 0x4e, 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x20, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + // 10: JUMP_TARGET + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc1, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xc8, (uintptr_t)data + -0x4); + patch_32r(code + 0xd4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x118, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x13f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x153, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_BUILTIN_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 4c 63 f9 movslq %ecx, %r15 + // 13: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 18: 29 c1 subl %eax, %ecx + // 1a: 48 63 e9 movslq %ecx, %rbp + // 1d: 49 8b 4c ed 00 movq (%r13,%rbp,8), %rcx + // 22: 31 d2 xorl %edx, %edx + // 24: 31 f6 xorl %esi, %esi + // 26: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2c: 0f 95 c3 setne %bl + // 2f: 41 0f 94 c0 sete %r8b + // 33: 48 8b 79 08 movq 0x8(%rcx), %rdi + // 37: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_REX_GOTPCRELX PyCFunction_Type-0x4 + // 3e: 0f 85 d1 00 00 00 jne 0x115 <_JIT_ENTRY+0x115> + // 44: 48 8b 79 10 movq 0x10(%rcx), %rdi + // 48: 81 7f 10 80 00 00 00 cmpl $0x80, 0x10(%rdi) + // 4f: 0f 85 c0 00 00 00 jne 0x115 <_JIT_ENTRY+0x115> + // 55: 44 8d 0c c5 00 00 00 00 leal (,%rax,8), %r9d + // 5d: 4d 89 ea movq %r13, %r10 + // 60: 4d 29 ca subq %r9, %r10 + // 63: 44 88 c6 movb %r8b, %sil + // 66: 49 8d 34 f2 leaq (%r10,%rsi,8), %rsi + // 6a: 48 83 c6 f8 addq $-0x8, %rsi + // 6e: 88 da movb %bl, %dl + // 70: 01 c2 addl %eax, %edx + // 72: 48 8b 47 08 movq 0x8(%rdi), %rax + // 76: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7b: 48 8b 79 18 movq 0x18(%rcx), %rdi + // 7f: 89 d2 movl %edx, %edx + // 81: ff d0 callq *%rax + // 83: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 88: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 8d: 48 89 04 24 movq %rax, (%rsp) + // 91: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9a: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // 9f: 8b 07 movl (%rdi), %eax + // a1: 85 c0 testl %eax, %eax + // a3: 78 0c js 0xb1 <_JIT_ENTRY+0xb1> + // a5: ff c8 decl %eax + // a7: 89 07 movl %eax, (%rdi) + // a9: 75 06 jne 0xb1 <_JIT_ENTRY+0xb1> + // ab: ff 15 00 00 00 00 callq *(%rip) # 0xb1 <_JIT_ENTRY+0xb1> + // 00000000000000ad: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b1: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // b6: 48 85 ff testq %rdi, %rdi + // b9: 74 12 je 0xcd <_JIT_ENTRY+0xcd> + // bb: 8b 07 movl (%rdi), %eax + // bd: 85 c0 testl %eax, %eax + // bf: 78 0c js 0xcd <_JIT_ENTRY+0xcd> + // c1: ff c8 decl %eax + // c3: 89 07 movl %eax, (%rdi) + // c5: 75 06 jne 0xcd <_JIT_ENTRY+0xcd> + // c7: ff 15 00 00 00 00 callq *(%rip) # 0xcd <_JIT_ENTRY+0xcd> + // 00000000000000c9: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // cd: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // d4: 66 85 c0 testw %ax, %ax + // d7: 74 47 je 0x120 <_JIT_ENTRY+0x120> + // d9: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xe0 <_JIT_ENTRY+0xe0> + // 00000000000000dc: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // e0: 48 ff c3 incq %rbx + // e3: 49 83 c5 f8 addq $-0x8, %r13 + // e7: eb 14 jmp 0xfd <_JIT_ENTRY+0xfd> + // e9: 0f 1f 80 00 00 00 00 nopl (%rax) + // f0: 48 ff cb decq %rbx + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 48 83 fb 01 cmpq $0x1, %rbx + // fb: 76 23 jbe 0x120 <_JIT_ENTRY+0x120> + // fd: 49 8b 7d 00 movq (%r13), %rdi + // 101: 8b 07 movl (%rdi), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <_JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 07 movl %eax, (%rdi) + // 10b: 75 e3 jne 0xf0 <_JIT_ENTRY+0xf0> + // 10d: ff 15 00 00 00 00 callq *(%rip) # 0x113 <_JIT_ENTRY+0x113> + // 000000000000010f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 113: eb db jmp 0xf0 <_JIT_ENTRY+0xf0> + // 115: 48 83 c4 10 addq $0x10, %rsp + // 119: 5d popq %rbp + // 11a: ff 25 00 00 00 00 jmpq *(%rip) # 0x120 <_JIT_ENTRY+0x120> + // 000000000000011c: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 120: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 125: 48 85 c9 testq %rcx, %rcx + // 128: 74 17 je 0x141 <_JIT_ENTRY+0x141> + // 12a: 48 8b 04 24 movq (%rsp), %rax + // 12e: 48 89 0c e8 movq %rcx, (%rax,%rbp,8) + // 132: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 136: 48 83 c4 10 addq $0x10, %rsp + // 13a: 5d popq %rbp + // 13b: ff 25 00 00 00 00 jmpq *(%rip) # 0x141 <_JIT_ENTRY+0x141> + // 000000000000013d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 141: 48 8b 04 24 movq (%rsp), %rax + // 145: 4c 8d 2c e8 leaq (%rax,%rbp,8), %r13 + // 149: 48 83 c4 10 addq $0x10, %rsp + // 14d: 5d popq %rbp + // 14e: ff 25 00 00 00 00 jmpq *(%rip) # 0x154 <_JIT_ENTRY+0x154> + // 0000000000000150: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[340] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x4c, 0x63, 0xf9, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xe9, 0x49, 0x8b, 0x4c, + 0xed, 0x00, 0x31, 0xd2, 0x31, 0xf6, 0x4b, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x0f, 0x95, 0xc3, 0x41, + 0x0f, 0x94, 0xc0, 0x48, 0x8b, 0x79, 0x08, 0x48, + 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, + 0xd1, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x79, 0x10, + 0x81, 0x7f, 0x10, 0x80, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0xc0, 0x00, 0x00, 0x00, 0x44, 0x8d, 0x0c, + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xea, + 0x4d, 0x29, 0xca, 0x44, 0x88, 0xc6, 0x49, 0x8d, + 0x34, 0xf2, 0x48, 0x83, 0xc6, 0xf8, 0x88, 0xda, + 0x01, 0xc2, 0x48, 0x8b, 0x47, 0x08, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x79, 0x18, 0x89, + 0xd2, 0xff, 0xd0, 0x48, 0x89, 0x44, 0x24, 0x08, + 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, 0x04, + 0x24, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x7c, 0xed, 0x00, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x85, + 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x47, 0x0f, 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc3, 0x49, 0x83, 0xc5, 0xf8, 0xeb, + 0x14, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x23, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x4c, 0x24, 0x08, 0x48, 0x85, 0xc9, + 0x74, 0x17, 0x48, 0x8b, 0x04, 0x24, 0x48, 0x89, + 0x0c, 0xe8, 0x4e, 0x8d, 0x2c, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x04, 0x24, 0x4c, 0x8d, 0x2c, + 0xe8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: JUMP_TARGET + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + -0x4); + patch_32r(code + 0xdc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x11c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x13d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x150, (uintptr_t)data + 0x24); +} + +void +emit__CALL_BUILTIN_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST_WITH_KEYWORDS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 4c 63 f9 movslq %ecx, %r15 + // 13: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 18: 29 c1 subl %eax, %ecx + // 1a: 48 63 e9 movslq %ecx, %rbp + // 1d: 49 8b 4c ed 00 movq (%r13,%rbp,8), %rcx + // 22: 31 d2 xorl %edx, %edx + // 24: 31 f6 xorl %esi, %esi + // 26: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2c: 0f 95 c3 setne %bl + // 2f: 41 0f 94 c0 sete %r8b + // 33: 48 8b 79 08 movq 0x8(%rcx), %rdi + // 37: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_REX_GOTPCRELX PyCFunction_Type-0x4 + // 3e: 0f 85 d1 00 00 00 jne 0x115 <_JIT_ENTRY+0x115> + // 44: 48 8b 79 10 movq 0x10(%rcx), %rdi + // 48: 81 7f 10 82 00 00 00 cmpl $0x82, 0x10(%rdi) + // 4f: 0f 85 c0 00 00 00 jne 0x115 <_JIT_ENTRY+0x115> + // 55: 44 8d 0c c5 00 00 00 00 leal (,%rax,8), %r9d + // 5d: 4d 89 ea movq %r13, %r10 + // 60: 4d 29 ca subq %r9, %r10 + // 63: 44 88 c6 movb %r8b, %sil + // 66: 49 8d 34 f2 leaq (%r10,%rsi,8), %rsi + // 6a: 48 83 c6 f8 addq $-0x8, %rsi + // 6e: 88 da movb %bl, %dl + // 70: 01 c2 addl %eax, %edx + // 72: 48 8b 47 08 movq 0x8(%rdi), %rax + // 76: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7b: 48 8b 79 18 movq 0x18(%rcx), %rdi + // 7f: 89 d2 movl %edx, %edx + // 81: 31 c9 xorl %ecx, %ecx + // 83: ff d0 callq *%rax + // 85: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 8a: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 8f: 48 89 04 24 movq %rax, (%rsp) + // 93: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9c: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // a1: 8b 07 movl (%rdi), %eax + // a3: 85 c0 testl %eax, %eax + // a5: 78 0c js 0xb3 <_JIT_ENTRY+0xb3> + // a7: ff c8 decl %eax + // a9: 89 07 movl %eax, (%rdi) + // ab: 75 06 jne 0xb3 <_JIT_ENTRY+0xb3> + // ad: ff 15 00 00 00 00 callq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b3: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // b8: 48 85 ff testq %rdi, %rdi + // bb: 74 12 je 0xcf <_JIT_ENTRY+0xcf> + // bd: 8b 07 movl (%rdi), %eax + // bf: 85 c0 testl %eax, %eax + // c1: 78 0c js 0xcf <_JIT_ENTRY+0xcf> + // c3: ff c8 decl %eax + // c5: 89 07 movl %eax, (%rdi) + // c7: 75 06 jne 0xcf <_JIT_ENTRY+0xcf> + // c9: ff 15 00 00 00 00 callq *(%rip) # 0xcf <_JIT_ENTRY+0xcf> + // 00000000000000cb: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // cf: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xd6 <_JIT_ENTRY+0xd6> + // 00000000000000d2: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // d6: 66 85 c0 testw %ax, %ax + // d9: 74 45 je 0x120 <_JIT_ENTRY+0x120> + // db: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xe2 <_JIT_ENTRY+0xe2> + // 00000000000000de: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // e2: 48 ff c3 incq %rbx + // e5: 49 83 c5 f8 addq $-0x8, %r13 + // e9: eb 12 jmp 0xfd <_JIT_ENTRY+0xfd> + // eb: 0f 1f 44 00 00 nopl (%rax,%rax) + // f0: 48 ff cb decq %rbx + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 48 83 fb 01 cmpq $0x1, %rbx + // fb: 76 23 jbe 0x120 <_JIT_ENTRY+0x120> + // fd: 49 8b 7d 00 movq (%r13), %rdi + // 101: 8b 07 movl (%rdi), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <_JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 07 movl %eax, (%rdi) + // 10b: 75 e3 jne 0xf0 <_JIT_ENTRY+0xf0> + // 10d: ff 15 00 00 00 00 callq *(%rip) # 0x113 <_JIT_ENTRY+0x113> + // 000000000000010f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 113: eb db jmp 0xf0 <_JIT_ENTRY+0xf0> + // 115: 48 83 c4 10 addq $0x10, %rsp + // 119: 5d popq %rbp + // 11a: ff 25 00 00 00 00 jmpq *(%rip) # 0x120 <_JIT_ENTRY+0x120> + // 000000000000011c: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 120: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 125: 48 85 c9 testq %rcx, %rcx + // 128: 74 17 je 0x141 <_JIT_ENTRY+0x141> + // 12a: 48 8b 04 24 movq (%rsp), %rax + // 12e: 48 89 0c e8 movq %rcx, (%rax,%rbp,8) + // 132: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 136: 48 83 c4 10 addq $0x10, %rsp + // 13a: 5d popq %rbp + // 13b: ff 25 00 00 00 00 jmpq *(%rip) # 0x141 <_JIT_ENTRY+0x141> + // 000000000000013d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 141: 48 8b 04 24 movq (%rsp), %rax + // 145: 4c 8d 2c e8 leaq (%rax,%rbp,8), %r13 + // 149: 48 83 c4 10 addq $0x10, %rsp + // 14d: 5d popq %rbp + // 14e: ff 25 00 00 00 00 jmpq *(%rip) # 0x154 <_JIT_ENTRY+0x154> + // 0000000000000150: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[340] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x4c, 0x63, 0xf9, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xe9, 0x49, 0x8b, 0x4c, + 0xed, 0x00, 0x31, 0xd2, 0x31, 0xf6, 0x4b, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x0f, 0x95, 0xc3, 0x41, + 0x0f, 0x94, 0xc0, 0x48, 0x8b, 0x79, 0x08, 0x48, + 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, + 0xd1, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x79, 0x10, + 0x81, 0x7f, 0x10, 0x82, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0xc0, 0x00, 0x00, 0x00, 0x44, 0x8d, 0x0c, + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xea, + 0x4d, 0x29, 0xca, 0x44, 0x88, 0xc6, 0x49, 0x8d, + 0x34, 0xf2, 0x48, 0x83, 0xc6, 0xf8, 0x88, 0xda, + 0x01, 0xc2, 0x48, 0x8b, 0x47, 0x08, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x79, 0x18, 0x89, + 0xd2, 0x31, 0xc9, 0xff, 0xd0, 0x48, 0x89, 0x44, + 0x24, 0x08, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, + 0x89, 0x04, 0x24, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7c, 0xed, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, + 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x45, 0x0f, 0xb7, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0xc3, 0x49, 0x83, 0xc5, + 0xf8, 0xeb, 0x12, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x23, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x4c, 0x24, 0x08, 0x48, 0x85, 0xc9, + 0x74, 0x17, 0x48, 0x8b, 0x04, 0x24, 0x48, 0x89, + 0x0c, 0xe8, 0x4e, 0x8d, 0x2c, 0xf8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x04, 0x24, 0x4c, 0x8d, 0x2c, + 0xe8, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: JUMP_TARGET + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + -0x4); + patch_32r(code + 0xde, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x11c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x13d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x150, (uintptr_t)data + 0x24); +} + +void +emit__CALL_BUILTIN_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_O.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 89 c1 movl %eax, %ecx + // a: f7 d1 notl %ecx + // c: 48 63 d1 movslq %ecx, %rdx + // f: 31 c9 xorl %ecx, %ecx + // 11: 31 f6 xorl %esi, %esi + // 13: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 19: 0f 94 c2 sete %dl + // 1c: 40 0f 95 c6 setne %sil + // 20: 01 c6 addl %eax, %esi + // 22: 83 fe 01 cmpl $0x1, %esi + // 25: 0f 85 cd 00 00 00 jne 0xf8 <_JIT_ENTRY+0xf8> + // 2b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 30: 29 c6 subl %eax, %esi + // 32: 48 63 ee movslq %esi, %rbp + // 35: 49 8b 74 ed 00 movq (%r13,%rbp,8), %rsi + // 3a: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 3e: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_REX_GOTPCRELX PyCFunction_Type-0x4 + // 45: 0f 85 ad 00 00 00 jne 0xf8 <_JIT_ENTRY+0xf8> + // 4b: 48 8b 7e 10 movq 0x10(%rsi), %rdi + // 4f: 83 7f 10 08 cmpl $0x8, 0x10(%rdi) + // 53: 0f 85 9f 00 00 00 jne 0xf8 <_JIT_ENTRY+0xf8> + // 59: 41 8b 5e 34 movl 0x34(%r14), %ebx + // 5d: 85 db testl %ebx, %ebx + // 5f: 0f 8e 93 00 00 00 jle 0xf8 <_JIT_ENTRY+0xf8> + // 65: c1 e0 03 shll $0x3, %eax + // 68: 4d 89 e8 movq %r13, %r8 + // 6b: 49 29 c0 subq %rax, %r8 + // 6e: 88 d1 movb %dl, %cl + // 70: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 78: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 7c: 4d 8b 3c 00 movq (%r8,%rax), %r15 + // 80: ff cb decl %ebx + // 82: 41 89 5e 34 movl %ebx, 0x34(%r14) + // 86: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8b: 48 8b 7e 18 movq 0x18(%rsi), %rdi + // 8f: 4c 89 fe movq %r15, %rsi + // 92: ff d1 callq *%rcx + // 94: 41 ff 46 34 incl 0x34(%r14) + // 98: 48 89 c3 movq %rax, %rbx + // 9b: 41 8b 07 movl (%r15), %eax + // 9e: 85 c0 testl %eax, %eax + // a0: 78 10 js 0xb2 <_JIT_ENTRY+0xb2> + // a2: ff c8 decl %eax + // a4: 41 89 07 movl %eax, (%r15) + // a7: 75 09 jne 0xb2 <_JIT_ENTRY+0xb2> + // a9: 4c 89 ff movq %r15, %rdi + // ac: ff 15 00 00 00 00 callq *(%rip) # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b2: 48 8d 04 ed 00 00 00 00 leaq (,%rbp,8), %rax + // ba: 49 01 44 24 40 addq %rax, 0x40(%r12) + // bf: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // c4: 8b 07 movl (%rdi), %eax + // c6: 85 c0 testl %eax, %eax + // c8: 78 0c js 0xd6 <_JIT_ENTRY+0xd6> + // ca: ff c8 decl %eax + // cc: 89 07 movl %eax, (%rdi) + // ce: 75 06 jne 0xd6 <_JIT_ENTRY+0xd6> + // d0: ff 15 00 00 00 00 callq *(%rip) # 0xd6 <_JIT_ENTRY+0xd6> + // 00000000000000d2: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // d6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // db: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // e4: 48 85 db testq %rbx, %rbx + // e7: 74 16 je 0xff <_JIT_ENTRY+0xff> + // e9: 49 89 5d 00 movq %rbx, (%r13) + // ed: 49 83 c5 08 addq $0x8, %r13 + // f1: 5d popq %rbp + // f2: ff 25 00 00 00 00 jmpq *(%rip) # 0xf8 <_JIT_ENTRY+0xf8> + // 00000000000000f4: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // f8: 5d popq %rbp + // f9: ff 25 00 00 00 00 jmpq *(%rip) # 0xff <_JIT_ENTRY+0xff> + // 00000000000000fb: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // ff: 5d popq %rbp + // 100: ff 25 00 00 00 00 jmpq *(%rip) # 0x106 <_JIT_ENTRY+0x106> + // 0000000000000102: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[262] = { + 0x55, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xd1, 0x31, + 0xc9, 0x31, 0xf6, 0x49, 0x83, 0x7c, 0xd5, 0x00, + 0x00, 0x0f, 0x94, 0xc2, 0x40, 0x0f, 0x95, 0xc6, + 0x01, 0xc6, 0x83, 0xfe, 0x01, 0x0f, 0x85, 0xcd, + 0x00, 0x00, 0x00, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc6, 0x48, 0x63, 0xee, 0x49, 0x8b, 0x74, + 0xed, 0x00, 0x48, 0x8b, 0x7e, 0x08, 0x48, 0x3b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xad, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x7e, 0x10, 0x83, + 0x7f, 0x10, 0x08, 0x0f, 0x85, 0x9f, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x5e, 0x34, 0x85, 0xdb, 0x0f, + 0x8e, 0x93, 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, + 0x4d, 0x89, 0xe8, 0x49, 0x29, 0xc0, 0x88, 0xd1, + 0x48, 0x8d, 0x04, 0xcd, 0xf8, 0xff, 0xff, 0xff, + 0x48, 0x8b, 0x4f, 0x08, 0x4d, 0x8b, 0x3c, 0x00, + 0xff, 0xcb, 0x41, 0x89, 0x5e, 0x34, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x7e, 0x18, 0x4c, + 0x89, 0xfe, 0xff, 0xd1, 0x41, 0xff, 0x46, 0x34, + 0x48, 0x89, 0xc3, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, + 0x09, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x04, 0xed, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x01, 0x44, 0x24, 0x40, 0x49, + 0x8b, 0x7c, 0xed, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x74, + 0x16, 0x49, 0x89, 0x5d, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xae, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xf4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x102, (uintptr_t)data + 0x24); +} + +void +emit__CALL_INTRINSIC_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 11: c1 e0 04 shll $0x4, %eax + // 14: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: R_X86_64_REX_GOTPCRELX _PyIntrinsics_UnaryFunctions-0x4 + // 1b: 4c 89 f7 movq %r14, %rdi + // 1e: 48 89 de movq %rbx, %rsi + // 21: ff 14 01 callq *(%rcx,%rax) + // 24: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 29: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 32: 8b 0b movl (%rbx), %ecx + // 34: 85 c9 testl %ecx, %ecx + // 36: 78 06 js 0x3e <_JIT_ENTRY+0x3e> + // 38: ff c9 decl %ecx + // 3a: 89 0b movl %ecx, (%rbx) + // 3c: 74 10 je 0x4e <_JIT_ENTRY+0x4e> + // 3e: 48 85 c0 testq %rax, %rax + // 41: 74 1f je 0x62 <_JIT_ENTRY+0x62> + // 43: 49 89 45 f8 movq %rax, -0x8(%r13) + // 47: 58 popq %rax + // 48: ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 4e: 48 89 df movq %rbx, %rdi + // 51: 48 89 c3 movq %rax, %rbx + // 54: ff 15 00 00 00 00 callq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5a: 48 89 d8 movq %rbx, %rax + // 5d: 48 85 c0 testq %rax, %rax + // 60: 75 e1 jne 0x43 <_JIT_ENTRY+0x43> + // 62: 49 83 c5 f8 addq $-0x8, %r13 + // 66: 58 popq %rax + // 67: ff 25 00 00 00 00 jmpq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[109] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, + 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x48, 0x89, + 0xde, 0xff, 0x14, 0x01, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x10, 0x48, 0x85, + 0xc0, 0x74, 0x1f, 0x49, 0x89, 0x45, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, + 0x75, 0xe1, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyIntrinsics_UnaryFunctions+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_UnaryFunctions); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_INTRINSIC_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_2.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 15: c1 e0 04 shll $0x4, %eax + // 18: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_REX_GOTPCRELX _PyIntrinsics_BinaryFunctions-0x4 + // 1f: 4c 89 f7 movq %r14, %rdi + // 22: 48 89 ee movq %rbp, %rsi + // 25: 48 89 da movq %rbx, %rdx + // 28: ff 14 01 callq *(%rcx,%rax) + // 2b: 49 89 c7 movq %rax, %r15 + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: 8b 45 00 movl (%rbp), %eax + // 3f: 85 c0 testl %eax, %eax + // 41: 78 10 js 0x53 <_JIT_ENTRY+0x53> + // 43: ff c8 decl %eax + // 45: 89 45 00 movl %eax, (%rbp) + // 48: 75 09 jne 0x53 <_JIT_ENTRY+0x53> + // 4a: 48 89 ef movq %rbp, %rdi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 53: 8b 03 movl (%rbx), %eax + // 55: 85 c0 testl %eax, %eax + // 57: 78 06 js 0x5f <_JIT_ENTRY+0x5f> + // 59: ff c8 decl %eax + // 5b: 89 03 movl %eax, (%rbx) + // 5d: 74 14 je 0x73 <_JIT_ENTRY+0x73> + // 5f: 4d 85 ff testq %r15, %r15 + // 62: 74 1d je 0x81 <_JIT_ENTRY+0x81> + // 64: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 68: 49 83 c5 f8 addq $-0x8, %r13 + // 6c: 5d popq %rbp + // 6d: ff 25 00 00 00 00 jmpq *(%rip) # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 73: 48 89 df movq %rbx, %rdi + // 76: ff 15 00 00 00 00 callq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 7c: 4d 85 ff testq %r15, %r15 + // 7f: 75 e3 jne 0x64 <_JIT_ENTRY+0x64> + // 81: 49 83 c5 f0 addq $-0x10, %r13 + // 85: 5d popq %rbp + // 86: ff 25 00 00 00 00 jmpq *(%rip) # 0x8c <_JIT_ENTRY+0x8c> + // 0000000000000088: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[140] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, + 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x04, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf7, 0x48, 0x89, 0xee, 0x48, 0x89, 0xda, + 0xff, 0x14, 0x01, 0x49, 0x89, 0xc7, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, 0x85, + 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x89, 0x45, 0x00, + 0x75, 0x09, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x14, 0x4d, + 0x85, 0xff, 0x74, 0x1d, 0x4d, 0x89, 0x7d, 0xf0, + 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x75, + 0xe3, 0x49, 0x83, 0xc5, 0xf0, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyIntrinsics_BinaryFunctions+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_BinaryFunctions); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_ISINSTANCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_ISINSTANCE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 48 63 e9 movslq %ecx, %rbp + // 13: 31 f6 xorl %esi, %esi + // 15: 31 c9 xorl %ecx, %ecx + // 17: 49 83 7c ed 00 00 cmpq $0x0, (%r13,%rbp,8) + // 1d: 40 0f 95 c6 setne %sil + // 21: 0f 94 c2 sete %dl + // 24: 01 c6 addl %eax, %esi + // 26: 83 fe 02 cmpl $0x2, %esi + // 29: 75 1c jne 0x47 <_JIT_ENTRY+0x47> + // 2b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 30: 29 c6 subl %eax, %esi + // 32: 48 63 de movslq %esi, %rbx + // 35: 49 8b 76 10 movq 0x10(%r14), %rsi + // 39: 48 8b b6 f0 66 03 00 movq 0x366f0(%rsi), %rsi + // 40: 49 3b 74 dd 00 cmpq (%r13,%rbx,8), %rsi + // 45: 74 0b je 0x52 <_JIT_ENTRY+0x52> + // 47: 48 83 c4 10 addq $0x10, %rsp + // 4b: 5d popq %rbp + // 4c: ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 52: c1 e0 03 shll $0x3, %eax + // 55: 4c 89 ee movq %r13, %rsi + // 58: 48 29 c6 subq %rax, %rsi + // 5b: 88 d1 movb %dl, %cl + // 5d: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 65: 48 8b 3c 06 movq (%rsi,%rax), %rdi + // 69: 48 8b 74 06 08 movq 0x8(%rsi,%rax), %rsi + // 6e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 73: ff 15 00 00 00 00 callq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: R_X86_64_GOTPCRELX PyObject_IsInstance-0x4 + // 79: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // 7e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 87: 85 c0 testl %eax, %eax + // 89: 0f 88 96 00 00 00 js 0x125 <_JIT_ENTRY+0x125> + // 8f: 89 44 24 04 movl %eax, 0x4(%rsp) + // 93: 48 89 4c 24 08 movq %rcx, 0x8(%rsp) + // 98: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 9d: 8b 07 movl (%rdi), %eax + // 9f: 85 c0 testl %eax, %eax + // a1: 78 0c js 0xaf <_JIT_ENTRY+0xaf> + // a3: ff c8 decl %eax + // a5: 89 07 movl %eax, (%rdi) + // a7: 75 06 jne 0xaf <_JIT_ENTRY+0xaf> + // a9: ff 15 00 00 00 00 callq *(%rip) # 0xaf <_JIT_ENTRY+0xaf> + // 00000000000000ab: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // af: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // b4: 48 85 ff testq %rdi, %rdi + // b7: 74 12 je 0xcb <_JIT_ENTRY+0xcb> + // b9: 8b 07 movl (%rdi), %eax + // bb: 85 c0 testl %eax, %eax + // bd: 78 0c js 0xcb <_JIT_ENTRY+0xcb> + // bf: ff c8 decl %eax + // c1: 89 07 movl %eax, (%rdi) + // c3: 75 06 jne 0xcb <_JIT_ENTRY+0xcb> + // c5: ff 15 00 00 00 00 callq *(%rip) # 0xcb <_JIT_ENTRY+0xcb> + // 00000000000000c7: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // cb: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xd2 <_JIT_ENTRY+0xd2> + // 00000000000000ce: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // d2: 66 85 c0 testw %ax, %ax + // d5: 74 3e je 0x115 <_JIT_ENTRY+0x115> + // d7: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // df: 49 ff c7 incq %r15 + // e2: 49 83 c5 f8 addq $-0x8, %r13 + // e6: eb 15 jmp 0xfd <_JIT_ENTRY+0xfd> + // e8: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // f0: 49 ff cf decq %r15 + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 49 83 ff 01 cmpq $0x1, %r15 + // fb: 76 18 jbe 0x115 <_JIT_ENTRY+0x115> + // fd: 49 8b 7d 00 movq (%r13), %rdi + // 101: 8b 07 movl (%rdi), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <_JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 07 movl %eax, (%rdi) + // 10b: 75 e3 jne 0xf0 <_JIT_ENTRY+0xf0> + // 10d: ff 15 00 00 00 00 callq *(%rip) # 0x113 <_JIT_ENTRY+0x113> + // 000000000000010f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 113: eb db jmp 0xf0 <_JIT_ENTRY+0xf0> + // 115: 83 7c 24 04 00 cmpl $0x0, 0x4(%rsp) + // 11a: 75 17 jne 0x133 <_JIT_ENTRY+0x133> + // 11c: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x123 <_JIT_ENTRY+0x123> + // 000000000000011f: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 123: eb 15 jmp 0x13a <_JIT_ENTRY+0x13a> + // 125: 49 89 cd movq %rcx, %r13 + // 128: 48 83 c4 10 addq $0x10, %rsp + // 12c: 5d popq %rbp + // 12d: ff 25 00 00 00 00 jmpq *(%rip) # 0x133 <_JIT_ENTRY+0x133> + // 000000000000012f: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 133: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x13a <_JIT_ENTRY+0x13a> + // 0000000000000136: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 13a: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 13f: 48 89 04 d9 movq %rax, (%rcx,%rbx,8) + // 143: 4c 8d 2c e9 leaq (%rcx,%rbp,8), %r13 + // 147: 48 83 c4 10 addq $0x10, %rsp + // 14b: 5d popq %rbp + // 14c: ff 25 00 00 00 00 jmpq *(%rip) # 0x152 <_JIT_ENTRY+0x152> + // 000000000000014e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[332] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x48, 0x63, 0xe9, 0x31, 0xf6, 0x31, 0xc9, 0x49, + 0x83, 0x7c, 0xed, 0x00, 0x00, 0x40, 0x0f, 0x95, + 0xc6, 0x0f, 0x94, 0xc2, 0x01, 0xc6, 0x83, 0xfe, + 0x02, 0x75, 0x1c, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc6, 0x48, 0x63, 0xde, 0x49, 0x8b, 0x76, + 0x10, 0x48, 0x8b, 0xb6, 0xf0, 0x66, 0x03, 0x00, + 0x49, 0x3b, 0x74, 0xdd, 0x00, 0x74, 0x0b, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, 0xee, + 0x48, 0x29, 0xc6, 0x88, 0xd1, 0x48, 0x8d, 0x04, + 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, 0x3c, + 0x06, 0x48, 0x8b, 0x74, 0x06, 0x08, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x4c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x0f, 0x88, 0x96, 0x00, 0x00, 0x00, 0x89, + 0x44, 0x24, 0x04, 0x48, 0x89, 0x4c, 0x24, 0x08, + 0x49, 0x8b, 0x7c, 0xdd, 0x00, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x7c, 0xed, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3e, 0x44, + 0x0f, 0xb7, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0xff, 0xc7, 0x49, 0x83, 0xc5, 0xf8, 0xeb, 0x15, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xcf, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x83, 0x7c, 0x24, + 0x04, 0x00, 0x75, 0x17, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x15, 0x49, 0x89, 0xcd, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x4c, 0x24, 0x08, 0x48, + 0x89, 0x04, 0xd9, 0x4c, 0x8d, 0x2c, 0xe9, 0x48, + 0x83, 0xc4, 0x10, 0x5d, + }; + // 0: OPARG + // 8: JUMP_TARGET + // 10: &PyObject_IsInstance+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: &_Py_FalseStruct+0x0 + // 28: ERROR_TARGET + // 30: &_Py_TrueStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyObject_IsInstance); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xce, (uintptr_t)data + -0x4); + patch_32r(code + 0xdb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x11f, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x12f, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x136, (uintptr_t)data + 0x2c); +} + +void +emit__CALL_KW_NON_PY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_KW_NON_PY.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // a: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d # 0x12 <_JIT_ENTRY+0x12> + // 000000000000000e: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 12: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 16: 44 89 f0 movl %r14d, %eax + // 19: f7 d0 notl %eax + // 1b: 48 98 cltq + // 1d: 48 89 44 24 10 movq %rax, 0x10(%rsp) + // 22: 48 8d 04 c5 00 00 00 00 leaq (,%rax,8), %rax + // 2a: 4c 01 e8 addq %r13, %rax + // 2d: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 32: 44 29 f1 subl %r14d, %ecx + // 35: 48 63 e9 movslq %ecx, %rbp + // 38: b9 fd ff ff ff movl $0xfffffffd, %ecx # imm = 0xFFFFFFFD + // 3d: 44 29 f1 subl %r14d, %ecx + // 40: 48 63 d9 movslq %ecx, %rbx + // 43: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 48: 31 c9 xorl %ecx, %ecx + // 4a: 31 d2 xorl %edx, %edx + // 4c: 49 83 7c ed 00 00 cmpq $0x0, (%r13,%rbp,8) + // 52: 0f 95 c1 setne %cl + // 55: 0f 94 c2 sete %dl + // 58: 48 8d 34 d0 leaq (%rax,%rdx,8), %rsi + // 5c: 48 83 c6 f8 addq $-0x8, %rsi + // 60: 44 01 f1 addl %r14d, %ecx + // 63: 41 2b 4f 10 subl 0x10(%r15), %ecx + // 67: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6c: 48 63 c1 movslq %ecx, %rax + // 6f: 48 ba 00 00 00 00 00 00 00 80 movabsq $-0x8000000000000000, %rdx # imm = 0x8000000000000000 + // 79: 48 09 c2 orq %rax, %rdx + // 7c: 4c 89 f9 movq %r15, %rcx + // 7f: ff 15 00 00 00 00 callq *(%rip) # 0x85 <_JIT_ENTRY+0x85> + // 0000000000000081: R_X86_64_GOTPCRELX PyObject_Vectorcall-0x4 + // 85: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 8b: 48 89 44 24 18 movq %rax, 0x18(%rsp) + // 90: 41 8b 07 movl (%r15), %eax + // 93: 85 c0 testl %eax, %eax + // 95: 78 10 js 0xa7 <_JIT_ENTRY+0xa7> + // 97: ff c8 decl %eax + // 99: 41 89 07 movl %eax, (%r15) + // 9c: 75 09 jne 0xa7 <_JIT_ENTRY+0xa7> + // 9e: 4c 89 ff movq %r15, %rdi + // a1: ff 15 00 00 00 00 callq *(%rip) # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a7: 4d 8b 7c 24 40 movq 0x40(%r12), %r15 + // ac: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b5: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // ba: 8b 07 movl (%rdi), %eax + // bc: 85 c0 testl %eax, %eax + // be: 78 0c js 0xcc <_JIT_ENTRY+0xcc> + // c0: ff c8 decl %eax + // c2: 89 07 movl %eax, (%rdi) + // c4: 75 06 jne 0xcc <_JIT_ENTRY+0xcc> + // c6: ff 15 00 00 00 00 callq *(%rip) # 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000c8: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // cc: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // d1: 48 85 ff testq %rdi, %rdi + // d4: 74 12 je 0xe8 <_JIT_ENTRY+0xe8> + // d6: 8b 07 movl (%rdi), %eax + // d8: 85 c0 testl %eax, %eax + // da: 78 0c js 0xe8 <_JIT_ENTRY+0xe8> + // dc: ff c8 decl %eax + // de: 89 07 movl %eax, (%rdi) + // e0: 75 06 jne 0xe8 <_JIT_ENTRY+0xe8> + // e2: ff 15 00 00 00 00 callq *(%rip) # 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e4: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // e8: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xef <_JIT_ENTRY+0xef> + // 00000000000000eb: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // ef: 66 85 c0 testw %ax, %ax + // f2: 74 4b je 0x13f <_JIT_ENTRY+0x13f> + // f4: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xfb <_JIT_ENTRY+0xfb> + // 00000000000000f7: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // fb: 48 ff c3 incq %rbx + // fe: 41 f7 de negl %r14d + // 101: 49 63 c6 movslq %r14d, %rax + // 104: 4c 8d 34 c5 f0 ff ff ff leaq -0x10(,%rax,8), %r14 + // 10c: 4d 01 ee addq %r13, %r14 + // 10f: 4c 8b 2d 00 00 00 00 movq (%rip), %r13 # 0x116 <_JIT_ENTRY+0x116> + // 0000000000000112: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // 116: eb 11 jmp 0x129 <_JIT_ENTRY+0x129> + // 118: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // 120: 48 ff cb decq %rbx + // 123: 48 83 fb 01 cmpq $0x1, %rbx + // 127: 76 16 jbe 0x13f <_JIT_ENTRY+0x13f> + // 129: 49 8b 7c de f8 movq -0x8(%r14,%rbx,8), %rdi + // 12e: 8b 07 movl (%rdi), %eax + // 130: 85 c0 testl %eax, %eax + // 132: 78 ec js 0x120 <_JIT_ENTRY+0x120> + // 134: ff c8 decl %eax + // 136: 89 07 movl %eax, (%rdi) + // 138: 75 e6 jne 0x120 <_JIT_ENTRY+0x120> + // 13a: 41 ff d5 callq *%r13 + // 13d: eb e1 jmp 0x120 <_JIT_ENTRY+0x120> + // 13f: 48 8b 44 24 18 movq 0x18(%rsp), %rax + // 144: 48 85 c0 testq %rax, %rax + // 147: 74 1d je 0x166 <_JIT_ENTRY+0x166> + // 149: 49 89 04 ef movq %rax, (%r15,%rbp,8) + // 14d: 48 8b 44 24 10 movq 0x10(%rsp), %rax + // 152: 4d 8d 2c c7 leaq (%r15,%rax,8), %r13 + // 156: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 15b: 48 83 c4 20 addq $0x20, %rsp + // 15f: 5d popq %rbp + // 160: ff 25 00 00 00 00 jmpq *(%rip) # 0x166 <_JIT_ENTRY+0x166> + // 0000000000000162: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 166: 4d 8d 2c ef leaq (%r15,%rbp,8), %r13 + // 16a: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 16f: 48 83 c4 20 addq $0x20, %rsp + // 173: 5d popq %rbp + // 174: ff 25 00 00 00 00 jmpq *(%rip) # 0x17a <_JIT_ENTRY+0x17a> + // 0000000000000176: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[378] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x4c, 0x89, 0x74, + 0x24, 0x08, 0x44, 0x0f, 0xb7, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x7d, 0xf8, 0x44, 0x89, + 0xf0, 0xf7, 0xd0, 0x48, 0x98, 0x48, 0x89, 0x44, + 0x24, 0x10, 0x48, 0x8d, 0x04, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x01, 0xe8, 0xb9, 0xfe, 0xff, + 0xff, 0xff, 0x44, 0x29, 0xf1, 0x48, 0x63, 0xe9, + 0xb9, 0xfd, 0xff, 0xff, 0xff, 0x44, 0x29, 0xf1, + 0x48, 0x63, 0xd9, 0x49, 0x8b, 0x7c, 0xdd, 0x00, + 0x31, 0xc9, 0x31, 0xd2, 0x49, 0x83, 0x7c, 0xed, + 0x00, 0x00, 0x0f, 0x95, 0xc1, 0x0f, 0x94, 0xc2, + 0x48, 0x8d, 0x34, 0xd0, 0x48, 0x83, 0xc6, 0xf8, + 0x44, 0x01, 0xf1, 0x41, 0x2b, 0x4f, 0x10, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x63, 0xc1, 0x48, + 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x48, 0x09, 0xc2, 0x4c, 0x89, 0xf9, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xf8, 0x48, 0x89, 0x44, 0x24, 0x18, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x7c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7c, + 0xdd, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7c, 0xed, + 0x00, 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x4b, 0x0f, 0xb7, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xff, 0xc3, 0x41, 0xf7, + 0xde, 0x49, 0x63, 0xc6, 0x4c, 0x8d, 0x34, 0xc5, + 0xf0, 0xff, 0xff, 0xff, 0x4d, 0x01, 0xee, 0x4c, + 0x8b, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x11, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x48, 0x83, 0xfb, 0x01, 0x76, + 0x16, 0x49, 0x8b, 0x7c, 0xde, 0xf8, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0xec, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0xe6, 0x41, 0xff, 0xd5, 0xeb, 0xe1, 0x48, + 0x8b, 0x44, 0x24, 0x18, 0x48, 0x85, 0xc0, 0x74, + 0x1d, 0x49, 0x89, 0x04, 0xef, 0x48, 0x8b, 0x44, + 0x24, 0x10, 0x4d, 0x8d, 0x2c, 0xc7, 0x4c, 0x8b, + 0x74, 0x24, 0x08, 0x48, 0x83, 0xc4, 0x20, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8d, + 0x2c, 0xef, 0x4c, 0x8b, 0x74, 0x24, 0x08, 0x48, + 0x83, 0xc4, 0x20, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_Vectorcall+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xe, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc8, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xeb, (uintptr_t)data + -0x4); + patch_32r(code + 0xf7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x112, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x162, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x176, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LEN.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 89 c1 movl %eax, %ecx + // a: f7 d1 notl %ecx + // c: 48 63 d1 movslq %ecx, %rdx + // f: 31 c9 xorl %ecx, %ecx + // 11: 31 f6 xorl %esi, %esi + // 13: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 19: 0f 94 c2 sete %dl + // 1c: 40 0f 95 c6 setne %sil + // 20: 01 c6 addl %eax, %esi + // 22: 83 fe 01 cmpl $0x1, %esi + // 25: 75 1c jne 0x43 <_JIT_ENTRY+0x43> + // 27: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 2c: 29 c6 subl %eax, %esi + // 2e: 48 63 ee movslq %esi, %rbp + // 31: 49 8b 76 10 movq 0x10(%r14), %rsi + // 35: 48 8b b6 f8 66 03 00 movq 0x366f8(%rsi), %rsi + // 3c: 49 3b 74 ed 00 cmpq (%r13,%rbp,8), %rsi + // 41: 74 07 je 0x4a <_JIT_ENTRY+0x4a> + // 43: 5d popq %rbp + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 4a: c1 e0 03 shll $0x3, %eax + // 4d: 4c 89 ee movq %r13, %rsi + // 50: 48 29 c6 subq %rax, %rsi + // 53: 88 d1 movb %dl, %cl + // 55: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 5d: 48 8b 1c 06 movq (%rsi,%rax), %rbx + // 61: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 66: 48 89 df movq %rbx, %rdi + // 69: ff 15 00 00 00 00 callq *(%rip) # 0x6f <_JIT_ENTRY+0x6f> + // 000000000000006b: R_X86_64_GOTPCRELX PyObject_Size-0x4 + // 6f: 4d 8b 7c 24 40 movq 0x40(%r12), %r15 + // 74: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7d: 48 85 c0 testq %rax, %rax + // 80: 78 75 js 0xf7 <_JIT_ENTRY+0xf7> + // 82: 48 89 c7 movq %rax, %rdi + // 85: ff 15 00 00 00 00 callq *(%rip) # 0x8b <_JIT_ENTRY+0x8b> + // 0000000000000087: R_X86_64_GOTPCRELX PyLong_FromSsize_t-0x4 + // 8b: 48 85 c0 testq %rax, %rax + // 8e: 74 67 je 0xf7 <_JIT_ENTRY+0xf7> + // 90: 4d 89 7c 24 40 movq %r15, 0x40(%r12) + // 95: 8b 0b movl (%rbx), %ecx + // 97: 85 c9 testl %ecx, %ecx + // 99: 78 15 js 0xb0 <_JIT_ENTRY+0xb0> + // 9b: ff c9 decl %ecx + // 9d: 89 0b movl %ecx, (%rbx) + // 9f: 75 0f jne 0xb0 <_JIT_ENTRY+0xb0> + // a1: 48 89 df movq %rbx, %rdi + // a4: 48 89 c3 movq %rax, %rbx + // a7: ff 15 00 00 00 00 callq *(%rip) # 0xad <_JIT_ENTRY+0xad> + // 00000000000000a9: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // ad: 48 89 d8 movq %rbx, %rax + // b0: 48 8d 0c ed 00 00 00 00 leaq (,%rbp,8), %rcx + // b8: 49 01 4c 24 40 addq %rcx, 0x40(%r12) + // bd: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // c2: 8b 0f movl (%rdi), %ecx + // c4: 85 c9 testl %ecx, %ecx + // c6: 78 12 js 0xda <_JIT_ENTRY+0xda> + // c8: ff c9 decl %ecx + // ca: 89 0f movl %ecx, (%rdi) + // cc: 75 0c jne 0xda <_JIT_ENTRY+0xda> + // ce: 48 89 c3 movq %rax, %rbx + // d1: ff 15 00 00 00 00 callq *(%rip) # 0xd7 <_JIT_ENTRY+0xd7> + // 00000000000000d3: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // d7: 48 89 d8 movq %rbx, %rax + // da: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // df: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // e8: 49 89 45 00 movq %rax, (%r13) + // ec: 49 83 c5 08 addq $0x8, %r13 + // f0: 5d popq %rbp + // f1: ff 25 00 00 00 00 jmpq *(%rip) # 0xf7 <_JIT_ENTRY+0xf7> + // 00000000000000f3: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // f7: 4d 89 fd movq %r15, %r13 + // fa: 5d popq %rbp + // fb: ff 25 00 00 00 00 jmpq *(%rip) # 0x101 <_JIT_ENTRY+0x101> + // 00000000000000fd: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[257] = { + 0x55, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xd1, 0x31, + 0xc9, 0x31, 0xf6, 0x49, 0x83, 0x7c, 0xd5, 0x00, + 0x00, 0x0f, 0x94, 0xc2, 0x40, 0x0f, 0x95, 0xc6, + 0x01, 0xc6, 0x83, 0xfe, 0x01, 0x75, 0x1c, 0xbe, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc6, 0x48, 0x63, + 0xee, 0x49, 0x8b, 0x76, 0x10, 0x48, 0x8b, 0xb6, + 0xf8, 0x66, 0x03, 0x00, 0x49, 0x3b, 0x74, 0xed, + 0x00, 0x74, 0x07, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, 0xee, + 0x48, 0x29, 0xc6, 0x88, 0xd1, 0x48, 0x8d, 0x04, + 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, 0x1c, + 0x06, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x7c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x78, 0x75, 0x48, 0x89, 0xc7, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x67, + 0x4d, 0x89, 0x7c, 0x24, 0x40, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, 0x75, + 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, + 0x48, 0x8d, 0x0c, 0xed, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x01, 0x4c, 0x24, 0x40, 0x49, 0x8b, 0x7c, + 0xed, 0x00, 0x8b, 0x0f, 0x85, 0xc9, 0x78, 0x12, + 0xff, 0xc9, 0x89, 0x0f, 0x75, 0x0c, 0x48, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0xfd, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: JUMP_TARGET + // 10: &PyObject_Size+0x0 + // 18: &PyLong_FromSsize_t+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyObject_Size); + patch_64(data + 0x18, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x87, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xf3, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xfd, (uintptr_t)data + 0x2c); +} + +void +emit__CALL_LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LIST_APPEND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 5d e8 movq -0x18(%r13), %rbx + // 5: 49 8b 46 10 movq 0x10(%r14), %rax + // 9: 48 39 98 00 67 03 00 cmpq %rbx, 0x36700(%rax) + // 10: 75 11 jne 0x23 <_JIT_ENTRY+0x23> + // 12: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 16: 49 8b 47 08 movq 0x8(%r15), %rax + // 1a: f6 80 ab 00 00 00 02 testb $0x2, 0xab(%rax) + // 21: 75 07 jne 0x2a <_JIT_ENTRY+0x2a> + // 23: 5d popq %rbp + // 24: ff 25 00 00 00 00 jmpq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 2a: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 2e: 49 83 c5 f0 addq $-0x10, %r13 + // 32: 49 8b 47 10 movq 0x10(%r15), %rax + // 36: 49 39 47 20 cmpq %rax, 0x20(%r15) + // 3a: 7e 20 jle 0x5c <_JIT_ENTRY+0x5c> + // 3c: 49 8b 4f 18 movq 0x18(%r15), %rcx + // 40: 48 89 34 c1 movq %rsi, (%rcx,%rax,8) + // 44: 48 ff c0 incq %rax + // 47: 49 89 47 10 movq %rax, 0x10(%r15) + // 4b: 40 b5 01 movb $0x1, %bpl + // 4e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 53: 41 8b 07 movl (%r15), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 79 1d jns 0x77 <_JIT_ENTRY+0x77> + // 5a: eb 2b jmp 0x87 <_JIT_ENTRY+0x87> + // 5c: 4c 89 ff movq %r15, %rdi + // 5f: ff 15 00 00 00 00 callq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: R_X86_64_GOTPCRELX _PyList_AppendTakeRefListResize-0x4 + // 65: 85 c0 testl %eax, %eax + // 67: 40 0f 94 c5 sete %bpl + // 6b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 70: 41 8b 07 movl (%r15), %eax + // 73: 85 c0 testl %eax, %eax + // 75: 78 10 js 0x87 <_JIT_ENTRY+0x87> + // 77: ff c8 decl %eax + // 79: 41 89 07 movl %eax, (%r15) + // 7c: 75 09 jne 0x87 <_JIT_ENTRY+0x87> + // 7e: 4c 89 ff movq %r15, %rdi + // 81: ff 15 00 00 00 00 callq *(%rip) # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 87: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 8d: 8b 03 movl (%rbx), %eax + // 8f: 85 c0 testl %eax, %eax + // 91: 78 06 js 0x99 <_JIT_ENTRY+0x99> + // 93: ff c8 decl %eax + // 95: 89 03 movl %eax, (%rbx) + // 97: 74 1a je 0xb3 <_JIT_ENTRY+0xb3> + // 99: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a7: 40 84 ed testb %bpl, %bpl + // aa: 74 23 je 0xcf <_JIT_ENTRY+0xcf> + // ac: 5d popq %rbp + // ad: ff 25 00 00 00 00 jmpq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // b3: 48 89 df movq %rbx, %rdi + // b6: ff 15 00 00 00 00 callq *(%rip) # 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000b8: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // bc: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // c1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ca: 40 84 ed testb %bpl, %bpl + // cd: 75 dd jne 0xac <_JIT_ENTRY+0xac> + // cf: 5d popq %rbp + // d0: ff 25 00 00 00 00 jmpq *(%rip) # 0xd6 <_JIT_ENTRY+0xd6> + // 00000000000000d2: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[214] = { + 0x55, 0x49, 0x8b, 0x5d, 0xe8, 0x49, 0x8b, 0x46, + 0x10, 0x48, 0x39, 0x98, 0x00, 0x67, 0x03, 0x00, + 0x75, 0x11, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, + 0x47, 0x08, 0xf6, 0x80, 0xab, 0x00, 0x00, 0x00, + 0x02, 0x75, 0x07, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x83, + 0xc5, 0xf0, 0x49, 0x8b, 0x47, 0x10, 0x49, 0x39, + 0x47, 0x20, 0x7e, 0x20, 0x49, 0x8b, 0x4f, 0x18, + 0x48, 0x89, 0x34, 0xc1, 0x48, 0xff, 0xc0, 0x49, + 0x89, 0x47, 0x10, 0x40, 0xb5, 0x01, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x79, 0x1d, 0xeb, 0x2b, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x40, + 0x0f, 0x94, 0xc5, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, + 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0x44, 0x24, 0x40, 0xf8, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x1a, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x84, 0xed, 0x74, 0x23, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x84, 0xed, 0x75, 0xdd, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + // 8: &_PyList_AppendTakeRefListResize+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x8, (uintptr_t)&_PyList_AppendTakeRefListResize); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 4c 63 f9 movslq %ecx, %r15 + // 13: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 18: 29 c1 subl %eax, %ecx + // 1a: 48 63 e9 movslq %ecx, %rbp + // 1d: 4d 8b 4c ed 00 movq (%r13,%rbp,8), %r9 + // 22: 31 c9 xorl %ecx, %ecx + // 24: 31 f6 xorl %esi, %esi + // 26: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2c: 0f 95 c2 setne %dl + // 2f: 0f 94 c3 sete %bl + // 32: 49 8b 79 08 movq 0x8(%r9), %rdi + // 36: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_REX_GOTPCRELX PyMethodDescr_Type-0x4 + // 3d: 75 33 jne 0x72 <_JIT_ENTRY+0x72> + // 3f: 4d 8b 41 28 movq 0x28(%r9), %r8 + // 43: 41 81 78 10 80 00 00 00 cmpl $0x80, 0x10(%r8) + // 4b: 75 25 jne 0x72 <_JIT_ENTRY+0x72> + // 4d: 8d 3c c5 00 00 00 00 leal (,%rax,8), %edi + // 54: 4d 89 ea movq %r13, %r10 + // 57: 49 29 fa subq %rdi, %r10 + // 5a: 40 88 de movb %bl, %sil + // 5d: 49 8d 34 f2 leaq (%r10,%rsi,8), %rsi + // 61: 48 83 c6 f8 addq $-0x8, %rsi + // 65: 48 8b 3e movq (%rsi), %rdi + // 68: 4c 8b 57 08 movq 0x8(%rdi), %r10 + // 6c: 4d 3b 51 10 cmpq 0x10(%r9), %r10 + // 70: 74 0b je 0x7d <_JIT_ENTRY+0x7d> + // 72: 48 83 c4 10 addq $0x10, %rsp + // 76: 5d popq %rbp + // 77: ff 25 00 00 00 00 jmpq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 7d: 88 d1 movb %dl, %cl + // 7f: 01 c8 addl %ecx, %eax + // 81: ff c8 decl %eax + // 83: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 88: 48 83 c6 08 addq $0x8, %rsi + // 8c: 48 63 d0 movslq %eax, %rdx + // 8f: 41 ff 50 08 callq *0x8(%r8) + // 93: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 98: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 9d: 48 89 04 24 movq %rax, (%rsp) + // a1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // aa: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // af: 8b 07 movl (%rdi), %eax + // b1: 85 c0 testl %eax, %eax + // b3: 78 0c js 0xc1 <_JIT_ENTRY+0xc1> + // b5: ff c8 decl %eax + // b7: 89 07 movl %eax, (%rdi) + // b9: 75 06 jne 0xc1 <_JIT_ENTRY+0xc1> + // bb: ff 15 00 00 00 00 callq *(%rip) # 0xc1 <_JIT_ENTRY+0xc1> + // 00000000000000bd: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // c1: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // c6: 48 85 ff testq %rdi, %rdi + // c9: 74 12 je 0xdd <_JIT_ENTRY+0xdd> + // cb: 8b 07 movl (%rdi), %eax + // cd: 85 c0 testl %eax, %eax + // cf: 78 0c js 0xdd <_JIT_ENTRY+0xdd> + // d1: ff c8 decl %eax + // d3: 89 07 movl %eax, (%rdi) + // d5: 75 06 jne 0xdd <_JIT_ENTRY+0xdd> + // d7: ff 15 00 00 00 00 callq *(%rip) # 0xdd <_JIT_ENTRY+0xdd> + // 00000000000000d9: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // dd: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e0: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // e4: 66 85 c0 testw %ax, %ax + // e7: 74 3c je 0x125 <_JIT_ENTRY+0x125> + // e9: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xf0 <_JIT_ENTRY+0xf0> + // 00000000000000ec: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // f0: 48 ff c3 incq %rbx + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: eb 14 jmp 0x10d <_JIT_ENTRY+0x10d> + // f9: 0f 1f 80 00 00 00 00 nopl (%rax) + // 100: 48 ff cb decq %rbx + // 103: 49 83 c5 f8 addq $-0x8, %r13 + // 107: 48 83 fb 01 cmpq $0x1, %rbx + // 10b: 76 18 jbe 0x125 <_JIT_ENTRY+0x125> + // 10d: 49 8b 7d 00 movq (%r13), %rdi + // 111: 8b 07 movl (%rdi), %eax + // 113: 85 c0 testl %eax, %eax + // 115: 78 e9 js 0x100 <_JIT_ENTRY+0x100> + // 117: ff c8 decl %eax + // 119: 89 07 movl %eax, (%rdi) + // 11b: 75 e3 jne 0x100 <_JIT_ENTRY+0x100> + // 11d: ff 15 00 00 00 00 callq *(%rip) # 0x123 <_JIT_ENTRY+0x123> + // 000000000000011f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 123: eb db jmp 0x100 <_JIT_ENTRY+0x100> + // 125: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 12a: 48 85 c9 testq %rcx, %rcx + // 12d: 74 17 je 0x146 <_JIT_ENTRY+0x146> + // 12f: 48 8b 04 24 movq (%rsp), %rax + // 133: 48 89 0c e8 movq %rcx, (%rax,%rbp,8) + // 137: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 13b: 48 83 c4 10 addq $0x10, %rsp + // 13f: 5d popq %rbp + // 140: ff 25 00 00 00 00 jmpq *(%rip) # 0x146 <_JIT_ENTRY+0x146> + // 0000000000000142: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 146: 48 8b 04 24 movq (%rsp), %rax + // 14a: 4c 8d 2c e8 leaq (%rax,%rbp,8), %r13 + // 14e: 48 83 c4 10 addq $0x10, %rsp + // 152: 5d popq %rbp + // 153: ff 25 00 00 00 00 jmpq *(%rip) # 0x159 <_JIT_ENTRY+0x159> + // 0000000000000155: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[345] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x4c, 0x63, 0xf9, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xe9, 0x4d, 0x8b, 0x4c, + 0xed, 0x00, 0x31, 0xc9, 0x31, 0xf6, 0x4b, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x0f, 0x95, 0xc2, 0x0f, + 0x94, 0xc3, 0x49, 0x8b, 0x79, 0x08, 0x48, 0x3b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x75, 0x33, 0x4d, + 0x8b, 0x41, 0x28, 0x41, 0x81, 0x78, 0x10, 0x80, + 0x00, 0x00, 0x00, 0x75, 0x25, 0x8d, 0x3c, 0xc5, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xea, 0x49, + 0x29, 0xfa, 0x40, 0x88, 0xde, 0x49, 0x8d, 0x34, + 0xf2, 0x48, 0x83, 0xc6, 0xf8, 0x48, 0x8b, 0x3e, + 0x4c, 0x8b, 0x57, 0x08, 0x4d, 0x3b, 0x51, 0x10, + 0x74, 0x0b, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x88, 0xd1, 0x01, + 0xc8, 0xff, 0xc8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x83, 0xc6, 0x08, 0x48, 0x63, 0xd0, 0x41, + 0xff, 0x50, 0x08, 0x48, 0x89, 0x44, 0x24, 0x08, + 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, 0x04, + 0x24, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x7c, 0xed, 0x00, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x85, + 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x3c, 0x0f, 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc3, 0x49, 0x83, 0xc5, 0xf8, 0xeb, + 0x14, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x8b, 0x4c, + 0x24, 0x08, 0x48, 0x85, 0xc9, 0x74, 0x17, 0x48, + 0x8b, 0x04, 0x24, 0x48, 0x89, 0x0c, 0xe8, 0x4e, + 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x04, 0x24, 0x4c, 0x8d, 0x2c, 0xe8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd9, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe0, (uintptr_t)data + -0x4); + patch_32r(code + 0xec, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x11f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x142, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x155, (uintptr_t)data + 0x24); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 4c 63 f9 movslq %ecx, %r15 + // 13: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 18: 29 c1 subl %eax, %ecx + // 1a: 48 63 e9 movslq %ecx, %rbp + // 1d: 4d 8b 4c ed 00 movq (%r13,%rbp,8), %r9 + // 22: 31 c9 xorl %ecx, %ecx + // 24: 31 f6 xorl %esi, %esi + // 26: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 2c: 0f 95 c2 setne %dl + // 2f: 0f 94 c3 sete %bl + // 32: 49 8b 79 08 movq 0x8(%r9), %rdi + // 36: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_REX_GOTPCRELX PyMethodDescr_Type-0x4 + // 3d: 75 33 jne 0x72 <_JIT_ENTRY+0x72> + // 3f: 4d 8b 41 28 movq 0x28(%r9), %r8 + // 43: 41 81 78 10 82 00 00 00 cmpl $0x82, 0x10(%r8) + // 4b: 75 25 jne 0x72 <_JIT_ENTRY+0x72> + // 4d: 8d 3c c5 00 00 00 00 leal (,%rax,8), %edi + // 54: 4d 89 ea movq %r13, %r10 + // 57: 49 29 fa subq %rdi, %r10 + // 5a: 40 88 de movb %bl, %sil + // 5d: 49 8d 34 f2 leaq (%r10,%rsi,8), %rsi + // 61: 48 83 c6 f8 addq $-0x8, %rsi + // 65: 48 8b 3e movq (%rsi), %rdi + // 68: 4c 8b 57 08 movq 0x8(%rdi), %r10 + // 6c: 4d 3b 51 10 cmpq 0x10(%r9), %r10 + // 70: 74 0b je 0x7d <_JIT_ENTRY+0x7d> + // 72: 48 83 c4 10 addq $0x10, %rsp + // 76: 5d popq %rbp + // 77: ff 25 00 00 00 00 jmpq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 7d: 88 d1 movb %dl, %cl + // 7f: 01 c8 addl %ecx, %eax + // 81: ff c8 decl %eax + // 83: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 88: 48 83 c6 08 addq $0x8, %rsi + // 8c: 48 63 d0 movslq %eax, %rdx + // 8f: 31 c9 xorl %ecx, %ecx + // 91: 41 ff 50 08 callq *0x8(%r8) + // 95: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 9a: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 9f: 48 89 04 24 movq %rax, (%rsp) + // a3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ac: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // b1: 8b 07 movl (%rdi), %eax + // b3: 85 c0 testl %eax, %eax + // b5: 78 0c js 0xc3 <_JIT_ENTRY+0xc3> + // b7: ff c8 decl %eax + // b9: 89 07 movl %eax, (%rdi) + // bb: 75 06 jne 0xc3 <_JIT_ENTRY+0xc3> + // bd: ff 15 00 00 00 00 callq *(%rip) # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // c3: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // c8: 48 85 ff testq %rdi, %rdi + // cb: 74 12 je 0xdf <_JIT_ENTRY+0xdf> + // cd: 8b 07 movl (%rdi), %eax + // cf: 85 c0 testl %eax, %eax + // d1: 78 0c js 0xdf <_JIT_ENTRY+0xdf> + // d3: ff c8 decl %eax + // d5: 89 07 movl %eax, (%rdi) + // d7: 75 06 jne 0xdf <_JIT_ENTRY+0xdf> + // d9: ff 15 00 00 00 00 callq *(%rip) # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // df: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // e6: 66 85 c0 testw %ax, %ax + // e9: 74 3a je 0x125 <_JIT_ENTRY+0x125> + // eb: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xf2 <_JIT_ENTRY+0xf2> + // 00000000000000ee: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // f2: 48 ff c3 incq %rbx + // f5: 49 83 c5 f8 addq $-0x8, %r13 + // f9: eb 12 jmp 0x10d <_JIT_ENTRY+0x10d> + // fb: 0f 1f 44 00 00 nopl (%rax,%rax) + // 100: 48 ff cb decq %rbx + // 103: 49 83 c5 f8 addq $-0x8, %r13 + // 107: 48 83 fb 01 cmpq $0x1, %rbx + // 10b: 76 18 jbe 0x125 <_JIT_ENTRY+0x125> + // 10d: 49 8b 7d 00 movq (%r13), %rdi + // 111: 8b 07 movl (%rdi), %eax + // 113: 85 c0 testl %eax, %eax + // 115: 78 e9 js 0x100 <_JIT_ENTRY+0x100> + // 117: ff c8 decl %eax + // 119: 89 07 movl %eax, (%rdi) + // 11b: 75 e3 jne 0x100 <_JIT_ENTRY+0x100> + // 11d: ff 15 00 00 00 00 callq *(%rip) # 0x123 <_JIT_ENTRY+0x123> + // 000000000000011f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 123: eb db jmp 0x100 <_JIT_ENTRY+0x100> + // 125: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 12a: 48 85 c9 testq %rcx, %rcx + // 12d: 74 17 je 0x146 <_JIT_ENTRY+0x146> + // 12f: 48 8b 04 24 movq (%rsp), %rax + // 133: 48 89 0c e8 movq %rcx, (%rax,%rbp,8) + // 137: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 13b: 48 83 c4 10 addq $0x10, %rsp + // 13f: 5d popq %rbp + // 140: ff 25 00 00 00 00 jmpq *(%rip) # 0x146 <_JIT_ENTRY+0x146> + // 0000000000000142: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 146: 48 8b 04 24 movq (%rsp), %rax + // 14a: 4c 8d 2c e8 leaq (%rax,%rbp,8), %r13 + // 14e: 48 83 c4 10 addq $0x10, %rsp + // 152: 5d popq %rbp + // 153: ff 25 00 00 00 00 jmpq *(%rip) # 0x159 <_JIT_ENTRY+0x159> + // 0000000000000155: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[345] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x4c, 0x63, 0xf9, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xe9, 0x4d, 0x8b, 0x4c, + 0xed, 0x00, 0x31, 0xc9, 0x31, 0xf6, 0x4b, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x0f, 0x95, 0xc2, 0x0f, + 0x94, 0xc3, 0x49, 0x8b, 0x79, 0x08, 0x48, 0x3b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x75, 0x33, 0x4d, + 0x8b, 0x41, 0x28, 0x41, 0x81, 0x78, 0x10, 0x82, + 0x00, 0x00, 0x00, 0x75, 0x25, 0x8d, 0x3c, 0xc5, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xea, 0x49, + 0x29, 0xfa, 0x40, 0x88, 0xde, 0x49, 0x8d, 0x34, + 0xf2, 0x48, 0x83, 0xc6, 0xf8, 0x48, 0x8b, 0x3e, + 0x4c, 0x8b, 0x57, 0x08, 0x4d, 0x3b, 0x51, 0x10, + 0x74, 0x0b, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x88, 0xd1, 0x01, + 0xc8, 0xff, 0xc8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x83, 0xc6, 0x08, 0x48, 0x63, 0xd0, 0x31, + 0xc9, 0x41, 0xff, 0x50, 0x08, 0x48, 0x89, 0x44, + 0x24, 0x08, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, + 0x89, 0x04, 0x24, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7c, 0xed, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x7c, 0xfd, 0x00, + 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x3a, 0x0f, 0xb7, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0xc3, 0x49, 0x83, 0xc5, + 0xf8, 0xeb, 0x12, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x8b, 0x4c, + 0x24, 0x08, 0x48, 0x85, 0xc9, 0x74, 0x17, 0x48, + 0x8b, 0x04, 0x24, 0x48, 0x89, 0x0c, 0xe8, 0x4e, + 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x04, 0x24, 0x4c, 0x8d, 0x2c, 0xe8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + -0x4); + patch_32r(code + 0xee, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x11f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x142, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x155, (uintptr_t)data + 0x24); +} + +void +emit__CALL_METHOD_DESCRIPTOR_NOARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_NOARGS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 89 c1 movl %eax, %ecx + // a: f7 d1 notl %ecx + // c: 48 63 d1 movslq %ecx, %rdx + // f: 31 c9 xorl %ecx, %ecx + // 11: 31 f6 xorl %esi, %esi + // 13: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 19: 0f 94 c2 sete %dl + // 1c: 40 0f 95 c6 setne %sil + // 20: 01 c6 addl %eax, %esi + // 22: 83 fe 01 cmpl $0x1, %esi + // 25: 0f 85 d3 00 00 00 jne 0xfe <_JIT_ENTRY+0xfe> + // 2b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 30: 29 c6 subl %eax, %esi + // 32: 48 63 ee movslq %esi, %rbp + // 35: 49 8b 74 ed 00 movq (%r13,%rbp,8), %rsi + // 3a: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 3e: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_REX_GOTPCRELX PyMethodDescr_Type-0x4 + // 45: 0f 85 b3 00 00 00 jne 0xfe <_JIT_ENTRY+0xfe> + // 4b: c1 e0 03 shll $0x3, %eax + // 4e: 4c 89 ef movq %r13, %rdi + // 51: 48 29 c7 subq %rax, %rdi + // 54: 88 d1 movb %dl, %cl + // 56: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 5e: 48 8b 1c 07 movq (%rdi,%rax), %rbx + // 62: 48 8b 43 08 movq 0x8(%rbx), %rax + // 66: 48 3b 46 10 cmpq 0x10(%rsi), %rax + // 6a: 0f 85 8e 00 00 00 jne 0xfe <_JIT_ENTRY+0xfe> + // 70: 48 8b 46 28 movq 0x28(%rsi), %rax + // 74: 83 78 10 04 cmpl $0x4, 0x10(%rax) + // 78: 0f 85 80 00 00 00 jne 0xfe <_JIT_ENTRY+0xfe> + // 7e: 41 8b 4e 34 movl 0x34(%r14), %ecx + // 82: 85 c9 testl %ecx, %ecx + // 84: 7e 78 jle 0xfe <_JIT_ENTRY+0xfe> + // 86: 48 8b 40 08 movq 0x8(%rax), %rax + // 8a: ff c9 decl %ecx + // 8c: 41 89 4e 34 movl %ecx, 0x34(%r14) + // 90: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 95: 48 89 df movq %rbx, %rdi + // 98: 31 f6 xorl %esi, %esi + // 9a: ff d0 callq *%rax + // 9c: 41 ff 46 34 incl 0x34(%r14) + // a0: 49 89 c7 movq %rax, %r15 + // a3: 8b 03 movl (%rbx), %eax + // a5: 85 c0 testl %eax, %eax + // a7: 78 0f js 0xb8 <_JIT_ENTRY+0xb8> + // a9: ff c8 decl %eax + // ab: 89 03 movl %eax, (%rbx) + // ad: 75 09 jne 0xb8 <_JIT_ENTRY+0xb8> + // af: 48 89 df movq %rbx, %rdi + // b2: ff 15 00 00 00 00 callq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b8: 48 8d 04 ed 00 00 00 00 leaq (,%rbp,8), %rax + // c0: 49 01 44 24 40 addq %rax, 0x40(%r12) + // c5: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // ca: 8b 07 movl (%rdi), %eax + // cc: 85 c0 testl %eax, %eax + // ce: 78 0c js 0xdc <_JIT_ENTRY+0xdc> + // d0: ff c8 decl %eax + // d2: 89 07 movl %eax, (%rdi) + // d4: 75 06 jne 0xdc <_JIT_ENTRY+0xdc> + // d6: ff 15 00 00 00 00 callq *(%rip) # 0xdc <_JIT_ENTRY+0xdc> + // 00000000000000d8: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // dc: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ea: 4d 85 ff testq %r15, %r15 + // ed: 74 16 je 0x105 <_JIT_ENTRY+0x105> + // ef: 4d 89 7d 00 movq %r15, (%r13) + // f3: 49 83 c5 08 addq $0x8, %r13 + // f7: 5d popq %rbp + // f8: ff 25 00 00 00 00 jmpq *(%rip) # 0xfe <_JIT_ENTRY+0xfe> + // 00000000000000fa: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // fe: 5d popq %rbp + // ff: ff 25 00 00 00 00 jmpq *(%rip) # 0x105 <_JIT_ENTRY+0x105> + // 0000000000000101: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 105: 5d popq %rbp + // 106: ff 25 00 00 00 00 jmpq *(%rip) # 0x10c <_JIT_ENTRY+0x10c> + // 0000000000000108: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[268] = { + 0x55, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xd1, 0x31, + 0xc9, 0x31, 0xf6, 0x49, 0x83, 0x7c, 0xd5, 0x00, + 0x00, 0x0f, 0x94, 0xc2, 0x40, 0x0f, 0x95, 0xc6, + 0x01, 0xc6, 0x83, 0xfe, 0x01, 0x0f, 0x85, 0xd3, + 0x00, 0x00, 0x00, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc6, 0x48, 0x63, 0xee, 0x49, 0x8b, 0x74, + 0xed, 0x00, 0x48, 0x8b, 0x7e, 0x08, 0x48, 0x3b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xb3, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, + 0xef, 0x48, 0x29, 0xc7, 0x88, 0xd1, 0x48, 0x8d, + 0x04, 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, + 0x1c, 0x07, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, + 0x46, 0x10, 0x0f, 0x85, 0x8e, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x46, 0x28, 0x83, 0x78, 0x10, 0x04, + 0x0f, 0x85, 0x80, 0x00, 0x00, 0x00, 0x41, 0x8b, + 0x4e, 0x34, 0x85, 0xc9, 0x7e, 0x78, 0x48, 0x8b, + 0x40, 0x08, 0xff, 0xc9, 0x41, 0x89, 0x4e, 0x34, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0x31, 0xf6, 0xff, 0xd0, 0x41, 0xff, 0x46, 0x34, + 0x49, 0x89, 0xc7, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8d, 0x04, 0xed, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x01, 0x44, 0x24, 0x40, 0x49, 0x8b, 0x7c, + 0xed, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x85, 0xff, 0x74, 0x16, 0x4d, + 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd8, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xfa, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x101, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x108, (uintptr_t)data + 0x24); +} + +void +emit__CALL_METHOD_DESCRIPTOR_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_O.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 4c 63 f9 movslq %ecx, %r15 + // 13: 31 f6 xorl %esi, %esi + // 15: 31 c9 xorl %ecx, %ecx + // 17: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 1d: 40 0f 95 c6 setne %sil + // 21: 0f 94 c2 sete %dl + // 24: 01 c6 addl %eax, %esi + // 26: 83 fe 02 cmpl $0x2, %esi + // 29: 75 50 jne 0x7b <_JIT_ENTRY+0x7b> + // 2b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 30: 29 c6 subl %eax, %esi + // 32: 48 63 ee movslq %esi, %rbp + // 35: 49 8b 74 ed 00 movq (%r13,%rbp,8), %rsi + // 3a: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 3e: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_REX_GOTPCRELX PyMethodDescr_Type-0x4 + // 45: 75 34 jne 0x7b <_JIT_ENTRY+0x7b> + // 47: 4c 8b 46 28 movq 0x28(%rsi), %r8 + // 4b: 41 83 78 10 08 cmpl $0x8, 0x10(%r8) + // 50: 75 29 jne 0x7b <_JIT_ENTRY+0x7b> + // 52: 41 8b 5e 34 movl 0x34(%r14), %ebx + // 56: 85 db testl %ebx, %ebx + // 58: 7e 21 jle 0x7b <_JIT_ENTRY+0x7b> + // 5a: c1 e0 03 shll $0x3, %eax + // 5d: 4d 89 e9 movq %r13, %r9 + // 60: 49 29 c1 subq %rax, %r9 + // 63: 88 d1 movb %dl, %cl + // 65: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 6d: 49 8b 3c 01 movq (%r9,%rax), %rdi + // 71: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 75: 48 3b 4e 10 cmpq 0x10(%rsi), %rcx + // 79: 74 0b je 0x86 <_JIT_ENTRY+0x86> + // 7b: 48 83 c4 10 addq $0x10, %rsp + // 7f: 5d popq %rbp + // 80: ff 25 00 00 00 00 jmpq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 86: 49 8b 74 01 08 movq 0x8(%r9,%rax), %rsi + // 8b: 49 8b 40 08 movq 0x8(%r8), %rax + // 8f: ff cb decl %ebx + // 91: 41 89 5e 34 movl %ebx, 0x34(%r14) + // 95: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9a: ff d0 callq *%rax + // 9c: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // a1: 48 89 0c 24 movq %rcx, (%rsp) + // a5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ae: 41 ff 46 34 incl 0x34(%r14) + // b2: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // b7: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // bc: 8b 07 movl (%rdi), %eax + // be: 85 c0 testl %eax, %eax + // c0: 78 0c js 0xce <_JIT_ENTRY+0xce> + // c2: ff c8 decl %eax + // c4: 89 07 movl %eax, (%rdi) + // c6: 75 06 jne 0xce <_JIT_ENTRY+0xce> + // c8: ff 15 00 00 00 00 callq *(%rip) # 0xce <_JIT_ENTRY+0xce> + // 00000000000000ca: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // ce: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // d3: 48 85 ff testq %rdi, %rdi + // d6: 74 12 je 0xea <_JIT_ENTRY+0xea> + // d8: 8b 07 movl (%rdi), %eax + // da: 85 c0 testl %eax, %eax + // dc: 78 0c js 0xea <_JIT_ENTRY+0xea> + // de: ff c8 decl %eax + // e0: 89 07 movl %eax, (%rdi) + // e2: 75 06 jne 0xea <_JIT_ENTRY+0xea> + // e4: ff 15 00 00 00 00 callq *(%rip) # 0xea <_JIT_ENTRY+0xea> + // 00000000000000e6: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // ea: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xf1 <_JIT_ENTRY+0xf1> + // 00000000000000ed: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // f1: 66 85 c0 testw %ax, %ax + // f4: 74 3f je 0x135 <_JIT_ENTRY+0x135> + // f6: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xfd <_JIT_ENTRY+0xfd> + // 00000000000000f9: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // fd: 48 ff c3 incq %rbx + // 100: 49 83 c5 f8 addq $-0x8, %r13 + // 104: eb 17 jmp 0x11d <_JIT_ENTRY+0x11d> + // 106: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 48 ff cb decq %rbx + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fb 01 cmpq $0x1, %rbx + // 11b: 76 18 jbe 0x135 <_JIT_ENTRY+0x135> + // 11d: 49 8b 7d 00 movq (%r13), %rdi + // 121: 8b 07 movl (%rdi), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <_JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 07 movl %eax, (%rdi) + // 12b: 75 e3 jne 0x110 <_JIT_ENTRY+0x110> + // 12d: ff 15 00 00 00 00 callq *(%rip) # 0x133 <_JIT_ENTRY+0x133> + // 000000000000012f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 133: eb db jmp 0x110 <_JIT_ENTRY+0x110> + // 135: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 13a: 48 85 c9 testq %rcx, %rcx + // 13d: 74 17 je 0x156 <_JIT_ENTRY+0x156> + // 13f: 48 8b 04 24 movq (%rsp), %rax + // 143: 48 89 0c e8 movq %rcx, (%rax,%rbp,8) + // 147: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 14b: 48 83 c4 10 addq $0x10, %rsp + // 14f: 5d popq %rbp + // 150: ff 25 00 00 00 00 jmpq *(%rip) # 0x156 <_JIT_ENTRY+0x156> + // 0000000000000152: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 156: 48 8b 04 24 movq (%rsp), %rax + // 15a: 4c 8d 2c e8 leaq (%rax,%rbp,8), %r13 + // 15e: 48 83 c4 10 addq $0x10, %rsp + // 162: 5d popq %rbp + // 163: ff 25 00 00 00 00 jmpq *(%rip) # 0x169 <_JIT_ENTRY+0x169> + // 0000000000000165: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[361] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x4c, 0x63, 0xf9, 0x31, 0xf6, 0x31, 0xc9, 0x4b, + 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x40, 0x0f, 0x95, + 0xc6, 0x0f, 0x94, 0xc2, 0x01, 0xc6, 0x83, 0xfe, + 0x02, 0x75, 0x50, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc6, 0x48, 0x63, 0xee, 0x49, 0x8b, 0x74, + 0xed, 0x00, 0x48, 0x8b, 0x7e, 0x08, 0x48, 0x3b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x75, 0x34, 0x4c, + 0x8b, 0x46, 0x28, 0x41, 0x83, 0x78, 0x10, 0x08, + 0x75, 0x29, 0x41, 0x8b, 0x5e, 0x34, 0x85, 0xdb, + 0x7e, 0x21, 0xc1, 0xe0, 0x03, 0x4d, 0x89, 0xe9, + 0x49, 0x29, 0xc1, 0x88, 0xd1, 0x48, 0x8d, 0x04, + 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x49, 0x8b, 0x3c, + 0x01, 0x48, 0x8b, 0x4f, 0x08, 0x48, 0x3b, 0x4e, + 0x10, 0x74, 0x0b, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x74, 0x01, 0x08, 0x49, 0x8b, 0x40, 0x08, 0xff, + 0xcb, 0x41, 0x89, 0x5e, 0x34, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0xff, 0xd0, 0x49, 0x8b, 0x4c, 0x24, + 0x40, 0x48, 0x89, 0x0c, 0x24, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, + 0x46, 0x34, 0x48, 0x89, 0x44, 0x24, 0x08, 0x49, + 0x8b, 0x7c, 0xed, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x8b, + 0x7c, 0xfd, 0x00, 0x48, 0x85, 0xff, 0x74, 0x12, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3f, 0x0f, 0xb7, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc3, + 0x49, 0x83, 0xc5, 0xf8, 0xeb, 0x17, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x18, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0xdb, 0x48, 0x8b, 0x4c, + 0x24, 0x08, 0x48, 0x85, 0xc9, 0x74, 0x17, 0x48, + 0x8b, 0x04, 0x24, 0x48, 0x89, 0x0c, 0xe8, 0x4e, + 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x04, 0x24, 0x4c, 0x8d, 0x2c, 0xe8, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xca, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe6, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xed, (uintptr_t)data + -0x4); + patch_32r(code + 0xf9, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x12f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x152, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x165, (uintptr_t)data + 0x24); +} + +void +emit__CALL_NON_PY_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_NON_PY_GENERAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 4c 89 74 24 10 movq %r14, 0x10(%rsp) + // a: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 11: 8d 0c c5 00 00 00 00 leal (,%rax,8), %ecx + // 18: 4c 89 ea movq %r13, %rdx + // 1b: 48 29 ca subq %rcx, %rdx + // 1e: 89 c1 movl %eax, %ecx + // 20: f7 d1 notl %ecx + // 22: 4c 63 f9 movslq %ecx, %r15 + // 25: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 2a: 29 c1 subl %eax, %ecx + // 2c: 48 63 e9 movslq %ecx, %rbp + // 2f: 31 c9 xorl %ecx, %ecx + // 31: 31 f6 xorl %esi, %esi + // 33: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 39: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // 3e: 0f 95 c1 setne %cl + // 41: 40 0f 94 c6 sete %sil + // 45: 48 8d 34 f2 leaq (%rdx,%rsi,8), %rsi + // 49: 48 83 c6 f8 addq $-0x8, %rsi + // 4d: 01 c1 addl %eax, %ecx + // 4f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 54: 48 ba 00 00 00 00 00 00 00 80 movabsq $-0x8000000000000000, %rdx # imm = 0x8000000000000000 + // 5e: 48 09 ca orq %rcx, %rdx + // 61: 31 c9 xorl %ecx, %ecx + // 63: ff 15 00 00 00 00 callq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: R_X86_64_GOTPCRELX PyObject_Vectorcall-0x4 + // 69: 48 89 44 24 18 movq %rax, 0x18(%rsp) + // 6e: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 73: 48 89 44 24 08 movq %rax, 0x8(%rsp) + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: 49 8b 7c ed 00 movq (%r13,%rbp,8), %rdi + // 86: 8b 07 movl (%rdi), %eax + // 88: 85 c0 testl %eax, %eax + // 8a: 78 0c js 0x98 <_JIT_ENTRY+0x98> + // 8c: ff c8 decl %eax + // 8e: 89 07 movl %eax, (%rdi) + // 90: 75 06 jne 0x98 <_JIT_ENTRY+0x98> + // 92: ff 15 00 00 00 00 callq *(%rip) # 0x98 <_JIT_ENTRY+0x98> + // 0000000000000094: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 98: 4b 8b 7c fd 00 movq (%r13,%r15,8), %rdi + // 9d: 48 85 ff testq %rdi, %rdi + // a0: 74 12 je 0xb4 <_JIT_ENTRY+0xb4> + // a2: 8b 07 movl (%rdi), %eax + // a4: 85 c0 testl %eax, %eax + // a6: 78 0c js 0xb4 <_JIT_ENTRY+0xb4> + // a8: ff c8 decl %eax + // aa: 89 07 movl %eax, (%rdi) + // ac: 75 06 jne 0xb4 <_JIT_ENTRY+0xb4> + // ae: ff 15 00 00 00 00 callq *(%rip) # 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b0: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b4: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xbb <_JIT_ENTRY+0xbb> + // 00000000000000b7: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // bb: 66 85 c0 testw %ax, %ax + // be: 74 41 je 0x101 <_JIT_ENTRY+0x101> + // c0: 44 0f b7 35 00 00 00 00 movzwl (%rip), %r14d # 0xc8 <_JIT_ENTRY+0xc8> + // 00000000000000c4: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c8: 49 ff c6 incq %r14 + // cb: 49 83 c5 f8 addq $-0x8, %r13 + // cf: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0xd6 <_JIT_ENTRY+0xd6> + // 00000000000000d2: R_X86_64_REX_GOTPCRELX _Py_Dealloc-0x4 + // d6: eb 15 jmp 0xed <_JIT_ENTRY+0xed> + // d8: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // e0: 49 ff ce decq %r14 + // e3: 49 83 c5 f8 addq $-0x8, %r13 + // e7: 49 83 fe 01 cmpq $0x1, %r14 + // eb: 76 14 jbe 0x101 <_JIT_ENTRY+0x101> + // ed: 49 8b 7d 00 movq (%r13), %rdi + // f1: 8b 07 movl (%rdi), %eax + // f3: 85 c0 testl %eax, %eax + // f5: 78 e9 js 0xe0 <_JIT_ENTRY+0xe0> + // f7: ff c8 decl %eax + // f9: 89 07 movl %eax, (%rdi) + // fb: 75 e3 jne 0xe0 <_JIT_ENTRY+0xe0> + // fd: ff d3 callq *%rbx + // ff: eb df jmp 0xe0 <_JIT_ENTRY+0xe0> + // 101: 48 8b 4c 24 18 movq 0x18(%rsp), %rcx + // 106: 48 85 c9 testq %rcx, %rcx + // 109: 74 1d je 0x128 <_JIT_ENTRY+0x128> + // 10b: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // 110: 48 89 0c e8 movq %rcx, (%rax,%rbp,8) + // 114: 4e 8d 2c f8 leaq (%rax,%r15,8), %r13 + // 118: 4c 8b 74 24 10 movq 0x10(%rsp), %r14 + // 11d: 48 83 c4 20 addq $0x20, %rsp + // 121: 5d popq %rbp + // 122: ff 25 00 00 00 00 jmpq *(%rip) # 0x128 <_JIT_ENTRY+0x128> + // 0000000000000124: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 128: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // 12d: 4c 8d 2c e8 leaq (%rax,%rbp,8), %r13 + // 131: 4c 8b 74 24 10 movq 0x10(%rsp), %r14 + // 136: 48 83 c4 20 addq $0x20, %rsp + // 13a: 5d popq %rbp + // 13b: ff 25 00 00 00 00 jmpq *(%rip) # 0x141 <_JIT_ENTRY+0x141> + // 000000000000013d: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[321] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x4c, 0x89, 0x74, + 0x24, 0x10, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x8d, 0x0c, 0xc5, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xea, 0x48, 0x29, 0xca, 0x89, 0xc1, + 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0xb9, 0xfe, 0xff, + 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xe9, 0x31, + 0xc9, 0x31, 0xf6, 0x4b, 0x83, 0x7c, 0xfd, 0x00, + 0x00, 0x49, 0x8b, 0x7c, 0xed, 0x00, 0x0f, 0x95, + 0xc1, 0x40, 0x0f, 0x94, 0xc6, 0x48, 0x8d, 0x34, + 0xf2, 0x48, 0x83, 0xc6, 0xf8, 0x01, 0xc1, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0xba, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x48, 0x09, + 0xca, 0x31, 0xc9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x44, 0x24, 0x18, 0x49, 0x8b, + 0x44, 0x24, 0x40, 0x48, 0x89, 0x44, 0x24, 0x08, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x7c, 0xed, 0x00, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x8b, 0x7c, 0xfd, 0x00, 0x48, 0x85, 0xff, + 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x41, + 0x44, 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc6, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x15, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xce, 0x49, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xfe, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x7d, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0xe3, 0xff, 0xd3, 0xeb, + 0xdf, 0x48, 0x8b, 0x4c, 0x24, 0x18, 0x48, 0x85, + 0xc9, 0x74, 0x1d, 0x48, 0x8b, 0x44, 0x24, 0x08, + 0x48, 0x89, 0x0c, 0xe8, 0x4e, 0x8d, 0x2c, 0xf8, + 0x4c, 0x8b, 0x74, 0x24, 0x10, 0x48, 0x83, 0xc4, + 0x20, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x08, 0x4c, 0x8d, 0x2c, + 0xe8, 0x4c, 0x8b, 0x74, 0x24, 0x10, 0x48, 0x83, + 0xc4, 0x20, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyObject_Vectorcall+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x94, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb0, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb7, (uintptr_t)data + -0x4); + patch_32r(code + 0xc4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x124, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x13d, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_STR_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_STR_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 6: 75 0d jne 0x15 <_JIT_ENTRY+0x15> + // 8: 49 8b 45 e8 movq -0x18(%r13), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_REX_GOTPCRELX PyUnicode_Type-0x4 + // 13: 74 07 je 0x1c <_JIT_ENTRY+0x1c> + // 15: 58 popq %rax + // 16: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 1c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 20: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 25: 48 89 df movq %rbx, %rdi + // 28: ff 15 00 00 00 00 callq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX PyObject_Str-0x4 + // 2e: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 34: 8b 0b movl (%rbx), %ecx + // 36: 85 c9 testl %ecx, %ecx + // 38: 78 15 js 0x4f <_JIT_ENTRY+0x4f> + // 3a: ff c9 decl %ecx + // 3c: 89 0b movl %ecx, (%rbx) + // 3e: 75 0f jne 0x4f <_JIT_ENTRY+0x4f> + // 40: 48 89 df movq %rbx, %rdi + // 43: 48 89 c3 movq %rax, %rbx + // 46: ff 15 00 00 00 00 callq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4c: 48 89 d8 movq %rbx, %rax + // 4f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 54: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5d: 48 85 c0 testq %rax, %rax + // 60: 74 0f je 0x71 <_JIT_ENTRY+0x71> + // 62: 49 89 45 00 movq %rax, (%r13) + // 66: 49 83 c5 08 addq $0x8, %r13 + // 6a: 58 popq %rax + // 6b: ff 25 00 00 00 00 jmpq *(%rip) # 0x71 <_JIT_ENTRY+0x71> + // 000000000000006d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 71: 58 popq %rax + // 72: ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[120] = { + 0x50, 0x49, 0x83, 0x7d, 0xf0, 0x00, 0x75, 0x0d, + 0x49, 0x8b, 0x45, 0xe8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x07, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x0f, + 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: JUMP_TARGET + // 10: &PyObject_Str+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyObject_Str); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x24); +} + +void +emit__CALL_TUPLE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TUPLE_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 6: 75 0d jne 0x15 <_JIT_ENTRY+0x15> + // 8: 49 8b 45 e8 movq -0x18(%r13), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_REX_GOTPCRELX PyTuple_Type-0x4 + // 13: 74 07 je 0x1c <_JIT_ENTRY+0x1c> + // 15: 58 popq %rax + // 16: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 1c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 20: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 25: 48 89 df movq %rbx, %rdi + // 28: ff 15 00 00 00 00 callq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX PySequence_Tuple-0x4 + // 2e: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 34: 8b 0b movl (%rbx), %ecx + // 36: 85 c9 testl %ecx, %ecx + // 38: 78 15 js 0x4f <_JIT_ENTRY+0x4f> + // 3a: ff c9 decl %ecx + // 3c: 89 0b movl %ecx, (%rbx) + // 3e: 75 0f jne 0x4f <_JIT_ENTRY+0x4f> + // 40: 48 89 df movq %rbx, %rdi + // 43: 48 89 c3 movq %rax, %rbx + // 46: ff 15 00 00 00 00 callq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4c: 48 89 d8 movq %rbx, %rax + // 4f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 54: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5d: 48 85 c0 testq %rax, %rax + // 60: 74 0f je 0x71 <_JIT_ENTRY+0x71> + // 62: 49 89 45 00 movq %rax, (%r13) + // 66: 49 83 c5 08 addq $0x8, %r13 + // 6a: 58 popq %rax + // 6b: ff 25 00 00 00 00 jmpq *(%rip) # 0x71 <_JIT_ENTRY+0x71> + // 000000000000006d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 71: 58 popq %rax + // 72: ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[120] = { + 0x50, 0x49, 0x83, 0x7d, 0xf0, 0x00, 0x75, 0x0d, + 0x49, 0x8b, 0x45, 0xe8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x07, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x0f, + 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: JUMP_TARGET + // 10: &PySequence_Tuple+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x24); +} + +void +emit__CALL_TYPE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TYPE_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 6: 75 0d jne 0x15 <_JIT_ENTRY+0x15> + // 8: 49 8b 45 e8 movq -0x18(%r13), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_REX_GOTPCRELX PyType_Type-0x4 + // 13: 74 07 je 0x1c <_JIT_ENTRY+0x1c> + // 15: 58 popq %rax + // 16: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 1c: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 20: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 24: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 28: 8b 11 movl (%rcx), %edx + // 2a: 85 d2 testl %edx, %edx + // 2c: 78 04 js 0x32 <_JIT_ENTRY+0x32> + // 2e: ff c2 incl %edx + // 30: 89 11 movl %edx, (%rcx) + // 32: 49 89 4d e8 movq %rcx, -0x18(%r13) + // 36: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 3b: 8b 07 movl (%rdi), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 06 js 0x47 <_JIT_ENTRY+0x47> + // 41: ff c8 decl %eax + // 43: 89 07 movl %eax, (%rdi) + // 45: 74 15 je 0x5c <_JIT_ENTRY+0x5c> + // 47: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 55: 58 popq %rax + // 56: ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 5c: ff 15 00 00 00 00 callq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 62: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 67: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 70: 58 popq %rax + // 71: ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[113] = { + 0x50, 0x49, 0x83, 0x7d, 0xf0, 0x00, 0x75, 0x0d, + 0x49, 0x8b, 0x45, 0xe8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x07, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7d, 0xf8, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x8b, 0x4f, 0x08, + 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, + 0x89, 0x11, 0x49, 0x89, 0x4d, 0xe8, 0x49, 0x89, + 0x44, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, + }; + // 0: &PyType_Type+0x0 + // 8: JUMP_TARGET + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyType_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0x14); +} + +void +emit__CHECK_AND_ALLOCATE_OBJECT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_AND_ALLOCATE_OBJECT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 89 c1 movl %eax, %ecx + // a: f7 d1 notl %ecx + // c: 4c 63 f9 movslq %ecx, %r15 + // f: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 15: 0f 85 d9 00 00 00 jne 0xf4 <_JIT_ENTRY+0xf4> + // 1b: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 20: 29 c1 subl %eax, %ecx + // 22: 48 63 d9 movslq %ecx, %rbx + // 25: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 2a: 48 8b 47 08 movq 0x8(%rdi), %rax + // 2e: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 35: 0f 84 b9 00 00 00 je 0xf4 <_JIT_ENTRY+0xf4> + // 3b: 8b 87 80 01 00 00 movl 0x180(%rdi), %eax + // 41: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 47: 0f 85 a7 00 00 00 jne 0xf4 <_JIT_ENTRY+0xf4> + // 4d: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // 54: 48 85 c0 testq %rax, %rax + // 57: 0f 84 97 00 00 00 je 0xf4 <_JIT_ENTRY+0xf4> + // 5d: 48 8b af a0 03 00 00 movq 0x3a0(%rdi), %rbp + // 64: 48 8b 4d 30 movq 0x30(%rbp), %rcx + // 68: 48 63 49 4c movslq 0x4c(%rcx), %rcx + // 6c: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_REX_GOTPCRELX _Py_InitCleanup-0x4 + // 73: 48 63 52 4c movslq 0x4c(%rdx), %rdx + // 77: 48 01 ca addq %rcx, %rdx + // 7a: 49 8b 8e f8 00 00 00 movq 0xf8(%r14), %rcx + // 81: 48 29 c1 subq %rax, %rcx + // 84: 48 c1 f9 03 sarq $0x3, %rcx + // 88: 48 39 d1 cmpq %rdx, %rcx + // 8b: 7e 67 jle 0xf4 <_JIT_ENTRY+0xf4> + // 8d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 92: 31 f6 xorl %esi, %esi + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: R_X86_64_GOTPCRELX PyType_GenericAlloc-0x4 + // 9a: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // 9f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a8: 48 85 c0 testq %rax, %rax + // ab: 74 4e je 0xfb <_JIT_ENTRY+0xfb> + // ad: 4b 89 44 fd 00 movq %rax, (%r13,%r15,8) + // b2: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // b7: 8b 45 00 movl (%rbp), %eax + // ba: 85 c0 testl %eax, %eax + // bc: 78 05 js 0xc3 <_JIT_ENTRY+0xc3> + // be: ff c0 incl %eax + // c0: 89 45 00 movl %eax, (%rbp) + // c3: 49 89 6c dd 00 movq %rbp, (%r13,%rbx,8) + // c8: 49 89 4c 24 40 movq %rcx, 0x40(%r12) + // cd: 8b 07 movl (%rdi), %eax + // cf: 85 c0 testl %eax, %eax + // d1: 78 0c js 0xdf <_JIT_ENTRY+0xdf> + // d3: ff c8 decl %eax + // d5: 89 07 movl %eax, (%rdi) + // d7: 75 06 jne 0xdf <_JIT_ENTRY+0xdf> + // d9: ff 15 00 00 00 00 callq *(%rip) # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // df: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e4: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ed: 5d popq %rbp + // ee: ff 25 00 00 00 00 jmpq *(%rip) # 0xf4 <_JIT_ENTRY+0xf4> + // 00000000000000f0: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // f4: 5d popq %rbp + // f5: ff 25 00 00 00 00 jmpq *(%rip) # 0xfb <_JIT_ENTRY+0xfb> + // 00000000000000f7: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // fb: 49 89 cd movq %rcx, %r13 + // fe: 5d popq %rbp + // ff: ff 25 00 00 00 00 jmpq *(%rip) # 0x105 <_JIT_ENTRY+0x105> + // 0000000000000101: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[261] = { + 0x55, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc1, 0xf7, 0xd1, 0x4c, 0x63, 0xf9, 0x4b, + 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x0f, 0x85, 0xd9, + 0x00, 0x00, 0x00, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xd9, 0x49, 0x8b, 0x7c, + 0xdd, 0x00, 0x48, 0x8b, 0x47, 0x08, 0xf6, 0x80, + 0xab, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x84, 0xb9, + 0x00, 0x00, 0x00, 0x8b, 0x87, 0x80, 0x01, 0x00, + 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x85, 0xa7, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x86, + 0xf0, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x0f, + 0x84, 0x97, 0x00, 0x00, 0x00, 0x48, 0x8b, 0xaf, + 0xa0, 0x03, 0x00, 0x00, 0x48, 0x8b, 0x4d, 0x30, + 0x48, 0x63, 0x49, 0x4c, 0x48, 0x8b, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x63, 0x52, 0x4c, 0x48, + 0x01, 0xca, 0x49, 0x8b, 0x8e, 0xf8, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xc1, 0x48, 0xc1, 0xf9, 0x03, + 0x48, 0x39, 0xd1, 0x7e, 0x67, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x31, 0xf6, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x4c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x4e, 0x4b, 0x89, 0x44, + 0xfd, 0x00, 0x49, 0x8b, 0x7c, 0xdd, 0x00, 0x8b, + 0x45, 0x00, 0x85, 0xc0, 0x78, 0x05, 0xff, 0xc0, + 0x89, 0x45, 0x00, 0x49, 0x89, 0x6c, 0xdd, 0x00, + 0x49, 0x89, 0x4c, 0x24, 0x40, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0xcd, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: OPERAND0 + // 10: &_Py_InitCleanup+0x0 + // 18: &PyType_GenericAlloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + // 38: ERROR_TARGET + const unsigned char data_body[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x18, (uintptr_t)&PyType_GenericAlloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xf0, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x101, (uintptr_t)data + 0x34); +} + +void +emit__CHECK_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_CLASS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: f6 81 ab 00 00 00 80 testb $-0x80, 0xab(%rcx) + // f: 74 14 je 0x25 <_JIT_ENTRY+0x25> + // 11: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // 17: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 1d: 75 06 jne 0x25 <_JIT_ENTRY+0x25> + // 1f: ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 25: ff 25 00 00 00 00 jmpq *(%rip) # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[43] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0xf6, 0x81, 0xab, 0x00, 0x00, 0x00, 0x80, 0x74, + 0x14, 0x8b, 0x80, 0x80, 0x01, 0x00, 0x00, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, 0x06, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_METHOD_LAZY_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // b: 48 83 7c 08 e8 00 cmpq $0x0, -0x18(%rax,%rcx) + // 11: 74 06 je 0x19 <_JIT_ENTRY+0x19> + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 19: ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[25] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0x7c, 0x08, 0xe8, + 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_ATTR_MODULE_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_MODULE_PUSH_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 8b 89 90 00 00 00 movq 0x90(%rcx), %rcx + // f: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: R_X86_64_REX_GOTPCRELX PyModule_Type-0x4 + // 16: 48 3b 8a 90 00 00 00 cmpq 0x90(%rdx), %rcx + // 1d: 75 21 jne 0x40 <_JIT_ENTRY+0x40> + // 1f: 48 8b 40 10 movq 0x10(%rax), %rax + // 23: 48 8b 40 20 movq 0x20(%rax), %rax + // 27: 8b 48 0c movl 0xc(%rax), %ecx + // 2a: 3b 0d 00 00 00 00 cmpl (%rip), %ecx # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 30: 75 0e jne 0x40 <_JIT_ENTRY+0x40> + // 32: 49 89 45 00 movq %rax, (%r13) + // 36: 49 83 c5 08 addq $0x8, %r13 + // 3a: ff 25 00 00 00 00 jmpq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 40: ff 25 00 00 00 00 jmpq *(%rip) # 0x46 <_JIT_ENTRY+0x46> + // 0000000000000042: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[70] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x8b, 0x89, 0x90, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x3b, + 0x8a, 0x90, 0x00, 0x00, 0x00, 0x75, 0x21, 0x48, + 0x8b, 0x40, 0x10, 0x48, 0x8b, 0x40, 0x20, 0x8b, + 0x48, 0x0c, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x0e, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyModule_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyModule_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x42, (uintptr_t)data + 0x14); +} + +void +emit__CHECK_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_WITH_HINT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 e8 movq -0x18(%rax), %rax + // 8: 48 85 c0 testq %rax, %rax + // b: 74 0e je 0x1b <_JIT_ENTRY+0x1b> + // d: 49 89 45 00 movq %rax, (%r13) + // 11: 49 83 c5 08 addq $0x8, %r13 + // 15: ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1b: ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0xe8, + 0x48, 0x85, 0xc0, 0x74, 0x0e, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_CALL_BOUND_METHOD_EXACT_ARGS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 89 c1 movl %eax, %ecx + // 9: f7 d1 notl %ecx + // b: 48 63 c9 movslq %ecx, %rcx + // e: 49 83 7c cd 00 00 cmpq $0x0, (%r13,%rcx,8) + // 14: 75 1c jne 0x32 <_JIT_ENTRY+0x32> + // 16: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 1b: 29 c1 subl %eax, %ecx + // 1d: 48 63 c1 movslq %ecx, %rax + // 20: 49 8b 44 c5 00 movq (%r13,%rax,8), %rax + // 25: 48 8b 40 08 movq 0x8(%rax), %rax + // 29: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 30: 74 06 je 0x38 <_JIT_ENTRY+0x38> + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[56] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xc9, 0x49, 0x83, + 0x7c, 0xcd, 0x00, 0x00, 0x75, 0x1c, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xc1, + 0x49, 0x8b, 0x44, 0xc5, 0x00, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_EG_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EG_MATCH.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 9: 49 8b 5d f8 movq -0x8(%r13), %rbx + // d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 12: 4c 89 f7 movq %r14, %rdi + // 15: 48 89 de movq %rbx, %rsi + // 18: ff 15 00 00 00 00 callq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_GOTPCRELX _PyEval_CheckExceptStarTypeValid-0x4 + // 1e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 23: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2c: 85 c0 testl %eax, %eax + // 2e: 0f 88 ba 00 00 00 js 0xee <_JIT_ENTRY+0xee> + // 34: 48 c7 04 24 00 00 00 00 movq $0x0, (%rsp) + // 3c: 48 c7 44 24 08 00 00 00 00 movq $0x0, 0x8(%rsp) + // 45: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4a: 48 89 e1 movq %rsp, %rcx + // 4d: 4c 8d 44 24 08 leaq 0x8(%rsp), %r8 + // 52: 4c 89 e7 movq %r12, %rdi + // 55: 4c 89 fe movq %r15, %rsi + // 58: 48 89 da movq %rbx, %rdx + // 5b: ff 15 00 00 00 00 callq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: R_X86_64_GOTPCRELX _PyEval_ExceptionGroupMatch-0x4 + // 61: 89 c5 movl %eax, %ebp + // 63: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 68: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 71: 41 8b 07 movl (%r15), %eax + // 74: 85 c0 testl %eax, %eax + // 76: 78 10 js 0x88 <_JIT_ENTRY+0x88> + // 78: ff c8 decl %eax + // 7a: 41 89 07 movl %eax, (%r15) + // 7d: 75 09 jne 0x88 <_JIT_ENTRY+0x88> + // 7f: 4c 89 ff movq %r15, %rdi + // 82: ff 15 00 00 00 00 callq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 88: 8b 03 movl (%rbx), %eax + // 8a: 85 c0 testl %eax, %eax + // 8c: 78 0a js 0x98 <_JIT_ENTRY+0x98> + // 8e: ff c8 decl %eax + // 90: 89 03 movl %eax, (%rbx) + // 92: 0f 84 88 00 00 00 je 0x120 <_JIT_ENTRY+0x120> + // 98: 85 ed testl %ebp, %ebp + // 9a: 78 75 js 0x111 <_JIT_ENTRY+0x111> + // 9c: 48 8b 3c 24 movq (%rsp), %rdi + // a0: 48 85 ff testq %rdi, %rdi + // a3: 74 6c je 0x111 <_JIT_ENTRY+0x111> + // a5: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xac <_JIT_ENTRY+0xac> + // 00000000000000a8: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // ac: 48 39 c7 cmpq %rax, %rdi + // af: 74 25 je 0xd6 <_JIT_ENTRY+0xd6> + // b1: 49 83 c5 f0 addq $-0x10, %r13 + // b5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // ba: ff 15 00 00 00 00 callq *(%rip) # 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000bc: R_X86_64_GOTPCRELX PyErr_SetHandledException-0x4 + // c0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // c5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ce: 49 83 c5 10 addq $0x10, %r13 + // d2: 48 8b 04 24 movq (%rsp), %rax + // d6: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // db: 49 89 4d f0 movq %rcx, -0x10(%r13) + // df: 49 89 45 f8 movq %rax, -0x8(%r13) + // e3: 48 83 c4 10 addq $0x10, %rsp + // e7: 5d popq %rbp + // e8: ff 25 00 00 00 00 jmpq *(%rip) # 0xee <_JIT_ENTRY+0xee> + // 00000000000000ea: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // ee: 41 8b 07 movl (%r15), %eax + // f1: 85 c0 testl %eax, %eax + // f3: 78 10 js 0x105 <_JIT_ENTRY+0x105> + // f5: ff c8 decl %eax + // f7: 41 89 07 movl %eax, (%r15) + // fa: 75 09 jne 0x105 <_JIT_ENTRY+0x105> + // fc: 4c 89 ff movq %r15, %rdi + // ff: ff 15 00 00 00 00 callq *(%rip) # 0x105 <_JIT_ENTRY+0x105> + // 0000000000000101: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 105: 8b 03 movl (%rbx), %eax + // 107: 85 c0 testl %eax, %eax + // 109: 78 06 js 0x111 <_JIT_ENTRY+0x111> + // 10b: ff c8 decl %eax + // 10d: 89 03 movl %eax, (%rbx) + // 10f: 74 22 je 0x133 <_JIT_ENTRY+0x133> + // 111: 49 83 c5 f0 addq $-0x10, %r13 + // 115: 48 83 c4 10 addq $0x10, %rsp + // 119: 5d popq %rbp + // 11a: ff 25 00 00 00 00 jmpq *(%rip) # 0x120 <_JIT_ENTRY+0x120> + // 000000000000011c: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 120: 48 89 df movq %rbx, %rdi + // 123: ff 15 00 00 00 00 callq *(%rip) # 0x129 <_JIT_ENTRY+0x129> + // 0000000000000125: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 129: 85 ed testl %ebp, %ebp + // 12b: 0f 89 6b ff ff ff jns 0x9c <_JIT_ENTRY+0x9c> + // 131: eb de jmp 0x111 <_JIT_ENTRY+0x111> + // 133: 48 89 df movq %rbx, %rdi + // 136: ff 15 00 00 00 00 callq *(%rip) # 0x13c <_JIT_ENTRY+0x13c> + // 0000000000000138: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 13c: 49 83 c5 f0 addq $-0x10, %r13 + // 140: 48 83 c4 10 addq $0x10, %rsp + // 144: 5d popq %rbp + // 145: ff 25 00 00 00 00 jmpq *(%rip) # 0x14b <_JIT_ENTRY+0x14b> + // 0000000000000147: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[331] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4d, 0x8b, 0x7d, + 0xf0, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xde, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x88, + 0xba, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x04, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x44, 0x24, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xe1, 0x4c, 0x8d, 0x44, + 0x24, 0x08, 0x4c, 0x89, 0xe7, 0x4c, 0x89, 0xfe, + 0x48, 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xc5, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, + 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0a, 0xff, 0xc8, + 0x89, 0x03, 0x0f, 0x84, 0x88, 0x00, 0x00, 0x00, + 0x85, 0xed, 0x78, 0x75, 0x48, 0x8b, 0x3c, 0x24, + 0x48, 0x85, 0xff, 0x74, 0x6c, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x39, 0xc7, 0x74, + 0x25, 0x49, 0x83, 0xc5, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0x10, 0x48, 0x8b, 0x04, 0x24, 0x48, 0x8b, + 0x4c, 0x24, 0x08, 0x49, 0x89, 0x4d, 0xf0, 0x49, + 0x89, 0x45, 0xf8, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x22, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xed, 0x0f, 0x89, 0x6b, 0xff, 0xff, + 0xff, 0xeb, 0xde, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_CheckExceptStarTypeValid+0x0 + // 8: &_PyEval_ExceptionGroupMatch+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_Py_NoneStruct+0x0 + // 20: &PyErr_SetHandledException+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_CheckExceptStarTypeValid); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ExceptionGroupMatch); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x20, (uintptr_t)&PyErr_SetHandledException); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa8, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xbc, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xea, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x101, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x11c, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x125, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x138, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x147, (uintptr_t)data + 0x2c); +} + +void +emit__CHECK_EXC_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EXC_MATCH.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 4c 89 f7 movq %r14, %rdi + // 11: 48 89 de movq %rbx, %rsi + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _PyEval_CheckExceptTypeValid-0x4 + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 85 c0 testl %eax, %eax + // 2a: 78 41 js 0x6d <_JIT_ENTRY+0x6d> + // 2c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 31: 4c 89 ff movq %r15, %rdi + // 34: 48 89 de movq %rbx, %rsi + // 37: ff 15 00 00 00 00 callq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX PyErr_GivenExceptionMatches-0x4 + // 3d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 42: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4b: 8b 0b movl (%rbx), %ecx + // 4d: 85 c9 testl %ecx, %ecx + // 4f: 78 06 js 0x57 <_JIT_ENTRY+0x57> + // 51: ff c9 decl %ecx + // 53: 89 0b movl %ecx, (%rbx) + // 55: 74 2d je 0x84 <_JIT_ENTRY+0x84> + // 57: 85 c0 testl %eax, %eax + // 59: 75 3a jne 0x95 <_JIT_ENTRY+0x95> + // 5b: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 62: 49 89 45 f8 movq %rax, -0x8(%r13) + // 66: 58 popq %rax + // 67: ff 25 00 00 00 00 jmpq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6d: 8b 03 movl (%rbx), %eax + // 6f: 85 c0 testl %eax, %eax + // 71: 78 06 js 0x79 <_JIT_ENTRY+0x79> + // 73: ff c8 decl %eax + // 75: 89 03 movl %eax, (%rbx) + // 77: 74 2e je 0xa7 <_JIT_ENTRY+0xa7> + // 79: 49 83 c5 f8 addq $-0x8, %r13 + // 7d: 58 popq %rax + // 7e: ff 25 00 00 00 00 jmpq *(%rip) # 0x84 <_JIT_ENTRY+0x84> + // 0000000000000080: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 84: 48 89 df movq %rbx, %rdi + // 87: 89 c3 movl %eax, %ebx + // 89: ff 15 00 00 00 00 callq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 8f: 89 d8 movl %ebx, %eax + // 91: 85 c0 testl %eax, %eax + // 93: 74 c6 je 0x5b <_JIT_ENTRY+0x5b> + // 95: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x9c <_JIT_ENTRY+0x9c> + // 0000000000000098: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 9c: 49 89 45 f8 movq %rax, -0x8(%r13) + // a0: 58 popq %rax + // a1: ff 25 00 00 00 00 jmpq *(%rip) # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // a7: 48 89 df movq %rbx, %rdi + // aa: ff 15 00 00 00 00 callq *(%rip) # 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000ac: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b0: 49 83 c5 f8 addq $-0x8, %r13 + // b4: 58 popq %rax + // b5: ff 25 00 00 00 00 jmpq *(%rip) # 0xbb <_JIT_ENTRY+0xbb> + // 00000000000000b7: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[187] = { + 0x50, 0x4d, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf7, 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x41, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xff, 0x48, 0x89, 0xde, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x2d, 0x85, + 0xc0, 0x75, 0x3a, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x2e, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xd8, 0x85, 0xc0, 0x74, 0xc6, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_CheckExceptTypeValid+0x0 + // 8: &PyErr_GivenExceptionMatches+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + // 28: &_Py_Dealloc+0x0 + // 30: &_Py_TrueStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_CheckExceptTypeValid); + patch_64(data + 0x8, (uintptr_t)&PyErr_GivenExceptionMatches); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x80, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x98, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xac, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xb7, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 10 movq 0x10(%r12), %rax + // 5: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // b: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 11: 75 06 jne 0x19 <_JIT_ENTRY+0x19> + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 19: ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[31] = { + 0x49, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x80, 0x90, + 0x00, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_FUNCTION_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_EXACT_ARGS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 89 c1 movl %eax, %ecx + // 9: f7 d1 notl %ecx + // b: 48 63 c9 movslq %ecx, %rcx + // e: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 13: 29 c2 subl %eax, %edx + // 15: 48 63 d2 movslq %edx, %rdx + // 18: 49 8b 54 d5 00 movq (%r13,%rdx,8), %rdx + // 1d: 48 8b 52 30 movq 0x30(%rdx), %rdx + // 21: 49 83 7c cd 00 01 cmpq $0x1, (%r13,%rcx,8) + // 27: 83 d8 ff sbbl $-0x1, %eax + // 2a: 39 42 34 cmpl %eax, 0x34(%rdx) + // 2d: 75 06 jne 0x35 <_JIT_ENTRY+0x35> + // 2f: ff 25 00 00 00 00 jmpq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[59] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xc9, 0xba, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc2, 0x48, 0x63, 0xd2, + 0x49, 0x8b, 0x54, 0xd5, 0x00, 0x48, 0x8b, 0x52, + 0x30, 0x49, 0x83, 0x7c, 0xcd, 0x00, 0x01, 0x83, + 0xd8, 0xff, 0x39, 0x42, 0x34, 0x75, 0x06, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_FUNCTION_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 48 08 movq 0x8(%rax), %rcx + // 1a: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyFunction_Type-0x4 + // 21: 75 14 jne 0x37 <_JIT_ENTRY+0x37> + // 23: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 29: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 2f: 75 06 jne 0x37 <_JIT_ENTRY+0x37> + // 31: ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 37: ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[61] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfe, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x48, 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x14, 0x8b, 0x80, 0x90, 0x00, 0x00, + 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: OPERAND0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->operand0); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_FUNCTION_VERSION_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_INLINE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPERAND1-0x4 + // 7: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // d: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 13: 75 06 jne 0x1b <_JIT_ENTRY+0x1b> + // 15: ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1b: ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[33] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x80, 0x90, 0x00, 0x00, 0x00, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x06, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND1 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand1); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x14); +} + +void +emit__CHECK_FUNCTION_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_KW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 48 c7 c1 fd ff ff ff movq $-0x3, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 48 08 movq 0x8(%rax), %rcx + // 1a: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyFunction_Type-0x4 + // 21: 75 14 jne 0x37 <_JIT_ENTRY+0x37> + // 23: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 29: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 2f: 75 06 jne 0x37 <_JIT_ENTRY+0x37> + // 31: ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 37: ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[61] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfd, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x48, 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x14, 0x8b, 0x80, 0x90, 0x00, 0x00, + 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: OPERAND0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->operand0); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 40 08 movq 0x8(%rax), %rax + // 1a: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyFunction_Type-0x4 + // 21: 74 0f je 0x32 <_JIT_ENTRY+0x32> + // 23: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 2a: 74 06 je 0x32 <_JIT_ENTRY+0x32> + // 2c: ff 25 00 00 00 00 jmpq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[56] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfe, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x0f, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE_KW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 48 c7 c1 fd ff ff ff movq $-0x3, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 40 08 movq 0x8(%rax), %rax + // 1a: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyFunction_Type-0x4 + // 21: 74 0f je 0x32 <_JIT_ENTRY+0x32> + // 23: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 2a: 74 06 je 0x32 <_JIT_ENTRY+0x32> + // 2c: ff 25 00 00 00 00 jmpq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[56] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfd, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x0f, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_MANAGED_OBJECT_HAS_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_MANAGED_OBJECT_HAS_VALUES.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 8b 49 20 movq 0x20(%rcx), %rcx + // c: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 11: 74 06 je 0x19 <_JIT_ENTRY+0x19> + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 19: ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[31] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x8b, 0x49, 0x20, 0x80, 0x7c, 0x08, 0x03, + 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_METHOD_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // c: 29 c1 subl %eax, %ecx + // e: 48 63 c9 movslq %ecx, %rcx + // 11: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 16: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1a: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 21: 75 2b jne 0x4e <_JIT_ENTRY+0x4e> + // 23: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 27: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2b: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_REX_GOTPCRELX PyFunction_Type-0x4 + // 32: 75 1a jne 0x4e <_JIT_ENTRY+0x4e> + // 34: 8b 89 90 00 00 00 movl 0x90(%rcx), %ecx + // 3a: 3b 0d 00 00 00 00 cmpl (%rip), %ecx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 40: 75 0c jne 0x4e <_JIT_ENTRY+0x4e> + // 42: f7 d0 notl %eax + // 44: 48 98 cltq + // 46: 49 83 7c c5 00 00 cmpq $0x0, (%r13,%rax,8) + // 4c: 74 06 je 0x54 <_JIT_ENTRY+0x54> + // 4e: ff 25 00 00 00 00 jmpq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[84] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, + 0xc9, 0x49, 0x8b, 0x4c, 0xcd, 0x00, 0x48, 0x8b, + 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x2b, 0x48, 0x8b, 0x49, 0x10, 0x48, + 0x8b, 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x1a, 0x8b, 0x89, 0x90, 0x00, + 0x00, 0x00, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x0c, 0xf7, 0xd0, 0x48, 0x98, 0x49, 0x83, + 0x7c, 0xc5, 0x00, 0x00, 0x74, 0x06, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &PyFunction_Type+0x0 + // 18: OPERAND0 + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x18, instruction->operand0); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_METHOD_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION_KW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: b9 fd ff ff ff movl $0xfffffffd, %ecx # imm = 0xFFFFFFFD + // c: 29 c1 subl %eax, %ecx + // e: 48 63 c9 movslq %ecx, %rcx + // 11: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 16: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1a: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 21: 75 31 jne 0x54 <_JIT_ENTRY+0x54> + // 23: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 27: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2b: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_REX_GOTPCRELX PyFunction_Type-0x4 + // 32: 75 20 jne 0x54 <_JIT_ENTRY+0x54> + // 34: 8b 89 90 00 00 00 movl 0x90(%rcx), %ecx + // 3a: 3b 0d 00 00 00 00 cmpl (%rip), %ecx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 40: 75 12 jne 0x54 <_JIT_ENTRY+0x54> + // 42: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 47: 29 c1 subl %eax, %ecx + // 49: 48 63 c1 movslq %ecx, %rax + // 4c: 49 83 7c c5 00 00 cmpq $0x0, (%r13,%rax,8) + // 52: 74 06 je 0x5a <_JIT_ENTRY+0x5a> + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 5a: ff 25 00 00 00 00 jmpq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[90] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0xfd, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, + 0xc9, 0x49, 0x8b, 0x4c, 0xcd, 0x00, 0x48, 0x8b, + 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x31, 0x48, 0x8b, 0x49, 0x10, 0x48, + 0x8b, 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x20, 0x8b, 0x89, 0x90, 0x00, + 0x00, 0x00, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x12, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc1, 0x48, 0x63, 0xc1, 0x49, 0x83, 0x7c, 0xc5, + 0x00, 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &PyFunction_Type+0x0 + // 18: OPERAND0 + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x18, instruction->operand0); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_PEP_523( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PEP_523.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 46 10 movq 0x10(%r14), %rax + // 4: 48 83 b8 18 21 00 00 00 cmpq $0x0, 0x2118(%rax) + // c: 74 06 je 0x14 <_JIT_ENTRY+0x14> + // e: ff 25 00 00 00 00 jmpq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 14: ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[20] = { + 0x49, 0x8b, 0x46, 0x10, 0x48, 0x83, 0xb8, 0x18, + 0x21, 0x00, 0x00, 0x00, 0x74, 0x06, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); +} + +void +emit__CHECK_PERIODIC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 46 18 movq 0x18(%r14), %rax + // 5: 84 c0 testb %al, %al + // 7: 74 27 je 0x30 <_JIT_ENTRY+0x30> + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 4c 89 f7 movq %r14, %rdi + // 11: ff 15 00 00 00 00 callq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _Py_HandlePending-0x4 + // 17: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 25: 85 c0 testl %eax, %eax + // 27: 74 07 je 0x30 <_JIT_ENTRY+0x30> + // 29: 58 popq %rax + // 2a: ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 30: 58 popq %rax + // 31: ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[49] = { + 0x50, 0x49, 0x8b, 0x46, 0x18, 0x84, 0xc0, 0x74, + 0x27, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x58, + }; + // 0: &_Py_HandlePending+0x0 + // 8: ERROR_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_HandlePending); + patch_64(data + 0x8, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC_IF_NOT_YIELD_FROM.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: a8 02 testb $0x2, %al + // a: 75 2f jne 0x3b <_JIT_ENTRY+0x3b> + // c: 49 8b 46 18 movq 0x18(%r14), %rax + // 10: 84 c0 testb %al, %al + // 12: 74 27 je 0x3b <_JIT_ENTRY+0x3b> + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 4c 89 f7 movq %r14, %rdi + // 1c: ff 15 00 00 00 00 callq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _Py_HandlePending-0x4 + // 22: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 27: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 30: 85 c0 testl %eax, %eax + // 32: 74 07 je 0x3b <_JIT_ENTRY+0x3b> + // 34: 58 popq %rax + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 3b: 58 popq %rax + // 3c: ff 25 00 00 00 00 jmpq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[60] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xa8, 0x02, 0x75, 0x2f, 0x49, 0x8b, 0x46, 0x18, + 0x84, 0xc0, 0x74, 0x27, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPARG + // 8: &_Py_HandlePending+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_HandlePending); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_STACK_SPACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // 7: 48 85 c0 testq %rax, %rax + // a: 74 38 je 0x44 <_JIT_ENTRY+0x44> + // c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 13: 48 c7 c2 fe ff ff ff movq $-0x2, %rdx + // 1a: 48 29 ca subq %rcx, %rdx + // 1d: 49 8b 4c d5 00 movq (%r13,%rdx,8), %rcx + // 22: 48 8b 49 30 movq 0x30(%rcx), %rcx + // 26: 48 63 49 4c movslq 0x4c(%rcx), %rcx + // 2a: 49 8b 96 f8 00 00 00 movq 0xf8(%r14), %rdx + // 31: 48 29 c2 subq %rax, %rdx + // 34: 48 c1 fa 03 sarq $0x3, %rdx + // 38: 48 39 ca cmpq %rcx, %rdx + // 3b: 7e 07 jle 0x44 <_JIT_ENTRY+0x44> + // 3d: 41 83 7e 2c 01 cmpl $0x1, 0x2c(%r14) + // 42: 7f 06 jg 0x4a <_JIT_ENTRY+0x4a> + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 4a: ff 25 00 00 00 00 jmpq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[74] = { + 0x49, 0x8b, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x38, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc2, 0xfe, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xca, 0x49, 0x8b, 0x4c, + 0xd5, 0x00, 0x48, 0x8b, 0x49, 0x30, 0x48, 0x63, + 0x49, 0x4c, 0x49, 0x8b, 0x96, 0xf8, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xc2, 0x48, 0xc1, 0xfa, 0x03, + 0x48, 0x39, 0xca, 0x7e, 0x07, 0x41, 0x83, 0x7e, + 0x2c, 0x01, 0x7f, 0x06, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_STACK_SPACE_OPERAND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE_OPERAND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 86 f0 00 00 00 movq 0xf0(%r14), %rax + // 7: 48 85 c0 testq %rax, %rax + // a: 74 21 je 0x2d <_JIT_ENTRY+0x2d> + // c: 48 63 0d 00 00 00 00 movslq (%rip), %rcx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 13: 49 8b 96 f8 00 00 00 movq 0xf8(%r14), %rdx + // 1a: 48 29 c2 subq %rax, %rdx + // 1d: 48 c1 fa 03 sarq $0x3, %rdx + // 21: 48 39 ca cmpq %rcx, %rdx + // 24: 7e 07 jle 0x2d <_JIT_ENTRY+0x2d> + // 26: 41 83 7e 2c 01 cmpl $0x1, 0x2c(%r14) + // 2b: 7f 06 jg 0x33 <_JIT_ENTRY+0x33> + // 2d: ff 25 00 00 00 00 jmpq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 33: ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[51] = { + 0x49, 0x8b, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x21, 0x48, 0x63, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x96, 0xf8, 0x00, + 0x00, 0x00, 0x48, 0x29, 0xc2, 0x48, 0xc1, 0xfa, + 0x03, 0x48, 0x39, 0xca, 0x7e, 0x07, 0x41, 0x83, + 0x7e, 0x2c, 0x01, 0x7f, 0x06, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_VALIDITY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 7: f6 40 22 01 testb $0x1, 0x22(%rax) + // b: 75 06 jne 0x13 <_JIT_ENTRY+0x13> + // d: ff 25 00 00 00 00 jmpq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[19] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf6, + 0x40, 0x22, 0x01, 0x75, 0x06, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: EXECUTOR + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_VALIDITY_AND_SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY_AND_SET_IP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 7: f6 40 22 01 testb $0x1, 0x22(%rax) + // b: 75 06 jne 0x13 <_JIT_ENTRY+0x13> + // d: ff 25 00 00 00 00 jmpq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 13: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 1a: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 1f: ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[31] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf6, + 0x40, 0x22, 0x01, 0x75, 0x06, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x44, 0x24, 0x38, + }; + // 0: EXECUTOR + // 8: JUMP_TARGET + // 10: OPERAND0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0xc); +} + +void +emit__COMPARE_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // a: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 11: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 15: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 19: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1e: 89 da movl %ebx, %edx + // 20: c1 ea 05 shrl $0x5, %edx + // 23: 48 89 ef movq %rbp, %rdi + // 26: 4c 89 fe movq %r15, %rsi + // 29: ff 15 00 00 00 00 callq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX PyObject_RichCompare-0x4 + // 2f: 49 89 c6 movq %rax, %r14 + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 8b 45 00 movl (%rbp), %eax + // 43: 85 c0 testl %eax, %eax + // 45: 78 10 js 0x57 <_JIT_ENTRY+0x57> + // 47: ff c8 decl %eax + // 49: 89 45 00 movl %eax, (%rbp) + // 4c: 75 09 jne 0x57 <_JIT_ENTRY+0x57> + // 4e: 48 89 ef movq %rbp, %rdi + // 51: ff 15 00 00 00 00 callq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 57: 41 8b 07 movl (%r15), %eax + // 5a: 85 c0 testl %eax, %eax + // 5c: 78 07 js 0x65 <_JIT_ENTRY+0x65> + // 5e: ff c8 decl %eax + // 60: 41 89 07 movl %eax, (%r15) + // 63: 74 4b je 0xb0 <_JIT_ENTRY+0xb0> + // 65: 49 83 c5 f0 addq $-0x10, %r13 + // 69: 4d 85 f6 testq %r14, %r14 + // 6c: 0f 84 90 00 00 00 je 0x102 <_JIT_ENTRY+0x102> + // 72: f6 c3 10 testb $0x10, %bl + // 75: 74 54 je 0xcb <_JIT_ENTRY+0xcb> + // 77: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7c: 4c 89 f7 movq %r14, %rdi + // 7f: ff 15 00 00 00 00 callq *(%rip) # 0x85 <_JIT_ENTRY+0x85> + // 0000000000000081: R_X86_64_GOTPCRELX PyObject_IsTrue-0x4 + // 85: 41 8b 0e movl (%r14), %ecx + // 88: 85 c9 testl %ecx, %ecx + // 8a: 78 07 js 0x93 <_JIT_ENTRY+0x93> + // 8c: ff c9 decl %ecx + // 8e: 41 89 0e movl %ecx, (%r14) + // 91: 74 50 je 0xe3 <_JIT_ENTRY+0xe3> + // 93: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 98: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a1: 85 c0 testl %eax, %eax + // a3: 78 5d js 0x102 <_JIT_ENTRY+0x102> + // a5: 75 1d jne 0xc4 <_JIT_ENTRY+0xc4> + // a7: 4c 8b 35 00 00 00 00 movq (%rip), %r14 # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // ae: eb 1b jmp 0xcb <_JIT_ENTRY+0xcb> + // b0: 4c 89 ff movq %r15, %rdi + // b3: ff 15 00 00 00 00 callq *(%rip) # 0xb9 <_JIT_ENTRY+0xb9> + // 00000000000000b5: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b9: 49 83 c5 f0 addq $-0x10, %r13 + // bd: 4d 85 f6 testq %r14, %r14 + // c0: 75 b0 jne 0x72 <_JIT_ENTRY+0x72> + // c2: eb 3e jmp 0x102 <_JIT_ENTRY+0x102> + // c4: 4c 8b 35 00 00 00 00 movq (%rip), %r14 # 0xcb <_JIT_ENTRY+0xcb> + // 00000000000000c7: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // cb: 4d 89 75 00 movq %r14, (%r13) + // cf: 49 83 c5 08 addq $0x8, %r13 + // d3: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // d8: 48 83 c4 10 addq $0x10, %rsp + // dc: 5d popq %rbp + // dd: ff 25 00 00 00 00 jmpq *(%rip) # 0xe3 <_JIT_ENTRY+0xe3> + // 00000000000000df: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // e3: 4c 89 f7 movq %r14, %rdi + // e6: 89 c3 movl %eax, %ebx + // e8: ff 15 00 00 00 00 callq *(%rip) # 0xee <_JIT_ENTRY+0xee> + // 00000000000000ea: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // ee: 89 d8 movl %ebx, %eax + // f0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fe: 85 c0 testl %eax, %eax + // 100: 79 a3 jns 0xa5 <_JIT_ENTRY+0xa5> + // 102: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 107: 48 83 c4 10 addq $0x10, %rsp + // 10b: 5d popq %rbp + // 10c: ff 25 00 00 00 00 jmpq *(%rip) # 0x112 <_JIT_ENTRY+0x112> + // 000000000000010e: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[274] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4c, 0x89, 0x74, + 0x24, 0x08, 0x0f, 0xb7, 0x1d, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x8b, 0x7d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x89, 0xda, + 0xc1, 0xea, 0x05, 0x48, 0x89, 0xef, 0x4c, 0x89, + 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, + 0xc8, 0x89, 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, + 0xef, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x07, 0xff, 0xc8, + 0x41, 0x89, 0x07, 0x74, 0x4b, 0x49, 0x83, 0xc5, + 0xf0, 0x4d, 0x85, 0xf6, 0x0f, 0x84, 0x90, 0x00, + 0x00, 0x00, 0xf6, 0xc3, 0x10, 0x74, 0x54, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x0e, + 0x85, 0xc9, 0x78, 0x07, 0xff, 0xc9, 0x41, 0x89, + 0x0e, 0x74, 0x50, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x78, 0x5d, 0x75, 0x1d, 0x4c, + 0x8b, 0x35, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x1b, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x4d, 0x85, 0xf6, + 0x75, 0xb0, 0xeb, 0x3e, 0x4c, 0x8b, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x75, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x4c, 0x8b, 0x74, 0x24, 0x08, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x79, 0xa3, 0x4c, 0x8b, 0x74, 0x24, 0x08, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_RichCompare+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &PyObject_IsTrue+0x0 + // 20: &_Py_FalseStruct+0x0 + // 28: &_Py_TrueStruct+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + const unsigned char data_body[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_RichCompare); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb5, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc7, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xdf, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xea, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x10e, (uintptr_t)data + 0x34); +} + +void +emit__COMPARE_OP_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 18 subq $0x18, %rsp + // 4: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: f2 41 0f 10 47 10 movsd 0x10(%r15), %xmm0 + // 12: f2 0f 10 4b 10 movsd 0x10(%rbx), %xmm1 + // 17: 41 8b 07 movl (%r15), %eax + // 1a: 85 c0 testl %eax, %eax + // 1c: 78 4c js 0x6a <_JIT_ENTRY+0x6a> + // 1e: ff c8 decl %eax + // 20: 41 89 07 movl %eax, (%r15) + // 23: 75 45 jne 0x6a <_JIT_ENTRY+0x6a> + // 25: f2 0f 11 4c 24 08 movsd %xmm1, 0x8(%rsp) + // 2b: f2 0f 11 44 24 10 movsd %xmm0, 0x10(%rsp) + // 31: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 38: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 3f: 48 85 c0 testq %rax, %rax + // 42: 74 11 je 0x55 <_JIT_ENTRY+0x55> + // 44: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 4b: 4c 89 ff movq %r15, %rdi + // 4e: be 01 00 00 00 movl $0x1, %esi + // 53: ff d0 callq *%rax + // 55: 4c 89 ff movq %r15, %rdi + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _PyFloat_ExactDealloc-0x4 + // 5e: f2 0f 10 44 24 10 movsd 0x10(%rsp), %xmm0 + // 64: f2 0f 10 4c 24 08 movsd 0x8(%rsp), %xmm1 + // 6a: 8b 03 movl (%rbx), %eax + // 6c: 85 c0 testl %eax, %eax + // 6e: 78 4b js 0xbb <_JIT_ENTRY+0xbb> + // 70: ff c8 decl %eax + // 72: 89 03 movl %eax, (%rbx) + // 74: 75 45 jne 0xbb <_JIT_ENTRY+0xbb> + // 76: f2 0f 11 4c 24 08 movsd %xmm1, 0x8(%rsp) + // 7c: f2 0f 11 44 24 10 movsd %xmm0, 0x10(%rsp) + // 82: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x89 <_JIT_ENTRY+0x89> + // 0000000000000085: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 89: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 90: 48 85 c0 testq %rax, %rax + // 93: 74 11 je 0xa6 <_JIT_ENTRY+0xa6> + // 95: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 9c: 48 89 df movq %rbx, %rdi + // 9f: be 01 00 00 00 movl $0x1, %esi + // a4: ff d0 callq *%rax + // a6: 48 89 df movq %rbx, %rdi + // a9: ff 15 00 00 00 00 callq *(%rip) # 0xaf <_JIT_ENTRY+0xaf> + // 00000000000000ab: R_X86_64_GOTPCRELX _PyFloat_ExactDealloc-0x4 + // af: f2 0f 10 44 24 10 movsd 0x10(%rsp), %xmm0 + // b5: f2 0f 10 4c 24 08 movsd 0x8(%rsp), %xmm1 + // bb: 49 8d 45 f8 leaq -0x8(%r13), %rax + // bf: 31 c9 xorl %ecx, %ecx + // c1: 66 0f 2e c1 ucomisd %xmm1, %xmm0 + // c5: 0f 93 c1 setae %cl + // c8: 01 c9 addl %ecx, %ecx + // ca: 31 d2 xorl %edx, %edx + // cc: 66 0f 2e c8 ucomisd %xmm0, %xmm1 + // d0: 0f 93 c2 setae %dl + // d3: 09 ca orl %ecx, %edx + // d5: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0xdb <_JIT_ENTRY+0xdb> + // 00000000000000d7: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // db: 0f a3 d1 btl %edx, %ecx + // de: 72 18 jb 0xf8 <_JIT_ENTRY+0xf8> + // e0: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xe7 <_JIT_ENTRY+0xe7> + // 00000000000000e3: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // e7: 49 89 4d f0 movq %rcx, -0x10(%r13) + // eb: 49 89 c5 movq %rax, %r13 + // ee: 48 83 c4 18 addq $0x18, %rsp + // f2: ff 25 00 00 00 00 jmpq *(%rip) # 0xf8 <_JIT_ENTRY+0xf8> + // 00000000000000f4: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // f8: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xff <_JIT_ENTRY+0xff> + // 00000000000000fb: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // ff: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 103: 49 89 c5 movq %rax, %r13 + // 106: 48 83 c4 18 addq $0x18, %rsp + // 10a: ff 25 00 00 00 00 jmpq *(%rip) # 0x110 <_JIT_ENTRY+0x110> + // 000000000000010c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[266] = { + 0x48, 0x83, 0xec, 0x18, 0x4d, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0xf2, 0x41, 0x0f, 0x10, + 0x47, 0x10, 0xf2, 0x0f, 0x10, 0x4b, 0x10, 0x41, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x4c, 0xff, 0xc8, + 0x41, 0x89, 0x07, 0x75, 0x45, 0xf2, 0x0f, 0x11, + 0x4c, 0x24, 0x08, 0xf2, 0x0f, 0x11, 0x44, 0x24, + 0x10, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, + 0x28, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x0f, + 0x10, 0x44, 0x24, 0x10, 0xf2, 0x0f, 0x10, 0x4c, + 0x24, 0x08, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x4b, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x45, 0xf2, 0x0f, + 0x11, 0x4c, 0x24, 0x08, 0xf2, 0x0f, 0x11, 0x44, + 0x24, 0x10, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, + 0x98, 0x28, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0xf2, + 0x0f, 0x10, 0x44, 0x24, 0x10, 0xf2, 0x0f, 0x10, + 0x4c, 0x24, 0x08, 0x49, 0x8d, 0x45, 0xf8, 0x31, + 0xc9, 0x66, 0x0f, 0x2e, 0xc1, 0x0f, 0x93, 0xc1, + 0x01, 0xc9, 0x31, 0xd2, 0x66, 0x0f, 0x2e, 0xc8, + 0x0f, 0x93, 0xc2, 0x09, 0xca, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xa3, 0xd1, 0x72, 0x18, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, + 0xc4, 0x18, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, + 0xc4, 0x18, + }; + // 0: &_PyRuntime+0x0 + // 8: &_PyFloat_ExactDealloc+0x0 + // 10: OPARG + // 18: &_Py_FalseStruct+0x0 + // 20: CONTINUE + // 28: &_Py_TrueStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&_PyFloat_ExactDealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x85, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xe3, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xf4, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)data + 0x24); +} + +void +emit__COMPARE_OP_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 9: 49 8b 6f 10 movq 0x10(%r15), %rbp + // d: 48 83 fd 10 cmpq $0x10, %rbp + // 11: 73 0e jae 0x21 <_JIT_ENTRY+0x21> + // 13: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 17: 48 8b 73 10 movq 0x10(%rbx), %rsi + // 1b: 48 83 fe 10 cmpq $0x10, %rsi + // 1f: 72 0b jb 0x2c <_JIT_ENTRY+0x2c> + // 21: 48 83 c4 20 addq $0x20, %rsp + // 25: 5d popq %rbp + // 26: ff 25 00 00 00 00 jmpq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 2c: 41 8b 07 movl (%r15), %eax + // 2f: 45 8b 47 18 movl 0x18(%r15), %r8d + // 33: 8b 7b 18 movl 0x18(%rbx), %edi + // 36: 85 c0 testl %eax, %eax + // 38: 78 52 js 0x8c <_JIT_ENTRY+0x8c> + // 3a: ff c8 decl %eax + // 3c: 41 89 07 movl %eax, (%r15) + // 3f: 75 4b jne 0x8c <_JIT_ENTRY+0x8c> + // 41: 4c 89 44 24 08 movq %r8, 0x8(%rsp) + // 46: 48 89 7c 24 10 movq %rdi, 0x10(%rsp) + // 4b: 48 89 74 24 18 movq %rsi, 0x18(%rsp) + // 50: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 57: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 5e: 48 85 c0 testq %rax, %rax + // 61: 74 11 je 0x74 <_JIT_ENTRY+0x74> + // 63: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 6a: 4c 89 ff movq %r15, %rdi + // 6d: be 01 00 00 00 movl $0x1, %esi + // 72: ff d0 callq *%rax + // 74: 4c 89 ff movq %r15, %rdi + // 77: ff 15 00 00 00 00 callq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 7d: 48 8b 74 24 18 movq 0x18(%rsp), %rsi + // 82: 48 8b 7c 24 10 movq 0x10(%rsp), %rdi + // 87: 4c 8b 44 24 08 movq 0x8(%rsp), %r8 + // 8c: 8b 03 movl (%rbx), %eax + // 8e: 85 c0 testl %eax, %eax + // 90: 78 4d js 0xdf <_JIT_ENTRY+0xdf> + // 92: ff c8 decl %eax + // 94: 89 03 movl %eax, (%rbx) + // 96: 75 47 jne 0xdf <_JIT_ENTRY+0xdf> + // 98: 4c 89 44 24 08 movq %r8, 0x8(%rsp) + // 9d: 48 89 7c 24 10 movq %rdi, 0x10(%rsp) + // a2: 49 89 f7 movq %rsi, %r15 + // a5: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xac <_JIT_ENTRY+0xac> + // 00000000000000a8: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // ac: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // b3: 48 85 c0 testq %rax, %rax + // b6: 74 11 je 0xc9 <_JIT_ENTRY+0xc9> + // b8: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // bf: 48 89 df movq %rbx, %rdi + // c2: be 01 00 00 00 movl $0x1, %esi + // c7: ff d0 callq *%rax + // c9: 48 89 df movq %rbx, %rdi + // cc: ff 15 00 00 00 00 callq *(%rip) # 0xd2 <_JIT_ENTRY+0xd2> + // 00000000000000ce: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // d2: 4c 89 fe movq %r15, %rsi + // d5: 48 8b 7c 24 10 movq 0x10(%rsp), %rdi + // da: 4c 8b 44 24 08 movq 0x8(%rsp), %r8 + // df: 49 8d 45 f8 leaq -0x8(%r13), %rax + // e3: 83 e5 03 andl $0x3, %ebp + // e6: b9 01 00 00 00 movl $0x1, %ecx + // eb: ba 01 00 00 00 movl $0x1, %edx + // f0: 48 29 ea subq %rbp, %rdx + // f3: 49 0f af d0 imulq %r8, %rdx + // f7: 83 e6 03 andl $0x3, %esi + // fa: 48 29 f1 subq %rsi, %rcx + // fd: 48 0f af cf imulq %rdi, %rcx + // 101: 31 f6 xorl %esi, %esi + // 103: 31 ff xorl %edi, %edi + // 105: 48 39 ca cmpq %rcx, %rdx + // 108: 40 0f 9d c6 setge %sil + // 10c: 40 0f 9e c7 setle %dil + // 110: 01 f6 addl %esi, %esi + // 112: 09 f7 orl %esi, %edi + // 114: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x11a <_JIT_ENTRY+0x11a> + // 0000000000000116: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 11a: 0f a3 f9 btl %edi, %ecx + // 11d: 72 09 jb 0x128 <_JIT_ENTRY+0x128> + // 11f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x126 <_JIT_ENTRY+0x126> + // 0000000000000122: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 126: eb 07 jmp 0x12f <_JIT_ENTRY+0x12f> + // 128: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x12f <_JIT_ENTRY+0x12f> + // 000000000000012b: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 12f: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 133: 49 89 c5 movq %rax, %r13 + // 136: 48 83 c4 20 addq $0x20, %rsp + // 13a: 5d popq %rbp + // 13b: ff 25 00 00 00 00 jmpq *(%rip) # 0x141 <_JIT_ENTRY+0x141> + // 000000000000013d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[315] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x4d, 0x8b, 0x7d, + 0xf0, 0x49, 0x8b, 0x6f, 0x10, 0x48, 0x83, 0xfd, + 0x10, 0x73, 0x0e, 0x49, 0x8b, 0x5d, 0xf8, 0x48, + 0x8b, 0x73, 0x10, 0x48, 0x83, 0xfe, 0x10, 0x72, + 0x0b, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x45, + 0x8b, 0x47, 0x18, 0x8b, 0x7b, 0x18, 0x85, 0xc0, + 0x78, 0x52, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, + 0x4b, 0x4c, 0x89, 0x44, 0x24, 0x08, 0x48, 0x89, + 0x7c, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x74, + 0x24, 0x18, 0x48, 0x8b, 0x7c, 0x24, 0x10, 0x4c, + 0x8b, 0x44, 0x24, 0x08, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x4d, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x47, + 0x4c, 0x89, 0x44, 0x24, 0x08, 0x48, 0x89, 0x7c, + 0x24, 0x10, 0x49, 0x89, 0xf7, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x90, + 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, + 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0xbe, 0x01, 0x00, 0x00, 0x00, 0xff, + 0xd0, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xfe, 0x48, 0x8b, 0x7c, + 0x24, 0x10, 0x4c, 0x8b, 0x44, 0x24, 0x08, 0x49, + 0x8d, 0x45, 0xf8, 0x83, 0xe5, 0x03, 0xb9, 0x01, + 0x00, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0x00, + 0x48, 0x29, 0xea, 0x49, 0x0f, 0xaf, 0xd0, 0x83, + 0xe6, 0x03, 0x48, 0x29, 0xf1, 0x48, 0x0f, 0xaf, + 0xcf, 0x31, 0xf6, 0x31, 0xff, 0x48, 0x39, 0xca, + 0x40, 0x0f, 0x9d, 0xc6, 0x40, 0x0f, 0x9e, 0xc7, + 0x01, 0xf6, 0x09, 0xf7, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xa3, 0xf9, 0x72, 0x09, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x07, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, + 0xc4, 0x20, 0x5d, + }; + // 0: JUMP_TARGET + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: OPARG + // 20: &_Py_FalseStruct+0x0 + // 28: &_Py_TrueStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa8, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xce, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x116, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x122, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x12b, (uintptr_t)data + 0x24); +} + +void +emit__COMPARE_OP_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_STR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 9: 48 89 ef movq %rbp, %rdi + // c: 4c 89 fe movq %r15, %rsi + // f: ff 15 00 00 00 00 callq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX _PyUnicode_Equal-0x4 + // 15: 89 c3 movl %eax, %ebx + // 17: 8b 45 00 movl (%rbp), %eax + // 1a: 85 c0 testl %eax, %eax + // 1c: 78 34 js 0x52 <_JIT_ENTRY+0x52> + // 1e: ff c8 decl %eax + // 20: 89 45 00 movl %eax, (%rbp) + // 23: 75 2d jne 0x52 <_JIT_ENTRY+0x52> + // 25: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 2c: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 33: 48 85 c0 testq %rax, %rax + // 36: 74 11 je 0x49 <_JIT_ENTRY+0x49> + // 38: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 3f: 48 89 ef movq %rbp, %rdi + // 42: be 01 00 00 00 movl $0x1, %esi + // 47: ff d0 callq *%rax + // 49: 48 89 ef movq %rbp, %rdi + // 4c: ff 15 00 00 00 00 callq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _PyUnicode_ExactDealloc-0x4 + // 52: 41 8b 07 movl (%r15), %eax + // 55: 85 c0 testl %eax, %eax + // 57: 78 34 js 0x8d <_JIT_ENTRY+0x8d> + // 59: ff c8 decl %eax + // 5b: 41 89 07 movl %eax, (%r15) + // 5e: 75 2d jne 0x8d <_JIT_ENTRY+0x8d> + // 60: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 67: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 6e: 48 85 c0 testq %rax, %rax + // 71: 74 11 je 0x84 <_JIT_ENTRY+0x84> + // 73: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 7a: 4c 89 ff movq %r15, %rdi + // 7d: be 01 00 00 00 movl $0x1, %esi + // 82: ff d0 callq *%rax + // 84: 4c 89 ff movq %r15, %rdi + // 87: ff 15 00 00 00 00 callq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: R_X86_64_GOTPCRELX _PyUnicode_ExactDealloc-0x4 + // 8d: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 91: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x98 <_JIT_ENTRY+0x98> + // 0000000000000094: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 98: 83 c3 07 addl $0x7, %ebx + // 9b: 66 85 d9 testw %bx, %cx + // 9e: 75 15 jne 0xb5 <_JIT_ENTRY+0xb5> + // a0: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // a7: 49 89 4d f0 movq %rcx, -0x10(%r13) + // ab: 49 89 c5 movq %rax, %r13 + // ae: 5d popq %rbp + // af: ff 25 00 00 00 00 jmpq *(%rip) # 0xb5 <_JIT_ENTRY+0xb5> + // 00000000000000b1: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // b5: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000b8: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // bc: 49 89 4d f0 movq %rcx, -0x10(%r13) + // c0: 49 89 c5 movq %rax, %r13 + // c3: 5d popq %rbp + // c4: ff 25 00 00 00 00 jmpq *(%rip) # 0xca <_JIT_ENTRY+0xca> + // 00000000000000c6: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[196] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x8b, 0x7d, + 0xf8, 0x48, 0x89, 0xef, 0x4c, 0x89, 0xfe, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xc3, 0x8b, + 0x45, 0x00, 0x85, 0xc0, 0x78, 0x34, 0xff, 0xc8, + 0x89, 0x45, 0x00, 0x75, 0x2d, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x90, + 0x28, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, + 0x48, 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, 0x48, + 0x89, 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, 0xff, + 0xd0, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x34, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x2d, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x81, 0x90, 0x28, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x11, 0x48, 0x8b, 0x91, 0x98, 0x28, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xd0, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf8, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc3, 0x07, 0x66, 0x85, 0xd9, 0x75, 0x15, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, 0x5d, + }; + // 0: &_PyUnicode_Equal+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + // 18: OPARG + // 20: &_Py_FalseStruct+0x0 + // 28: CONTINUE + // 30: &_Py_TrueStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyUnicode_Equal); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x94, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb1, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)data + 0x2c); +} + +void +emit__CONTAINS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 4c 89 ff movq %r15, %rdi + // 11: 48 89 ee movq %rbp, %rsi + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX PySequence_Contains-0x4 + // 1a: 89 c3 movl %eax, %ebx + // 1c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 21: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2a: 8b 45 00 movl (%rbp), %eax + // 2d: 85 c0 testl %eax, %eax + // 2f: 78 10 js 0x41 <_JIT_ENTRY+0x41> + // 31: ff c8 decl %eax + // 33: 89 45 00 movl %eax, (%rbp) + // 36: 75 09 jne 0x41 <_JIT_ENTRY+0x41> + // 38: 48 89 ef movq %rbp, %rdi + // 3b: ff 15 00 00 00 00 callq *(%rip) # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 41: 41 8b 07 movl (%r15), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 07 js 0x4f <_JIT_ENTRY+0x4f> + // 48: ff c8 decl %eax + // 4a: 41 89 07 movl %eax, (%r15) + // 4d: 74 3b je 0x8a <_JIT_ENTRY+0x8a> + // 4f: 85 db testl %ebx, %ebx + // 51: 78 44 js 0x97 <_JIT_ENTRY+0x97> + // 53: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 5a: 39 c3 cmpl %eax, %ebx + // 5c: 75 16 jne 0x74 <_JIT_ENTRY+0x74> + // 5e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 65: 49 89 45 f0 movq %rax, -0x10(%r13) + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 5d popq %rbp + // 6e: ff 25 00 00 00 00 jmpq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 74: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 7b: 49 89 45 f0 movq %rax, -0x10(%r13) + // 7f: 49 83 c5 f8 addq $-0x8, %r13 + // 83: 5d popq %rbp + // 84: ff 25 00 00 00 00 jmpq *(%rip) # 0x8a <_JIT_ENTRY+0x8a> + // 0000000000000086: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 8a: 4c 89 ff movq %r15, %rdi + // 8d: ff 15 00 00 00 00 callq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 93: 85 db testl %ebx, %ebx + // 95: 79 bc jns 0x53 <_JIT_ENTRY+0x53> + // 97: 49 83 c5 f0 addq $-0x10, %r13 + // 9b: 5d popq %rbp + // 9c: ff 25 00 00 00 00 jmpq *(%rip) # 0xa2 <_JIT_ENTRY+0xa2> + // 000000000000009e: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[162] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x8b, 0x7d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xff, 0x48, 0x89, 0xee, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xc3, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x89, 0x45, 0x00, 0x75, 0x09, + 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x07, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, 0x3b, 0x85, + 0xdb, 0x78, 0x44, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x39, 0xc3, 0x75, 0x16, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, 0x49, + 0x83, 0xc5, 0xf8, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xdb, 0x79, 0xbc, 0x49, + 0x83, 0xc5, 0xf0, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &PySequence_Contains+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: OPARG + // 18: &_Py_FalseStruct+0x0 + // 20: CONTINUE + // 28: &_Py_TrueStruct+0x0 + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySequence_Contains); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0x4); + patch_32r(code + 0x56, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x86, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x9e, (uintptr_t)data + 0x2c); +} + +void +emit__CONTAINS_OP_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 48 8b 43 08 movq 0x8(%rbx), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 10: 74 07 je 0x19 <_JIT_ENTRY+0x19> + // 12: 5d popq %rbp + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 19: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 89 df movq %rbx, %rdi + // 25: 48 89 ee movq %rbp, %rsi + // 28: ff 15 00 00 00 00 callq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX PyDict_Contains-0x4 + // 2e: 41 89 c7 movl %eax, %r15d + // 31: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 36: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3f: 8b 45 00 movl (%rbp), %eax + // 42: 85 c0 testl %eax, %eax + // 44: 78 10 js 0x56 <_JIT_ENTRY+0x56> + // 46: ff c8 decl %eax + // 48: 89 45 00 movl %eax, (%rbp) + // 4b: 75 09 jne 0x56 <_JIT_ENTRY+0x56> + // 4d: 48 89 ef movq %rbp, %rdi + // 50: ff 15 00 00 00 00 callq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 56: 8b 03 movl (%rbx), %eax + // 58: 85 c0 testl %eax, %eax + // 5a: 78 06 js 0x62 <_JIT_ENTRY+0x62> + // 5c: ff c8 decl %eax + // 5e: 89 03 movl %eax, (%rbx) + // 60: 74 3d je 0x9f <_JIT_ENTRY+0x9f> + // 62: 45 85 ff testl %r15d, %r15d + // 65: 78 46 js 0xad <_JIT_ENTRY+0xad> + // 67: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 6e: 41 39 c7 cmpl %eax, %r15d + // 71: 75 16 jne 0x89 <_JIT_ENTRY+0x89> + // 73: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 7a: 49 89 45 f0 movq %rax, -0x10(%r13) + // 7e: 49 83 c5 f8 addq $-0x8, %r13 + // 82: 5d popq %rbp + // 83: ff 25 00 00 00 00 jmpq *(%rip) # 0x89 <_JIT_ENTRY+0x89> + // 0000000000000085: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 89: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x90 <_JIT_ENTRY+0x90> + // 000000000000008c: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 90: 49 89 45 f0 movq %rax, -0x10(%r13) + // 94: 49 83 c5 f8 addq $-0x8, %r13 + // 98: 5d popq %rbp + // 99: ff 25 00 00 00 00 jmpq *(%rip) # 0x9f <_JIT_ENTRY+0x9f> + // 000000000000009b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 9f: 48 89 df movq %rbx, %rdi + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a8: 45 85 ff testl %r15d, %r15d + // ab: 79 ba jns 0x67 <_JIT_ENTRY+0x67> + // ad: 49 83 c5 f0 addq $-0x10, %r13 + // b1: 5d popq %rbp + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[184] = { + 0x55, 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xee, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, + 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x45, 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x89, 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, + 0x74, 0x3d, 0x45, 0x85, 0xff, 0x78, 0x46, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x41, 0x39, + 0xc7, 0x75, 0x16, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, 0xc5, 0xf8, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x85, 0xff, 0x79, 0xba, 0x49, 0x83, 0xc5, + 0xf0, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: JUMP_TARGET + // 10: &PyDict_Contains+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: OPARG + // 28: &_Py_FalseStruct+0x0 + // 30: CONTINUE + // 38: &_Py_TrueStruct+0x0 + // 40: ERROR_TARGET + const unsigned char data_body[72] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyDict_Contains); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x40, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0x14); + patch_32r(code + 0x6a, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x85, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x3c); +} + +void +emit__CONTAINS_OP_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_SET.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 48 8b 43 08 movq 0x8(%rbx), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PySet_Type-0x4 + // 10: 0f 94 c1 sete %cl + // 13: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_REX_GOTPCRELX PyFrozenSet_Type-0x4 + // 1a: 0f 94 c0 sete %al + // 1d: 08 c8 orb %cl, %al + // 1f: 74 70 je 0x91 <_JIT_ENTRY+0x91> + // 21: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 25: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2a: 48 89 df movq %rbx, %rdi + // 2d: 48 89 ee movq %rbp, %rsi + // 30: ff 15 00 00 00 00 callq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _PySet_Contains-0x4 + // 36: 41 89 c7 movl %eax, %r15d + // 39: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 47: 8b 45 00 movl (%rbp), %eax + // 4a: 85 c0 testl %eax, %eax + // 4c: 78 10 js 0x5e <_JIT_ENTRY+0x5e> + // 4e: ff c8 decl %eax + // 50: 89 45 00 movl %eax, (%rbp) + // 53: 75 09 jne 0x5e <_JIT_ENTRY+0x5e> + // 55: 48 89 ef movq %rbp, %rdi + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5e: 8b 03 movl (%rbx), %eax + // 60: 85 c0 testl %eax, %eax + // 62: 78 06 js 0x6a <_JIT_ENTRY+0x6a> + // 64: ff c8 decl %eax + // 66: 89 03 movl %eax, (%rbx) + // 68: 74 44 je 0xae <_JIT_ENTRY+0xae> + // 6a: 45 85 ff testl %r15d, %r15d + // 6d: 78 4d js 0xbc <_JIT_ENTRY+0xbc> + // 6f: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 76: 41 39 c7 cmpl %eax, %r15d + // 79: 75 1d jne 0x98 <_JIT_ENTRY+0x98> + // 7b: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 82: 49 89 45 f0 movq %rax, -0x10(%r13) + // 86: 49 83 c5 f8 addq $-0x8, %r13 + // 8a: 5d popq %rbp + // 8b: ff 25 00 00 00 00 jmpq *(%rip) # 0x91 <_JIT_ENTRY+0x91> + // 000000000000008d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 91: 5d popq %rbp + // 92: ff 25 00 00 00 00 jmpq *(%rip) # 0x98 <_JIT_ENTRY+0x98> + // 0000000000000094: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 98: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x9f <_JIT_ENTRY+0x9f> + // 000000000000009b: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 9f: 49 89 45 f0 movq %rax, -0x10(%r13) + // a3: 49 83 c5 f8 addq $-0x8, %r13 + // a7: 5d popq %rbp + // a8: ff 25 00 00 00 00 jmpq *(%rip) # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // ae: 48 89 df movq %rbx, %rdi + // b1: ff 15 00 00 00 00 callq *(%rip) # 0xb7 <_JIT_ENTRY+0xb7> + // 00000000000000b3: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b7: 45 85 ff testl %r15d, %r15d + // ba: 79 b3 jns 0x6f <_JIT_ENTRY+0x6f> + // bc: 49 83 c5 f0 addq $-0x10, %r13 + // c0: 5d popq %rbp + // c1: ff 25 00 00 00 00 jmpq *(%rip) # 0xc7 <_JIT_ENTRY+0xc7> + // 00000000000000c3: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[199] = { + 0x55, 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x94, 0xc1, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x94, 0xc0, 0x08, 0xc8, 0x74, + 0x70, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xee, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, + 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x45, 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x89, 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, + 0x74, 0x44, 0x45, 0x85, 0xff, 0x78, 0x4d, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x41, 0x39, + 0xc7, 0x75, 0x1d, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x85, 0xff, 0x79, 0xb3, 0x49, 0x83, 0xc5, 0xf0, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySet_Type+0x0 + // 8: &PyFrozenSet_Type+0x0 + // 10: &_PySet_Contains+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: OPARG + // 28: &_Py_FalseStruct+0x0 + // 30: CONTINUE + // 38: JUMP_TARGET + // 40: &_Py_TrueStruct+0x0 + // 48: ERROR_TARGET + const unsigned char data_body[80] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySet_Type); + patch_64(data + 0x8, (uintptr_t)&PyFrozenSet_Type); + patch_64(data + 0x10, (uintptr_t)&_PySet_Contains); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x40, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x48, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x14); + patch_32r(code + 0x72, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x94, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xb3, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc3, (uintptr_t)data + 0x44); +} + +void +emit__CONVERT_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONVERT_VALUE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_REX_GOTPCRELX _PyEval_ConversionFuncs-0x4 + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 89 df movq %rbx, %rdi + // 1b: ff 14 c1 callq *(%rcx,%rax,8) + // 1e: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 24: 8b 0b movl (%rbx), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0b movl %ecx, (%rbx) + // 2e: 74 22 je 0x52 <_JIT_ENTRY+0x52> + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 48 85 c0 testq %rax, %rax + // 41: 74 31 je 0x74 <_JIT_ENTRY+0x74> + // 43: 49 89 45 00 movq %rax, (%r13) + // 47: 49 83 c5 08 addq $0x8, %r13 + // 4b: 58 popq %rax + // 4c: ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 52: 48 89 df movq %rbx, %rdi + // 55: 48 89 c3 movq %rax, %rbx + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5e: 48 89 d8 movq %rbx, %rax + // 61: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 66: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6f: 48 85 c0 testq %rax, %rax + // 72: 75 cf jne 0x43 <_JIT_ENTRY+0x43> + // 74: 58 popq %rax + // 75: ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[123] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xdf, 0xff, 0x14, 0xc1, 0x49, 0x83, + 0x44, 0x24, 0x40, 0xf8, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x22, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x31, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x75, 0xcf, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ConversionFuncs+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ConversionFuncs); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x1c); +} + +void +emit__COPY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: c1 e0 03 shll $0x3, %eax + // a: 4c 89 e9 movq %r13, %rcx + // d: 48 29 c1 subq %rax, %rcx + // 10: 48 8b 01 movq (%rcx), %rax + // 13: 8b 08 movl (%rax), %ecx + // 15: 85 c9 testl %ecx, %ecx + // 17: 78 04 js 0x1d <_JIT_ENTRY+0x1d> + // 19: ff c1 incl %ecx + // 1b: 89 08 movl %ecx, (%rax) + // 1d: 49 89 45 00 movq %rax, (%r13) + // 21: 49 83 c5 08 addq $0x8, %r13 + // 25: ff 25 00 00 00 00 jmpq *(%rip) # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[37] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x03, 0x4c, 0x89, 0xe9, 0x48, 0x29, 0xc1, + 0x48, 0x8b, 0x01, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__COPY_FREE_VARS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY_FREE_VARS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 7: 66 85 c0 testw %ax, %ax + // a: 74 45 je 0x51 <_JIT_ENTRY+0x51> + // c: 49 8b 04 24 movq (%r12), %rax + // 10: 49 8b 4c 24 10 movq 0x10(%r12), %rcx + // 15: 8b 40 48 movl 0x48(%rax), %eax + // 18: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 1f: 0f b7 f2 movzwl %dx, %esi + // 22: 29 f0 subl %esi, %eax + // 24: 48 8b 49 48 movq 0x48(%rcx), %rcx + // 28: 48 98 cltq + // 2a: 0f b7 d2 movzwl %dx, %edx + // 2d: 66 83 fa 01 cmpw $0x1, %dx + // 31: 75 24 jne 0x57 <_JIT_ENTRY+0x57> + // 33: 31 f6 xorl %esi, %esi + // 35: f6 c2 01 testb $0x1, %dl + // 38: 74 17 je 0x51 <_JIT_ENTRY+0x51> + // 3a: 48 8b 4c f1 18 movq 0x18(%rcx,%rsi,8), %rcx + // 3f: 48 01 f0 addq %rsi, %rax + // 42: 8b 11 movl (%rcx), %edx + // 44: 85 d2 testl %edx, %edx + // 46: 78 04 js 0x4c <_JIT_ENTRY+0x4c> + // 48: ff c2 incl %edx + // 4a: 89 11 movl %edx, (%rcx) + // 4c: 49 89 4c c4 50 movq %rcx, 0x50(%r12,%rax,8) + // 51: ff 25 00 00 00 00 jmpq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 57: 89 d7 movl %edx, %edi + // 59: 83 e7 fe andl $-0x2, %edi + // 5c: 4d 8d 04 c4 leaq (%r12,%rax,8), %r8 + // 60: 49 83 c0 58 addq $0x58, %r8 + // 64: 31 f6 xorl %esi, %esi + // 66: eb 15 jmp 0x7d <_JIT_ENTRY+0x7d> + // 68: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // 70: 4d 89 0c f0 movq %r9, (%r8,%rsi,8) + // 74: 48 83 c6 02 addq $0x2, %rsi + // 78: 48 39 f7 cmpq %rsi, %rdi + // 7b: 74 b8 je 0x35 <_JIT_ENTRY+0x35> + // 7d: 4c 8b 4c f1 18 movq 0x18(%rcx,%rsi,8), %r9 + // 82: 41 8b 19 movl (%r9), %ebx + // 85: 85 db testl %ebx, %ebx + // 87: 78 05 js 0x8e <_JIT_ENTRY+0x8e> + // 89: ff c3 incl %ebx + // 8b: 41 89 19 movl %ebx, (%r9) + // 8e: 4d 89 4c f0 f8 movq %r9, -0x8(%r8,%rsi,8) + // 93: 4c 8b 4c f1 20 movq 0x20(%rcx,%rsi,8), %r9 + // 98: 41 8b 19 movl (%r9), %ebx + // 9b: 85 db testl %ebx, %ebx + // 9d: 78 d1 js 0x70 <_JIT_ENTRY+0x70> + // 9f: ff c3 incl %ebx + // a1: 41 89 19 movl %ebx, (%r9) + // a4: eb ca jmp 0x70 <_JIT_ENTRY+0x70> + const unsigned char code_body[166] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x45, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x40, 0x48, + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xf2, 0x29, 0xf0, 0x48, 0x8b, 0x49, 0x48, + 0x48, 0x98, 0x0f, 0xb7, 0xd2, 0x66, 0x83, 0xfa, + 0x01, 0x75, 0x24, 0x31, 0xf6, 0xf6, 0xc2, 0x01, + 0x74, 0x17, 0x48, 0x8b, 0x4c, 0xf1, 0x18, 0x48, + 0x01, 0xf0, 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, + 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4c, 0xc4, + 0x50, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xd7, 0x83, 0xe7, 0xfe, 0x4d, 0x8d, 0x04, 0xc4, + 0x49, 0x83, 0xc0, 0x58, 0x31, 0xf6, 0xeb, 0x15, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x0c, 0xf0, 0x48, 0x83, 0xc6, 0x02, + 0x48, 0x39, 0xf7, 0x74, 0xb8, 0x4c, 0x8b, 0x4c, + 0xf1, 0x18, 0x41, 0x8b, 0x19, 0x85, 0xdb, 0x78, + 0x05, 0xff, 0xc3, 0x41, 0x89, 0x19, 0x4d, 0x89, + 0x4c, 0xf0, 0xf8, 0x4c, 0x8b, 0x4c, 0xf1, 0x20, + 0x41, 0x8b, 0x19, 0x85, 0xdb, 0x78, 0xd1, 0xff, + 0xc3, 0x41, 0x89, 0x19, 0xeb, 0xca, + }; + // 0: OPARG + // 8: CONTINUE + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0x4); +} + +void +emit__CREATE_INIT_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CREATE_INIT_FRAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 e8 movq %r13, %rax + // 4: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 42 8d 14 c5 00 00 00 00 leal (,%r8,8), %edx + // 14: 4c 89 e9 movq %r13, %rcx + // 17: 48 29 d1 subq %rdx, %rcx + // 1a: 44 89 c2 movl %r8d, %edx + // 1d: f7 d2 notl %edx + // 1f: 48 63 f2 movslq %edx, %rsi + // 22: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 27: 44 29 c2 subl %r8d, %edx + // 2a: 4c 63 ea movslq %edx, %r13 + // 2d: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 32: 49 8b 9e f0 00 00 00 movq 0xf0(%r14), %rbx + // 39: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_REX_GOTPCRELX _Py_InitCleanup-0x4 + // 40: 48 63 7a 4c movslq 0x4c(%rdx), %rdi + // 44: 48 8d 3c fb leaq (%rbx,%rdi,8), %rdi + // 48: 49 89 be f0 00 00 00 movq %rdi, 0xf0(%r14) + // 4f: 4c 89 63 08 movq %r12, 0x8(%rbx) + // 53: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 5a: 48 89 7b 10 movq %rdi, 0x10(%rbx) + // 5e: 48 89 13 movq %rdx, (%rbx) + // 61: 0f 57 c0 xorps %xmm0, %xmm0 + // 64: 0f 11 43 28 movups %xmm0, 0x28(%rbx) + // 68: 48 63 7a 48 movslq 0x48(%rdx), %rdi + // 6c: 48 8d 3c fb leaq (%rbx,%rdi,8), %rdi + // 70: 48 83 c7 58 addq $0x58, %rdi + // 74: 48 89 7b 40 movq %rdi, 0x40(%rbx) + // 78: 48 81 c2 d0 00 00 00 addq $0xd0, %rdx + // 7f: 48 89 53 38 movq %rdx, 0x38(%rbx) + // 83: c7 43 48 00 00 00 00 movl $0x0, 0x48(%rbx) + // 8a: 49 8b 54 24 40 movq 0x40(%r12), %rdx + // 8f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 98: 48 8b 34 f0 movq (%rax,%rsi,8), %rsi + // 9c: 8b 3e movl (%rsi), %edi + // 9e: 85 ff testl %edi, %edi + // a0: 78 04 js 0xa6 <_JIT_ENTRY+0xa6> + // a2: ff c7 incl %edi + // a4: 89 3e movl %edi, (%rsi) + // a6: 48 89 73 50 movq %rsi, 0x50(%rbx) + // aa: 49 89 54 24 40 movq %rdx, 0x40(%r12) + // af: 48 83 c1 f8 addq $-0x8, %rcx + // b3: 41 ff c0 incl %r8d + // b6: 4a 8b 34 e8 movq (%rax,%r13,8), %rsi + // ba: 49 c1 e5 03 shlq $0x3, %r13 + // be: 48 89 1c 24 movq %rbx, (%rsp) + // c2: 4c 89 f7 movq %r14, %rdi + // c5: 31 d2 xorl %edx, %edx + // c7: 45 31 c9 xorl %r9d, %r9d + // ca: ff 15 00 00 00 00 callq *(%rip) # 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000cc: R_X86_64_GOTPCRELX _PyEvalFramePushAndInit-0x4 + // d0: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // d5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // de: 48 85 c0 testq %rax, %rax + // e1: 74 1b je 0xfe <_JIT_ENTRY+0xfe> + // e3: 66 41 c7 44 24 48 04 00 movw $0x4, 0x48(%r12) + // eb: 41 ff 4e 2c decl 0x2c(%r14) + // ef: 49 89 45 00 movq %rax, (%r13) + // f3: 49 83 c5 08 addq $0x8, %r13 + // f7: 58 popq %rax + // f8: ff 25 00 00 00 00 jmpq *(%rip) # 0xfe <_JIT_ENTRY+0xfe> + // 00000000000000fa: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // fe: 4c 89 f7 movq %r14, %rdi + // 101: 48 89 de movq %rbx, %rsi + // 104: ff 15 00 00 00 00 callq *(%rip) # 0x10a <_JIT_ENTRY+0x10a> + // 0000000000000106: R_X86_64_GOTPCRELX _PyEval_FrameClearAndPop-0x4 + // 10a: 58 popq %rax + // 10b: ff 25 00 00 00 00 jmpq *(%rip) # 0x111 <_JIT_ENTRY+0x111> + // 000000000000010d: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[273] = { + 0x50, 0x4c, 0x89, 0xe8, 0x44, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x8d, 0x14, 0xc5, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xe9, 0x48, + 0x29, 0xd1, 0x44, 0x89, 0xc2, 0xf7, 0xd2, 0x48, + 0x63, 0xf2, 0xba, 0xfe, 0xff, 0xff, 0xff, 0x44, + 0x29, 0xc2, 0x4c, 0x63, 0xea, 0x49, 0x89, 0x44, + 0x24, 0x40, 0x49, 0x8b, 0x9e, 0xf0, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x7a, 0x4c, 0x48, 0x8d, 0x3c, 0xfb, + 0x49, 0x89, 0xbe, 0xf0, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0x63, 0x08, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0x7b, 0x10, 0x48, 0x89, + 0x13, 0x0f, 0x57, 0xc0, 0x0f, 0x11, 0x43, 0x28, + 0x48, 0x63, 0x7a, 0x48, 0x48, 0x8d, 0x3c, 0xfb, + 0x48, 0x83, 0xc7, 0x58, 0x48, 0x89, 0x7b, 0x40, + 0x48, 0x81, 0xc2, 0xd0, 0x00, 0x00, 0x00, 0x48, + 0x89, 0x53, 0x38, 0xc7, 0x43, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x54, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x34, 0xf0, 0x8b, 0x3e, 0x85, 0xff, + 0x78, 0x04, 0xff, 0xc7, 0x89, 0x3e, 0x48, 0x89, + 0x73, 0x50, 0x49, 0x89, 0x54, 0x24, 0x40, 0x48, + 0x83, 0xc1, 0xf8, 0x41, 0xff, 0xc0, 0x4a, 0x8b, + 0x34, 0xe8, 0x49, 0xc1, 0xe5, 0x03, 0x48, 0x89, + 0x1c, 0x24, 0x4c, 0x89, 0xf7, 0x31, 0xd2, 0x45, + 0x31, 0xc9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x03, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x1b, 0x66, 0x41, 0xc7, 0x44, 0x24, + 0x48, 0x04, 0x00, 0x41, 0xff, 0x4e, 0x2c, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &_Py_InitCleanup+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &_PyEvalFramePushAndInit+0x0 + // 20: CONTINUE + // 28: &_PyEval_FrameClearAndPop+0x0 + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_PyEval_FrameClearAndPop); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xfa, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x106, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x10d, (uintptr_t)data + 0x2c); +} + +void +emit__DELETE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_ATTR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 49 8b 04 24 movq (%r12), %rax + // 9: 48 8b 40 20 movq 0x20(%rax), %rax + // d: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 14: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 19: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1e: 48 89 df movq %rbx, %rdi + // 21: ff 15 00 00 00 00 callq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX PyObject_DelAttr-0x4 + // 27: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 35: 8b 0b movl (%rbx), %ecx + // 37: 85 c9 testl %ecx, %ecx + // 39: 78 06 js 0x41 <_JIT_ENTRY+0x41> + // 3b: ff c9 decl %ecx + // 3d: 89 0b movl %ecx, (%rbx) + // 3f: 74 0f je 0x50 <_JIT_ENTRY+0x50> + // 41: 49 83 c5 f8 addq $-0x8, %r13 + // 45: 85 c0 testl %eax, %eax + // 47: 74 1c je 0x65 <_JIT_ENTRY+0x65> + // 49: 58 popq %rax + // 4a: ff 25 00 00 00 00 jmpq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 50: 48 89 df movq %rbx, %rdi + // 53: 89 c3 movl %eax, %ebx + // 55: ff 15 00 00 00 00 callq *(%rip) # 0x5b <_JIT_ENTRY+0x5b> + // 0000000000000057: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5b: 89 d8 movl %ebx, %eax + // 5d: 49 83 c5 f8 addq $-0x8, %r13 + // 61: 85 c0 testl %eax, %eax + // 63: 75 e4 jne 0x49 <_JIT_ENTRY+0x49> + // 65: 58 popq %rax + // 66: ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[102] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, + 0x24, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x74, 0xc8, + 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, + 0x0f, 0x49, 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x74, + 0x1c, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x49, 0x83, 0xc5, + 0xf8, 0x85, 0xc0, 0x75, 0xe4, 0x58, + }; + // 0: OPARG + // 8: &PyObject_DelAttr+0x0 + // 10: ERROR_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_DelAttr); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x57, (uintptr_t)data + 0x14); +} + +void +emit__DELETE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_DEREF.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // d: 48 8b 78 10 movq 0x10(%rax), %rdi + // 11: 48 c7 40 10 00 00 00 00 movq $0x0, 0x10(%rax) + // 19: 48 85 ff testq %rdi, %rdi + // 1c: 74 26 je 0x44 <_JIT_ENTRY+0x44> + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 8b 07 movl (%rdi), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 06 js 0x2f <_JIT_ENTRY+0x2f> + // 29: ff c8 decl %eax + // 2b: 89 07 movl %eax, (%rdi) + // 2d: 74 43 je 0x72 <_JIT_ENTRY+0x72> + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 58 popq %rax + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 44: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 4b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 50: 49 8b 34 24 movq (%r12), %rsi + // 54: 4c 89 f7 movq %r14, %rdi + // 57: ff 15 00 00 00 00 callq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: R_X86_64_GOTPCRELX _PyEval_FormatExcUnbound-0x4 + // 5d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 62: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6b: 58 popq %rax + // 6c: ff 25 00 00 00 00 jmpq *(%rip) # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 72: ff 15 00 00 00 00 callq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 78: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 86: 58 popq %rax + // 87: ff 25 00 00 00 00 jmpq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[135] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x44, 0xc4, 0x50, 0x48, 0x8b, 0x78, + 0x10, 0x48, 0xc7, 0x40, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xff, 0x74, 0x26, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x43, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x49, 0x8b, 0x34, 0x24, 0x4c, 0x89, 0xf7, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_PyEval_FormatExcUnbound+0x0 + // 18: ERROR_TARGET + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_32r(code + 0x47, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x1c); +} + +void +emit__DELETE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_FAST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8: 0f b7 f0 movzwl %ax, %esi + // b: 0f b7 c0 movzwl %ax, %eax + // e: 49 8b 7c c4 50 movq 0x50(%r12,%rax,8), %rdi + // 13: 48 85 ff testq %rdi, %rdi + // 16: 74 2f je 0x47 <_JIT_ENTRY+0x47> + // 18: 49 c7 44 f4 50 00 00 00 00 movq $0x0, 0x50(%r12,%rsi,8) + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 8b 07 movl (%rdi), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 06 js 0x32 <_JIT_ENTRY+0x32> + // 2c: ff c8 decl %eax + // 2e: 89 07 movl %eax, (%rdi) + // 30: 74 5d je 0x8f <_JIT_ENTRY+0x8f> + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 58 popq %rax + // 41: ff 25 00 00 00 00 jmpq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 47: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4c: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_REX_GOTPCRELX PyExc_UnboundLocalError-0x4 + // 53: 48 8b 18 movq (%rax), %rbx + // 56: 49 8b 04 24 movq (%r12), %rax + // 5a: 48 8b 78 60 movq 0x60(%rax), %rdi + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: R_X86_64_GOTPCRELX PyTuple_GetItem-0x4 + // 64: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: R_X86_64_PC32 .L.str-0x4 + // 6b: 4c 89 f7 movq %r14, %rdi + // 6e: 48 89 de movq %rbx, %rsi + // 71: 48 89 c1 movq %rax, %rcx + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: R_X86_64_GOTPCRELX _PyEval_FormatExcCheckArg-0x4 + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 58 popq %rax + // 89: ff 25 00 00 00 00 jmpq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 8f: ff 15 00 00 00 00 callq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 95: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a3: 58 popq %rax + // a4: ff 25 00 00 00 00 jmpq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[164] = { + 0x50, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xf0, 0x0f, 0xb7, 0xc0, 0x49, 0x8b, + 0x7c, 0xc4, 0x50, 0x48, 0x85, 0xff, 0x74, 0x2f, + 0x49, 0xc7, 0x44, 0xf4, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x5d, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x18, 0x49, 0x8b, + 0x04, 0x24, 0x48, 0x8b, 0x78, 0x60, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x48, 0x89, + 0xde, 0x48, 0x89, 0xc1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x58, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: OPARG + // 58: CONTINUE + // 60: &PyExc_UnboundLocalError+0x0 + // 68: &PyTuple_GetItem+0x0 + // 70: &_PyEval_FormatExcCheckArg+0x0 + // 78: ERROR_TARGET + // 80: &_Py_Dealloc+0x0 + const unsigned char data_body[136] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, instruction->oparg); + patch_64(data + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x60, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x68, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x70, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x78, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x80, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x4, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x64); + patch_32r(code + 0x67, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x7c); +} + +void +emit__DELETE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_GLOBAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 04 24 movq (%r12), %rax + // 5: 49 8b 7c 24 18 movq 0x18(%r12), %rdi + // a: 48 8b 40 20 movq 0x20(%rax), %rax + // e: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 15: 48 8b 5c c8 18 movq 0x18(%rax,%rcx,8), %rbx + // 1a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1f: 48 89 de movq %rbx, %rsi + // 22: 31 d2 xorl %edx, %edx + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_GOTPCRELX PyDict_Pop-0x4 + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 85 c0 testl %eax, %eax + // 3a: 78 09 js 0x45 <_JIT_ENTRY+0x45> + // 3c: 74 0e je 0x4c <_JIT_ENTRY+0x4c> + // 3e: 58 popq %rax + // 3f: ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 45: 58 popq %rax + // 46: ff 25 00 00 00 00 jmpq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 4c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 51: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: R_X86_64_REX_GOTPCRELX PyExc_NameError-0x4 + // 58: 48 8b 30 movq (%rax), %rsi + // 5b: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_PC32 .L.str-0x4 + // 62: 4c 89 f7 movq %r14, %rdi + // 65: 48 89 d9 movq %rbx, %rcx + // 68: ff 15 00 00 00 00 callq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCRELX _PyEval_FormatExcCheckArg-0x4 + // 6e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 73: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7c: 58 popq %rax + // 7d: ff 25 00 00 00 00 jmpq *(%rip) # 0x83 <_JIT_ENTRY+0x83> + // 000000000000007f: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[131] = { + 0x50, 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x7c, + 0x24, 0x18, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5c, + 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x89, 0xde, 0x31, 0xd2, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x09, 0x74, 0x0e, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xd9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: "name '%.200s' is not defined\x00" + // 1d: 00 00 00 + // 20: OPARG + // 28: &PyDict_Pop+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + // 40: &PyExc_NameError+0x0 + // 48: &_PyEval_FormatExcCheckArg+0x0 + const unsigned char data_body[80] = { + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 0x2e, + 0x32, 0x30, 0x30, 0x73, 0x27, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&PyDict_Pop); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x40, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x48, (uintptr_t)&_PyEval_FormatExcCheckArg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x3c); + patch_32r(code + 0x5e, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x7f, (uintptr_t)data + 0x34); +} + +void +emit__DELETE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_NAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 04 24 movq (%r12), %rax + // 5: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // a: 48 8b 40 20 movq 0x20(%rax), %rax + // e: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 15: 48 8b 5c c8 18 movq 0x18(%rax,%rcx,8), %rbx + // 1a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1f: 48 85 ff testq %rdi, %rdi + // 22: 74 52 je 0x76 <_JIT_ENTRY+0x76> + // 24: 48 89 de movq %rbx, %rsi + // 27: ff 15 00 00 00 00 callq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_GOTPCRELX PyObject_DelItem-0x4 + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 85 c0 testl %eax, %eax + // 3d: 74 6b je 0xaa <_JIT_ENTRY+0xaa> + // 3f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 44: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: R_X86_64_REX_GOTPCRELX PyExc_NameError-0x4 + // 4b: 48 8b 30 movq (%rax), %rsi + // 4e: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: R_X86_64_PC32 .L.str.1-0x4 + // 55: 4c 89 f7 movq %r14, %rdi + // 58: 48 89 d9 movq %rbx, %rcx + // 5b: ff 15 00 00 00 00 callq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: R_X86_64_GOTPCRELX _PyEval_FormatExcCheckArg-0x4 + // 61: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 66: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6f: 58 popq %rax + // 70: ff 25 00 00 00 00 jmpq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 76: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_REX_GOTPCRELX PyExc_SystemError-0x4 + // 7d: 48 8b 30 movq (%rax), %rsi + // 80: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: R_X86_64_PC32 .L.str-0x4 + // 87: 4c 89 f7 movq %r14, %rdi + // 8a: 48 89 d9 movq %rbx, %rcx + // 8d: 31 c0 xorl %eax, %eax + // 8f: ff 15 00 00 00 00 callq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // 95: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a3: 58 popq %rax + // a4: ff 25 00 00 00 00 jmpq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // aa: 58 popq %rax + // ab: ff 25 00 00 00 00 jmpq *(%rip) # 0xb1 <_JIT_ENTRY+0xb1> + // 00000000000000ad: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[171] = { + 0x50, 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x7c, + 0x24, 0x28, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5c, + 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x52, 0x48, 0x89, 0xde, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x6b, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x48, 0x8d, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, + 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, + 0x48, 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf7, 0x48, 0x89, 0xd9, 0x31, 0xc0, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: "no locals when deleting %R\x00name '%.200s' is not defined\x00" + // 38: OPARG + // 40: &PyObject_DelItem+0x0 + // 48: &PyExc_NameError+0x0 + // 50: &_PyEval_FormatExcCheckArg+0x0 + // 58: ERROR_TARGET + // 60: &PyExc_SystemError+0x0 + // 68: &_PyErr_Format+0x0 + const unsigned char data_body[112] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x52, 0x00, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x38, instruction->oparg); + patch_64(data + 0x40, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x48, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x50, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x58, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x60, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x68, (uintptr_t)&_PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x44); + patch_32r(code + 0x51, (uintptr_t)data + 0x17); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0x5c); + patch_32r(code + 0x83, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)data + 0x54); +} + +void +emit__DELETE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_SUBSCR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 48 89 ef movq %rbp, %rdi + // 11: 48 89 de movq %rbx, %rsi + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX PyObject_DelItem-0x4 + // 1a: 41 89 c7 movl %eax, %r15d + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 8b 45 00 movl (%rbp), %eax + // 2e: 85 c0 testl %eax, %eax + // 30: 78 10 js 0x42 <_JIT_ENTRY+0x42> + // 32: ff c8 decl %eax + // 34: 89 45 00 movl %eax, (%rbp) + // 37: 75 09 jne 0x42 <_JIT_ENTRY+0x42> + // 39: 48 89 ef movq %rbp, %rdi + // 3c: ff 15 00 00 00 00 callq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 42: 8b 03 movl (%rbx), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 06 js 0x4e <_JIT_ENTRY+0x4e> + // 48: ff c8 decl %eax + // 4a: 89 03 movl %eax, (%rbx) + // 4c: 74 10 je 0x5e <_JIT_ENTRY+0x5e> + // 4e: 49 83 c5 f0 addq $-0x10, %r13 + // 52: 45 85 ff testl %r15d, %r15d + // 55: 74 19 je 0x70 <_JIT_ENTRY+0x70> + // 57: 5d popq %rbp + // 58: ff 25 00 00 00 00 jmpq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 5e: 48 89 df movq %rbx, %rdi + // 61: ff 15 00 00 00 00 callq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 67: 49 83 c5 f0 addq $-0x10, %r13 + // 6b: 45 85 ff testl %r15d, %r15d + // 6e: 75 e7 jne 0x57 <_JIT_ENTRY+0x57> + // 70: 5d popq %rbp + // 71: ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[113] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xef, 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, 0x85, 0xc0, + 0x78, 0x10, 0xff, 0xc8, 0x89, 0x45, 0x00, 0x75, + 0x09, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x03, 0x74, 0x10, 0x49, 0x83, + 0xc5, 0xf0, 0x45, 0x85, 0xff, 0x74, 0x19, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf0, 0x45, 0x85, 0xff, 0x75, 0xe7, + 0x5d, + }; + // 0: &PyObject_DelItem+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x4); +} + +void +emit__DEOPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DEOPT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 7: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 13: 49 8b 04 24 movq (%r12), %rax + // 17: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_TARGET-0x4 + // 1d: 48 8d 04 48 leaq (%rax,%rcx,2), %rax + // 21: 48 05 d0 00 00 00 addq $0xd0, %rax + // 27: c3 retq + const unsigned char code_body[40] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x86, 0x10, 0x01, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x04, 0x24, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x04, + 0x48, 0x48, 0x05, 0xd0, 0x00, 0x00, 0x00, 0xc3, + }; + // 0: EXECUTOR + // 8: TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->target); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); +} + +void +emit__DICT_MERGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_MERGE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: b9 fc ff ff ff movl $0xfffffffc, %ecx # imm = 0xFFFFFFFC + // 11: 29 c1 subl %eax, %ecx + // 13: f7 d0 notl %eax + // 15: 48 98 cltq + // 17: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 1c: 48 63 c1 movslq %ecx, %rax + // 1f: 4d 8b 7c c5 00 movq (%r13,%rax,8), %r15 + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 48 89 de movq %rbx, %rsi + // 2c: ba 02 00 00 00 movl $0x2, %edx + // 31: ff 15 00 00 00 00 callq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: R_X86_64_GOTPCRELX _PyDict_MergeEx-0x4 + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 85 c0 testl %eax, %eax + // 47: 78 17 js 0x60 <_JIT_ENTRY+0x60> + // 49: 8b 03 movl (%rbx), %eax + // 4b: 85 c0 testl %eax, %eax + // 4d: 78 06 js 0x55 <_JIT_ENTRY+0x55> + // 4f: ff c8 decl %eax + // 51: 89 03 movl %eax, (%rbx) + // 53: 74 44 je 0x99 <_JIT_ENTRY+0x99> + // 55: 49 83 c5 f8 addq $-0x8, %r13 + // 59: 58 popq %rax + // 5a: ff 25 00 00 00 00 jmpq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 60: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 65: 4c 89 f7 movq %r14, %rdi + // 68: 4c 89 fe movq %r15, %rsi + // 6b: 48 89 da movq %rbx, %rdx + // 6e: ff 15 00 00 00 00 callq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: R_X86_64_GOTPCRELX _PyEval_FormatKwargsError-0x4 + // 74: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 79: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 82: 8b 03 movl (%rbx), %eax + // 84: 85 c0 testl %eax, %eax + // 86: 78 06 js 0x8e <_JIT_ENTRY+0x8e> + // 88: ff c8 decl %eax + // 8a: 89 03 movl %eax, (%rbx) + // 8c: 74 1f je 0xad <_JIT_ENTRY+0xad> + // 8e: 49 83 c5 f8 addq $-0x8, %r13 + // 92: 58 popq %rax + // 93: ff 25 00 00 00 00 jmpq *(%rip) # 0x99 <_JIT_ENTRY+0x99> + // 0000000000000095: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 99: 48 89 df movq %rbx, %rdi + // 9c: ff 15 00 00 00 00 callq *(%rip) # 0xa2 <_JIT_ENTRY+0xa2> + // 000000000000009e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a2: 49 83 c5 f8 addq $-0x8, %r13 + // a6: 58 popq %rax + // a7: ff 25 00 00 00 00 jmpq *(%rip) # 0xad <_JIT_ENTRY+0xad> + // 00000000000000a9: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // ad: 48 89 df movq %rbx, %rdi + // b0: ff 15 00 00 00 00 callq *(%rip) # 0xb6 <_JIT_ENTRY+0xb6> + // 00000000000000b2: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b6: 49 83 c5 f8 addq $-0x8, %r13 + // ba: 58 popq %rax + // bb: ff 25 00 00 00 00 jmpq *(%rip) # 0xc1 <_JIT_ENTRY+0xc1> + // 00000000000000bd: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[193] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x5d, 0xf8, 0xb9, 0xfc, 0xff, 0xff, + 0xff, 0x29, 0xc1, 0xf7, 0xd0, 0x48, 0x98, 0x49, + 0x8b, 0x7c, 0xc5, 0x00, 0x48, 0x63, 0xc1, 0x4d, + 0x8b, 0x7c, 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xde, 0xba, 0x02, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, + 0x17, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x44, 0x49, 0x83, 0xc5, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, + 0x4c, 0x89, 0xfe, 0x48, 0x89, 0xda, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x03, 0x74, 0x1f, 0x49, 0x83, + 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &_PyDict_MergeEx+0x0 + // 10: CONTINUE + // 18: &_PyEval_FormatKwargsError+0x0 + // 20: ERROR_TARGET + // 28: &_Py_Dealloc+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_MergeEx); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_PyEval_FormatKwargsError); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x95, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x9e, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + 0x1c); +} + +void +emit__DICT_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_UPDATE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 8b 05 00 00 00 00 movl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 7: f7 d0 notl %eax + // 9: 49 8b 5d f8 movq -0x8(%r13), %rbx + // d: c1 e0 03 shll $0x3, %eax + // 10: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 16: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 48 89 de movq %rbx, %rsi + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX PyDict_Update-0x4 + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 85 c0 testl %eax, %eax + // 39: 78 1b js 0x56 <_JIT_ENTRY+0x56> + // 3b: 8b 03 movl (%rbx), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 0a js 0x4b <_JIT_ENTRY+0x4b> + // 41: ff c8 decl %eax + // 43: 89 03 movl %eax, (%rbx) + // 45: 0f 84 83 00 00 00 je 0xce <_JIT_ENTRY+0xce> + // 4b: 49 83 c5 f8 addq $-0x8, %r13 + // 4f: 58 popq %rax + // 50: ff 25 00 00 00 00 jmpq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 56: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5b: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_REX_GOTPCRELX PyExc_AttributeError-0x4 + // 62: 48 8b 30 movq (%rax), %rsi + // 65: 4c 89 f7 movq %r14, %rdi + // 68: ff 15 00 00 00 00 callq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCRELX _PyErr_ExceptionMatches-0x4 + // 6e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 73: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7c: 85 c0 testl %eax, %eax + // 7e: 74 37 je 0xb7 <_JIT_ENTRY+0xb7> + // 80: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 85: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x8c <_JIT_ENTRY+0x8c> + // 0000000000000088: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // 8c: 48 8b 30 movq (%rax), %rsi + // 8f: 48 8b 43 08 movq 0x8(%rbx), %rax + // 93: 48 8b 48 18 movq 0x18(%rax), %rcx + // 97: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x9e <_JIT_ENTRY+0x9e> + // 000000000000009a: R_X86_64_PC32 .L.str-0x4 + // 9e: 4c 89 f7 movq %r14, %rdi + // a1: 31 c0 xorl %eax, %eax + // a3: ff 15 00 00 00 00 callq *(%rip) # 0xa9 <_JIT_ENTRY+0xa9> + // 00000000000000a5: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // a9: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ae: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b7: 8b 03 movl (%rbx), %eax + // b9: 85 c0 testl %eax, %eax + // bb: 78 06 js 0xc3 <_JIT_ENTRY+0xc3> + // bd: ff c8 decl %eax + // bf: 89 03 movl %eax, (%rbx) + // c1: 74 1f je 0xe2 <_JIT_ENTRY+0xe2> + // c3: 49 83 c5 f8 addq $-0x8, %r13 + // c7: 58 popq %rax + // c8: ff 25 00 00 00 00 jmpq *(%rip) # 0xce <_JIT_ENTRY+0xce> + // 00000000000000ca: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // ce: 48 89 df movq %rbx, %rdi + // d1: ff 15 00 00 00 00 callq *(%rip) # 0xd7 <_JIT_ENTRY+0xd7> + // 00000000000000d3: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // d7: 49 83 c5 f8 addq $-0x8, %r13 + // db: 58 popq %rax + // dc: ff 25 00 00 00 00 jmpq *(%rip) # 0xe2 <_JIT_ENTRY+0xe2> + // 00000000000000de: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // e2: 48 89 df movq %rbx, %rdi + // e5: ff 15 00 00 00 00 callq *(%rip) # 0xeb <_JIT_ENTRY+0xeb> + // 00000000000000e7: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // eb: 49 83 c5 f8 addq $-0x8, %r13 + // ef: 58 popq %rax + // f0: ff 25 00 00 00 00 jmpq *(%rip) # 0xf6 <_JIT_ENTRY+0xf6> + // 00000000000000f2: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[246] = { + 0x50, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf7, + 0xd0, 0x49, 0x8b, 0x5d, 0xf8, 0xc1, 0xe0, 0x03, + 0x48, 0x0d, 0x00, 0x00, 0xf8, 0xff, 0x49, 0x8b, + 0x7c, 0x05, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x1b, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x0a, 0xff, 0xc8, 0x89, 0x03, 0x0f, 0x84, 0x83, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x30, 0x4c, 0x89, 0xf7, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x37, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x48, + 0x8b, 0x43, 0x08, 0x48, 0x8b, 0x48, 0x18, 0x48, + 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x03, 0x74, 0x1f, 0x49, 0x83, 0xc5, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'%.200s' object is not a mapping\x00" + // 21: 00 00 00 00 00 00 00 + // 28: OPARG + // 30: &PyDict_Update+0x0 + // 38: CONTINUE + // 40: &PyExc_AttributeError+0x0 + // 48: &_PyErr_ExceptionMatches+0x0 + // 50: &PyExc_TypeError+0x0 + // 58: &_PyErr_Format+0x0 + // 60: ERROR_TARGET + // 68: &_Py_Dealloc+0x0 + const unsigned char data_body[112] = { + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, instruction->oparg); + patch_64(data + 0x30, (uintptr_t)&PyDict_Update); + patch_64(data + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x40, (uintptr_t)&PyExc_AttributeError); + patch_64(data + 0x48, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x50, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x58, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x60, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x68, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + 0x4c); + patch_32r(code + 0x9a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xa5, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xca, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0xe7, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)data + 0x5c); +} + +void +emit__END_FOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_FOR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 8b 07 movl (%rdi), %eax + // 10: 85 c0 testl %eax, %eax + // 12: 78 06 js 0x1a <_JIT_ENTRY+0x1a> + // 14: ff c8 decl %eax + // 16: 89 07 movl %eax, (%rdi) + // 18: 74 15 je 0x2f <_JIT_ENTRY+0x2f> + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 58 popq %rax + // 29: ff 25 00 00 00 00 jmpq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 35: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 43: 58 popq %rax + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[68] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0x4); +} + +void +emit__END_SEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_SEND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 eb movq %r13, %rbx + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 8b 7b f0 movq -0x10(%rbx), %rdi + // c: 4c 8b 7b f8 movq -0x8(%rbx), %r15 + // 10: 8b 07 movl (%rdi), %eax + // 12: 85 c0 testl %eax, %eax + // 14: 78 06 js 0x1c <_JIT_ENTRY+0x1c> + // 16: ff c8 decl %eax + // 18: 89 07 movl %eax, (%rdi) + // 1a: 74 0b je 0x27 <_JIT_ENTRY+0x27> + // 1c: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // 20: 58 popq %rax + // 21: ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 27: ff 15 00 00 00 00 callq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 2d: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // 31: 58 popq %rax + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[50] = { + 0x50, 0x4c, 0x89, 0xeb, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x8b, 0x7b, 0xf0, 0x4c, 0x8b, 0x7b, 0xf8, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x07, 0x74, 0x0b, 0x4c, 0x89, 0x7b, 0xf0, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x7b, + 0xf0, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); +} + +void +emit__ERROR_POP_N( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ERROR_POP_N.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 7: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // e: 49 8b 04 24 movq (%r12), %rax + // 12: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 18: 48 8d 04 48 leaq (%rax,%rcx,2), %rax + // 1c: 48 05 d0 00 00 00 addq $0xd0, %rax + // 22: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 31 c0 xorl %eax, %eax + // 2e: c3 retq + const unsigned char code_body[47] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x86, 0x10, 0x01, 0x00, 0x00, 0x49, 0x8b, + 0x04, 0x24, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8d, 0x04, 0x48, 0x48, 0x05, 0xd0, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x44, 0x24, 0x38, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x31, 0xc0, 0xc3, + }; + // 0: EXECUTOR + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__EXIT_INIT_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_INIT_CHECK.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // c: 74 3b je 0x49 <_JIT_ENTRY+0x49> + // e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 13: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // 1a: 48 8b 39 movq (%rcx), %rdi + // 1d: 48 8b 40 08 movq 0x8(%rax), %rax + // 21: 48 8b 50 18 movq 0x18(%rax), %rdx + // 25: 48 8d 35 00 00 00 00 leaq (%rip), %rsi # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_PC32 .L.str-0x4 + // 2c: 31 c0 xorl %eax, %eax + // 2e: ff 15 00 00 00 00 callq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: R_X86_64_GOTPCRELX PyErr_Format-0x4 + // 34: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 39: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 42: 58 popq %rax + // 43: ff 25 00 00 00 00 jmpq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 49: 49 83 c5 f8 addq $-0x8, %r13 + // 4d: 58 popq %rax + // 4e: ff 25 00 00 00 00 jmpq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[78] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x3b, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x39, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x8b, 0x50, 0x18, 0x48, 0x8d, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x31, 0xc0, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, + }; + // 0: "__init__() should return None, not '%.200s'\x00" + // 2c: 00 00 00 00 + // 30: &_Py_NoneStruct+0x0 + // 38: &PyExc_TypeError+0x0 + // 40: &PyErr_Format+0x0 + // 48: ERROR_TARGET + const unsigned char data_body[80] = { + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x5f, + 0x28, 0x29, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x27, 0x25, 0x2e, 0x32, 0x30, + 0x30, 0x73, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x38, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x40, (uintptr_t)&PyErr_Format); + patch_64(data + 0x48, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x34); + patch_32r(code + 0x28, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0x44); +} + +void +emit__EXIT_TRACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_TRACE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 49 8b 2c 24 movq (%r12), %rbp + // 9: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 10: 41 8b 1f movl (%r15), %ebx + // 13: 49 8b 7f 08 movq 0x8(%r15), %rdi + // 17: 48 85 ff testq %rdi, %rdi + // 1a: 0f 84 04 01 00 00 je 0x124 <_JIT_ENTRY+0x124> + // 20: f6 47 22 01 testb $0x1, 0x22(%rdi) + // 24: 0f 85 c5 00 00 00 jne 0xef <_JIT_ENTRY+0xef> + // 2a: 66 41 c7 47 04 fc ff movw $0xfffc, 0x4(%r15) # imm = 0xFFFC + // 31: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 36: 49 c7 47 08 00 00 00 00 movq $0x0, 0x8(%r15) + // 3e: 8b 07 movl (%rdi), %eax + // 40: 85 c0 testl %eax, %eax + // 42: 0f 88 ce 00 00 00 js 0x116 <_JIT_ENTRY+0x116> + // 48: ff c8 decl %eax + // 4a: 89 07 movl %eax, (%rdi) + // 4c: 75 06 jne 0x54 <_JIT_ENTRY+0x54> + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 54: 49 8b 7f 08 movq 0x8(%r15), %rdi + // 58: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 66: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 6d: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 74: 48 85 ff testq %rdi, %rdi + // 77: 0f 85 80 00 00 00 jne 0xfd <_JIT_ENTRY+0xfd> + // 7d: 48 8d 04 5d d0 00 00 00 leaq 0xd0(,%rbx,2), %rax + // 85: 48 01 e8 addq %rbp, %rax + // 88: 41 0f b7 5f 04 movzwl 0x4(%r15), %ebx + // 8d: 83 fb 0f cmpl $0xf, %ebx + // 90: 0f 83 b5 00 00 00 jae 0x14b <_JIT_ENTRY+0x14b> + // 96: 80 38 ff cmpb $-0x1, (%rax) + // 99: 0f 84 bf 00 00 00 je 0x15e <_JIT_ENTRY+0x15e> + // 9f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xa6 <_JIT_ENTRY+0xa6> + // 00000000000000a2: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // a6: 0f b6 49 22 movzbl 0x22(%rcx), %ecx + // aa: c1 e9 02 shrl $0x2, %ecx + // ad: ff c1 incl %ecx + // af: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // b4: 48 8d 54 24 08 leaq 0x8(%rsp), %rdx + // b9: 4c 89 e7 movq %r12, %rdi + // bc: 48 89 c5 movq %rax, %rbp + // bf: 48 89 c6 movq %rax, %rsi + // c2: ff 15 00 00 00 00 callq *(%rip) # 0xc8 <_JIT_ENTRY+0xc8> + // 00000000000000c4: R_X86_64_GOTPCRELX _PyOptimizer_Optimize-0x4 + // c8: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // cd: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d6: 85 c0 testl %eax, %eax + // d8: 0f 8e a6 00 00 00 jle 0x184 <_JIT_ENTRY+0x184> + // de: 66 41 c7 47 04 fc ff movw $0xfffc, 0x4(%r15) # imm = 0xFFFC + // e5: 48 8b 7c 24 08 movq 0x8(%rsp), %rdi + // ea: e9 89 00 00 00 jmp 0x178 <_JIT_ENTRY+0x178> + // ef: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xf6 <_JIT_ENTRY+0xf6> + // 00000000000000f2: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // f6: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // fd: 8b 07 movl (%rdi), %eax + // ff: 85 c0 testl %eax, %eax + // 101: 78 08 js 0x10b <_JIT_ENTRY+0x10b> + // 103: ff c0 incl %eax + // 105: 89 07 movl %eax, (%rdi) + // 107: 49 8b 7f 08 movq 0x8(%r15), %rdi + // 10b: 48 8b 47 78 movq 0x78(%rdi), %rax + // 10f: 48 83 c4 10 addq $0x10, %rsp + // 113: 5d popq %rbp + // 114: ff e0 jmpq *%rax + // 116: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 11b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 124: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x12b <_JIT_ENTRY+0x12b> + // 0000000000000127: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 12b: 49 89 86 10 01 00 00 movq %rax, 0x110(%r14) + // 132: 48 8d 04 5d d0 00 00 00 leaq 0xd0(,%rbx,2), %rax + // 13a: 48 01 e8 addq %rbp, %rax + // 13d: 41 0f b7 5f 04 movzwl 0x4(%r15), %ebx + // 142: 83 fb 0f cmpl $0xf, %ebx + // 145: 0f 82 4b ff ff ff jb 0x96 <_JIT_ENTRY+0x96> + // 14b: 83 c3 f0 addl $-0x10, %ebx + // 14e: 66 41 89 5f 04 movw %bx, 0x4(%r15) + // 153: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 158: 48 83 c4 10 addq $0x10, %rsp + // 15c: 5d popq %rbp + // 15d: c3 retq + // 15e: 48 8b 8d 98 00 00 00 movq 0x98(%rbp), %rcx + // 165: 0f b6 40 01 movzbl 0x1(%rax), %eax + // 169: 48 8b 7c c1 08 movq 0x8(%rcx,%rax,8), %rdi + // 16e: 8b 07 movl (%rdi), %eax + // 170: 85 c0 testl %eax, %eax + // 172: 78 04 js 0x178 <_JIT_ENTRY+0x178> + // 174: ff c0 incl %eax + // 176: 89 07 movl %eax, (%rdi) + // 178: 49 89 7f 08 movq %rdi, 0x8(%r15) + // 17c: 8b 07 movl (%rdi), %eax + // 17e: 85 c0 testl %eax, %eax + // 180: 79 81 jns 0x103 <_JIT_ENTRY+0x103> + // 182: eb 87 jmp 0x10b <_JIT_ENTRY+0x10b> + // 184: 66 ba fc ff movw $0xfffc, %dx # imm = 0xFFFC + // 188: 66 83 fb 0b cmpw $0xb, %bx + // 18c: 77 12 ja 0x1a0 <_JIT_ENTRY+0x1a0> + // 18e: ff c3 incl %ebx + // 190: ba ff ff ff ff movl $0xffffffff, %edx # imm = 0xFFFFFFFF + // 195: 89 d9 movl %ebx, %ecx + // 197: d3 e2 shll %cl, %edx + // 199: f7 d2 notl %edx + // 19b: c1 e2 04 shll $0x4, %edx + // 19e: 09 da orl %ebx, %edx + // 1a0: 66 41 89 57 04 movw %dx, 0x4(%r15) + // 1a5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1aa: 31 c9 xorl %ecx, %ecx + // 1ac: 85 c0 testl %eax, %eax + // 1ae: 48 89 e8 movq %rbp, %rax + // 1b1: 48 0f 45 c1 cmovneq %rcx, %rax + // 1b5: 48 83 c4 10 addq $0x10, %rsp + // 1b9: 5d popq %rbp + // 1ba: c3 retq + const unsigned char code_body[443] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x49, 0x8b, 0x2c, + 0x24, 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x8b, 0x1f, 0x49, 0x8b, 0x7f, 0x08, 0x48, + 0x85, 0xff, 0x0f, 0x84, 0x04, 0x01, 0x00, 0x00, + 0xf6, 0x47, 0x22, 0x01, 0x0f, 0x85, 0xc5, 0x00, + 0x00, 0x00, 0x66, 0x41, 0xc7, 0x47, 0x04, 0xfc, + 0xff, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x47, 0x08, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, + 0x85, 0xc0, 0x0f, 0x88, 0xce, 0x00, 0x00, 0x00, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7f, 0x08, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, + 0x10, 0x01, 0x00, 0x00, 0x48, 0x85, 0xff, 0x0f, + 0x85, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x04, + 0x5d, 0xd0, 0x00, 0x00, 0x00, 0x48, 0x01, 0xe8, + 0x41, 0x0f, 0xb7, 0x5f, 0x04, 0x83, 0xfb, 0x0f, + 0x0f, 0x83, 0xb5, 0x00, 0x00, 0x00, 0x80, 0x38, + 0xff, 0x0f, 0x84, 0xbf, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb6, + 0x49, 0x22, 0xc1, 0xe9, 0x02, 0xff, 0xc1, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8d, 0x54, 0x24, + 0x08, 0x4c, 0x89, 0xe7, 0x48, 0x89, 0xc5, 0x48, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x0f, 0x8e, 0xa6, 0x00, 0x00, 0x00, 0x66, 0x41, + 0xc7, 0x47, 0x04, 0xfc, 0xff, 0x48, 0x8b, 0x7c, + 0x24, 0x08, 0xe9, 0x89, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x86, 0x10, 0x01, 0x00, 0x00, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x08, 0xff, 0xc0, 0x89, 0x07, 0x49, + 0x8b, 0x7f, 0x08, 0x48, 0x8b, 0x47, 0x78, 0x48, + 0x83, 0xc4, 0x10, 0x5d, 0xff, 0xe0, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, 0x10, 0x01, + 0x00, 0x00, 0x48, 0x8d, 0x04, 0x5d, 0xd0, 0x00, + 0x00, 0x00, 0x48, 0x01, 0xe8, 0x41, 0x0f, 0xb7, + 0x5f, 0x04, 0x83, 0xfb, 0x0f, 0x0f, 0x82, 0x4b, + 0xff, 0xff, 0xff, 0x83, 0xc3, 0xf0, 0x66, 0x41, + 0x89, 0x5f, 0x04, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xc3, 0x48, 0x8b, + 0x8d, 0x98, 0x00, 0x00, 0x00, 0x0f, 0xb6, 0x40, + 0x01, 0x48, 0x8b, 0x7c, 0xc1, 0x08, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x07, + 0x49, 0x89, 0x7f, 0x08, 0x8b, 0x07, 0x85, 0xc0, + 0x79, 0x81, 0xeb, 0x87, 0x66, 0xba, 0xfc, 0xff, + 0x66, 0x83, 0xfb, 0x0b, 0x77, 0x12, 0xff, 0xc3, + 0xba, 0xff, 0xff, 0xff, 0xff, 0x89, 0xd9, 0xd3, + 0xe2, 0xf7, 0xd2, 0xc1, 0xe2, 0x04, 0x09, 0xda, + 0x66, 0x41, 0x89, 0x57, 0x04, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x31, 0xc9, 0x85, 0xc0, 0x48, 0x89, + 0xe8, 0x48, 0x0f, 0x45, 0xc1, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xc3, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: EXECUTOR + // 18: &_PyOptimizer_Optimize+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)executor); + patch_64(data + 0x18, (uintptr_t)&_PyOptimizer_Optimize); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x127, (uintptr_t)data + 0xc); +} + +void +emit__EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // d: 29 c2 subl %eax, %edx + // f: f7 d0 notl %eax + // 11: 48 63 c8 movslq %eax, %rcx + // 14: 48 63 c2 movslq %edx, %rax + // 17: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1c: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 20: 8b 3e movl (%rsi), %edi + // 22: 85 ff testl %edi, %edi + // 24: 78 04 js 0x2a <_JIT_ENTRY+0x2a> + // 26: ff c7 incl %edi + // 28: 89 3e movl %edi, (%rsi) + // 2a: 49 89 74 cd 00 movq %rsi, (%r13,%rcx,8) + // 2f: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 34: 48 8b 4a 10 movq 0x10(%rdx), %rcx + // 38: 8b 11 movl (%rcx), %edx + // 3a: 85 d2 testl %edx, %edx + // 3c: 78 04 js 0x42 <_JIT_ENTRY+0x42> + // 3e: ff c2 incl %edx + // 40: 89 11 movl %edx, (%rcx) + // 42: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 47: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4c: 8b 07 movl (%rdi), %eax + // 4e: 85 c0 testl %eax, %eax + // 50: 78 06 js 0x58 <_JIT_ENTRY+0x58> + // 52: ff c8 decl %eax + // 54: 89 07 movl %eax, (%rdi) + // 56: 74 15 je 0x6d <_JIT_ENTRY+0x6d> + // 58: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 66: 58 popq %rax + // 67: ff 25 00 00 00 00 jmpq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6d: ff 15 00 00 00 00 callq *(%rip) # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 73: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: 58 popq %rax + // 82: ff 25 00 00 00 00 jmpq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[130] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xba, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc2, 0xf7, + 0xd0, 0x48, 0x63, 0xc8, 0x48, 0x63, 0xc2, 0x49, + 0x8b, 0x54, 0xc5, 0x00, 0x48, 0x8b, 0x72, 0x18, + 0x8b, 0x3e, 0x85, 0xff, 0x78, 0x04, 0xff, 0xc7, + 0x89, 0x3e, 0x49, 0x89, 0x74, 0xcd, 0x00, 0x49, + 0x8b, 0x7c, 0xc5, 0x00, 0x48, 0x8b, 0x4a, 0x10, + 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, + 0x89, 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); +} + +void +emit__EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD_KW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // d: 29 c1 subl %eax, %ecx + // f: 48 63 c9 movslq %ecx, %rcx + // 12: ba fd ff ff ff movl $0xfffffffd, %edx # imm = 0xFFFFFFFD + // 17: 29 c2 subl %eax, %edx + // 19: 48 63 c2 movslq %edx, %rax + // 1c: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 21: 48 8b 57 18 movq 0x18(%rdi), %rdx + // 25: 8b 32 movl (%rdx), %esi + // 27: 85 f6 testl %esi, %esi + // 29: 78 04 js 0x2f <_JIT_ENTRY+0x2f> + // 2b: ff c6 incl %esi + // 2d: 89 32 movl %esi, (%rdx) + // 2f: 49 89 54 cd 00 movq %rdx, (%r13,%rcx,8) + // 34: 48 8b 4f 10 movq 0x10(%rdi), %rcx + // 38: 8b 11 movl (%rcx), %edx + // 3a: 85 d2 testl %edx, %edx + // 3c: 78 04 js 0x42 <_JIT_ENTRY+0x42> + // 3e: ff c2 incl %edx + // 40: 89 11 movl %edx, (%rcx) + // 42: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 47: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4c: 8b 07 movl (%rdi), %eax + // 4e: 85 c0 testl %eax, %eax + // 50: 78 06 js 0x58 <_JIT_ENTRY+0x58> + // 52: ff c8 decl %eax + // 54: 89 07 movl %eax, (%rdi) + // 56: 74 15 je 0x6d <_JIT_ENTRY+0x6d> + // 58: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 66: 58 popq %rax + // 67: ff 25 00 00 00 00 jmpq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6d: ff 15 00 00 00 00 callq *(%rip) # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 73: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: 58 popq %rax + // 82: ff 25 00 00 00 00 jmpq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[130] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, + 0x63, 0xc9, 0xba, 0xfd, 0xff, 0xff, 0xff, 0x29, + 0xc2, 0x48, 0x63, 0xc2, 0x49, 0x8b, 0x7c, 0xc5, + 0x00, 0x48, 0x8b, 0x57, 0x18, 0x8b, 0x32, 0x85, + 0xf6, 0x78, 0x04, 0xff, 0xc6, 0x89, 0x32, 0x49, + 0x89, 0x54, 0xcd, 0x00, 0x48, 0x8b, 0x4f, 0x10, + 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, + 0x89, 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); +} + +void +emit__FATAL_ERROR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FATAL_ERROR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 48 8d 3d 00 00 00 00 leaq (%rip), %rdi # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_PC32 .L__func__._JIT_ENTRY-0x4 + // 8: 48 8d 35 00 00 00 00 leaq (%rip), %rsi # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_PC32 .L.str-0x4 + // f: ff 15 00 00 00 00 callq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX _Py_FatalErrorFunc-0x4 + const unsigned char code_body[21] = { + 0x50, 0x48, 0x8d, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8d, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '_JIT_ENTRY\x00Fatal error uop executed.\x00' + // 25: 00 00 00 + // 28: &_Py_FatalErrorFunc+0x0 + const unsigned char data_body[48] = { + 0x5f, 0x4a, 0x49, 0x54, 0x5f, 0x45, 0x4e, 0x54, + 0x52, 0x59, 0x00, 0x46, 0x61, 0x74, 0x61, 0x6c, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x75, + 0x6f, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_FatalErrorFunc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_32r(code + 0xb, (uintptr_t)data + 0x7); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + 0x24); +} + +void +emit__FORMAT_SIMPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_SIMPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 48 8b 43 08 movq 0x8(%rbx), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyUnicode_Type-0x4 + // 10: 74 47 je 0x59 <_JIT_ENTRY+0x59> + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 48 89 df movq %rbx, %rdi + // 1a: 31 f6 xorl %esi, %esi + // 1c: ff 15 00 00 00 00 callq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX PyObject_Format-0x4 + // 22: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 28: 8b 0b movl (%rbx), %ecx + // 2a: 85 c9 testl %ecx, %ecx + // 2c: 78 06 js 0x34 <_JIT_ENTRY+0x34> + // 2e: ff c9 decl %ecx + // 30: 89 0b movl %ecx, (%rbx) + // 32: 74 38 je 0x6c <_JIT_ENTRY+0x6c> + // 34: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 39: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 42: 48 85 c0 testq %rax, %rax + // 45: 74 47 je 0x8e <_JIT_ENTRY+0x8e> + // 47: 48 89 c3 movq %rax, %rbx + // 4a: 49 89 5d 00 movq %rbx, (%r13) + // 4e: 49 83 c5 08 addq $0x8, %r13 + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 59: 49 83 c5 f8 addq $-0x8, %r13 + // 5d: 49 89 5d 00 movq %rbx, (%r13) + // 61: 49 83 c5 08 addq $0x8, %r13 + // 65: 58 popq %rax + // 66: ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6c: 48 89 df movq %rbx, %rdi + // 6f: 48 89 c3 movq %rax, %rbx + // 72: ff 15 00 00 00 00 callq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 78: 48 89 d8 movq %rbx, %rax + // 7b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 80: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 89: 48 85 c0 testq %rax, %rax + // 8c: 75 b9 jne 0x47 <_JIT_ENTRY+0x47> + // 8e: 58 popq %rax + // 8f: ff 25 00 00 00 00 jmpq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[149] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x47, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x89, 0xdf, 0x31, 0xf6, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x83, 0x44, 0x24, 0x40, 0xf8, + 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0b, 0x74, 0x38, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x47, 0x48, + 0x89, 0xc3, 0x49, 0x89, 0x5d, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x89, 0x5d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x48, + 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x75, 0xb9, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: &PyObject_Format+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, (uintptr_t)&PyObject_Format); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x1c); +} + +void +emit__FORMAT_WITH_SPEC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_WITH_SPEC.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 48 89 ef movq %rbp, %rdi + // 11: 4c 89 fe movq %r15, %rsi + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX PyObject_Format-0x4 + // 1a: 48 89 c3 movq %rax, %rbx + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 8b 45 00 movl (%rbp), %eax + // 2e: 85 c0 testl %eax, %eax + // 30: 78 10 js 0x42 <_JIT_ENTRY+0x42> + // 32: ff c8 decl %eax + // 34: 89 45 00 movl %eax, (%rbp) + // 37: 75 09 jne 0x42 <_JIT_ENTRY+0x42> + // 39: 48 89 ef movq %rbp, %rdi + // 3c: ff 15 00 00 00 00 callq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 42: 41 8b 07 movl (%r15), %eax + // 45: 85 c0 testl %eax, %eax + // 47: 78 07 js 0x50 <_JIT_ENTRY+0x50> + // 49: ff c8 decl %eax + // 4b: 41 89 07 movl %eax, (%r15) + // 4e: 74 14 je 0x64 <_JIT_ENTRY+0x64> + // 50: 48 85 db testq %rbx, %rbx + // 53: 74 1d je 0x72 <_JIT_ENTRY+0x72> + // 55: 49 89 5d f0 movq %rbx, -0x10(%r13) + // 59: 49 83 c5 f8 addq $-0x8, %r13 + // 5d: 5d popq %rbp + // 5e: ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 64: 4c 89 ff movq %r15, %rdi + // 67: ff 15 00 00 00 00 callq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 6d: 48 85 db testq %rbx, %rbx + // 70: 75 e3 jne 0x55 <_JIT_ENTRY+0x55> + // 72: 49 83 c5 f0 addq $-0x10, %r13 + // 76: 5d popq %rbp + // 77: ff 25 00 00 00 00 jmpq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[125] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x8b, 0x7d, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xef, 0x4c, 0x89, 0xfe, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xc3, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, 0x85, 0xc0, + 0x78, 0x10, 0xff, 0xc8, 0x89, 0x45, 0x00, 0x75, + 0x09, 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x07, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, 0x14, + 0x48, 0x85, 0xdb, 0x74, 0x1d, 0x49, 0x89, 0x5d, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xdb, + 0x75, 0xe3, 0x49, 0x83, 0xc5, 0xf0, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_Format+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Format); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0x14); +} + +void +emit__FOR_ITER_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_GEN_FRAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyGen_Type-0x4 + // f: 75 06 jne 0x17 <_JIT_ENTRY+0x17> + // 11: 80 78 43 00 cmpb $0x0, 0x43(%rax) + // 15: 78 06 js 0x1d <_JIT_ENTRY+0x1d> + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 1d: 48 8b 88 88 00 00 00 movq 0x88(%rax), %rcx + // 24: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 2b: 48 89 11 movq %rdx, (%rcx) + // 2e: 48 83 80 88 00 00 00 08 addq $0x8, 0x88(%rax) + // 36: 48 8d 48 48 leaq 0x48(%rax), %rcx + // 3a: c6 40 43 00 movb $0x0, 0x43(%rax) + // 3e: 49 8b 56 78 movq 0x78(%r14), %rdx + // 42: 48 8d 70 28 leaq 0x28(%rax), %rsi + // 46: 48 89 50 30 movq %rdx, 0x30(%rax) + // 4a: 49 89 76 78 movq %rsi, 0x78(%r14) + // 4e: 4c 89 60 50 movq %r12, 0x50(%rax) + // 52: 8b 05 00 00 00 00 movl (%rip), %eax # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 58: 83 c0 02 addl $0x2, %eax + // 5b: 66 41 89 44 24 48 movw %ax, 0x48(%r12) + // 61: 49 89 4d 00 movq %rcx, (%r13) + // 65: 49 83 c5 08 addq $0x8, %r13 + // 69: ff 25 00 00 00 00 jmpq *(%rip) # 0x6f <_JIT_ENTRY+0x6f> + // 000000000000006b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[105] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x06, 0x80, 0x78, 0x43, 0x00, 0x78, 0x06, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x88, + 0x88, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x11, 0x48, 0x83, + 0x80, 0x88, 0x00, 0x00, 0x00, 0x08, 0x48, 0x8d, + 0x48, 0x48, 0xc6, 0x40, 0x43, 0x00, 0x49, 0x8b, + 0x56, 0x78, 0x48, 0x8d, 0x70, 0x28, 0x48, 0x89, + 0x50, 0x30, 0x49, 0x89, 0x76, 0x78, 0x4c, 0x89, + 0x60, 0x50, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc0, 0x02, 0x66, 0x41, 0x89, 0x44, 0x24, + 0x48, 0x49, 0x89, 0x4d, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: &PyGen_Type+0x0 + // 8: JUMP_TARGET + // 10: &_Py_NoneStruct+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyGen_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x14); +} + +void +emit__FOR_ITER_TIER_TWO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_TIER_TWO.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 48 8b 47 08 movq 0x8(%rdi), %rax + // e: ff 90 e0 00 00 00 callq *0xe0(%rax) + // 14: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 19: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 0f je 0x36 <_JIT_ENTRY+0x36> + // 27: 49 89 45 00 movq %rax, (%r13) + // 2b: 49 83 c5 08 addq $0x8, %r13 + // 2f: 58 popq %rax + // 30: ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 36: 49 8b 46 70 movq 0x70(%r14), %rax + // 3a: 48 85 c0 testq %rax, %rax + // 3d: 74 5e je 0x9d <_JIT_ENTRY+0x9d> + // 3f: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // 44: 74 57 je 0x9d <_JIT_ENTRY+0x9d> + // 46: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4b: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_REX_GOTPCRELX PyExc_StopIteration-0x4 + // 52: 48 8b 30 movq (%rax), %rsi + // 55: 4c 89 f7 movq %r14, %rdi + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _PyErr_ExceptionMatches-0x4 + // 5e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 63: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6c: 85 c0 testl %eax, %eax + // 6e: 74 34 je 0xa4 <_JIT_ENTRY+0xa4> + // 70: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 75: 49 8b 54 24 38 movq 0x38(%r12), %rdx + // 7a: 4c 89 f7 movq %r14, %rdi + // 7d: 4c 89 e6 movq %r12, %rsi + // 80: ff 15 00 00 00 00 callq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: R_X86_64_GOTPCRELX _PyEval_MonitorRaise-0x4 + // 86: 4c 89 f7 movq %r14, %rdi + // 89: ff 15 00 00 00 00 callq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: R_X86_64_GOTPCRELX _PyErr_Clear-0x4 + // 8f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 94: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9d: 58 popq %rax + // 9e: ff 25 00 00 00 00 jmpq *(%rip) # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // a4: 58 popq %rax + // a5: ff 25 00 00 00 00 jmpq *(%rip) # 0xab <_JIT_ENTRY+0xab> + // 00000000000000a7: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[171] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x47, 0x08, 0xff, 0x90, + 0xe0, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0f, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x46, 0x70, 0x48, 0x85, 0xc0, 0x74, 0x5e, 0x48, + 0x83, 0x78, 0x08, 0x00, 0x74, 0x57, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x30, 0x4c, 0x89, 0xf7, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x34, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x54, + 0x24, 0x38, 0x4c, 0x89, 0xf7, 0x4c, 0x89, 0xe6, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: &PyExc_StopIteration+0x0 + // 10: &_PyErr_ExceptionMatches+0x0 + // 18: &_PyEval_MonitorRaise+0x0 + // 20: &_PyErr_Clear+0x0 + // 28: JUMP_TARGET + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&PyExc_StopIteration); + patch_64(data + 0x10, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x18, (uintptr_t)&_PyEval_MonitorRaise); + patch_64(data + 0x20, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x28, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xa7, (uintptr_t)data + 0x2c); +} + +void +emit__GET_AITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AITER.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 5: 49 8b 47 08 movq 0x8(%r15), %rax + // 9: 48 8b 48 50 movq 0x50(%rax), %rcx + // d: 48 85 c9 testq %rcx, %rcx + // 10: 74 5a je 0x6c <_JIT_ENTRY+0x6c> + // 12: 48 8b 49 08 movq 0x8(%rcx), %rcx + // 16: 48 85 c9 testq %rcx, %rcx + // 19: 74 51 je 0x6c <_JIT_ENTRY+0x6c> + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 4c 89 ff movq %r15, %rdi + // 23: ff d1 callq *%rcx + // 25: 48 89 c3 movq %rax, %rbx + // 28: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 36: 41 8b 07 movl (%r15), %eax + // 39: 85 c0 testl %eax, %eax + // 3b: 78 0b js 0x48 <_JIT_ENTRY+0x48> + // 3d: ff c8 decl %eax + // 3f: 41 89 07 movl %eax, (%r15) + // 42: 0f 84 ce 00 00 00 je 0x116 <_JIT_ENTRY+0x116> + // 48: 48 85 db testq %rbx, %rbx + // 4b: 74 60 je 0xad <_JIT_ENTRY+0xad> + // 4d: 48 8b 43 08 movq 0x8(%rbx), %rax + // 51: 48 8b 48 50 movq 0x50(%rax), %rcx + // 55: 48 85 c9 testq %rcx, %rcx + // 58: 74 5e je 0xb8 <_JIT_ENTRY+0xb8> + // 5a: 48 83 79 10 00 cmpq $0x0, 0x10(%rcx) + // 5f: 74 57 je 0xb8 <_JIT_ENTRY+0xb8> + // 61: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 65: 58 popq %rax + // 66: ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 71: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // 78: 48 8b 31 movq (%rcx), %rsi + // 7b: 48 8b 48 18 movq 0x18(%rax), %rcx + // 7f: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: R_X86_64_PC32 .L.str-0x4 + // 86: 4c 89 f7 movq %r14, %rdi + // 89: 31 c0 xorl %eax, %eax + // 8b: ff 15 00 00 00 00 callq *(%rip) # 0x91 <_JIT_ENTRY+0x91> + // 000000000000008d: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // 91: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: 41 8b 07 movl (%r15), %eax + // a2: 85 c0 testl %eax, %eax + // a4: 78 07 js 0xad <_JIT_ENTRY+0xad> + // a6: ff c8 decl %eax + // a8: 41 89 07 movl %eax, (%r15) + // ab: 74 55 je 0x102 <_JIT_ENTRY+0x102> + // ad: 49 83 c5 f8 addq $-0x8, %r13 + // b1: 58 popq %rax + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // b8: 49 83 c5 f8 addq $-0x8, %r13 + // bc: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // c1: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xc8 <_JIT_ENTRY+0xc8> + // 00000000000000c4: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // c8: 48 8b 31 movq (%rcx), %rsi + // cb: 48 8b 48 18 movq 0x18(%rax), %rcx + // cf: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0xd6 <_JIT_ENTRY+0xd6> + // 00000000000000d2: R_X86_64_PC32 .L.str.1-0x4 + // d6: 4c 89 f7 movq %r14, %rdi + // d9: 31 c0 xorl %eax, %eax + // db: ff 15 00 00 00 00 callq *(%rip) # 0xe1 <_JIT_ENTRY+0xe1> + // 00000000000000dd: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // e1: 8b 03 movl (%rbx), %eax + // e3: 85 c0 testl %eax, %eax + // e5: 78 06 js 0xed <_JIT_ENTRY+0xed> + // e7: ff c8 decl %eax + // e9: 89 03 movl %eax, (%rbx) + // eb: 74 3d je 0x12a <_JIT_ENTRY+0x12a> + // ed: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f2: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // fb: 58 popq %rax + // fc: ff 25 00 00 00 00 jmpq *(%rip) # 0x102 <_JIT_ENTRY+0x102> + // 00000000000000fe: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 102: 4c 89 ff movq %r15, %rdi + // 105: ff 15 00 00 00 00 callq *(%rip) # 0x10b <_JIT_ENTRY+0x10b> + // 0000000000000107: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 10b: 49 83 c5 f8 addq $-0x8, %r13 + // 10f: 58 popq %rax + // 110: ff 25 00 00 00 00 jmpq *(%rip) # 0x116 <_JIT_ENTRY+0x116> + // 0000000000000112: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 116: 4c 89 ff movq %r15, %rdi + // 119: ff 15 00 00 00 00 callq *(%rip) # 0x11f <_JIT_ENTRY+0x11f> + // 000000000000011b: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 11f: 48 85 db testq %rbx, %rbx + // 122: 0f 85 25 ff ff ff jne 0x4d <_JIT_ENTRY+0x4d> + // 128: eb 83 jmp 0xad <_JIT_ENTRY+0xad> + // 12a: 48 89 df movq %rbx, %rdi + // 12d: ff 15 00 00 00 00 callq *(%rip) # 0x133 <_JIT_ENTRY+0x133> + // 000000000000012f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 133: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 138: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 141: 58 popq %rax + // 142: ff 25 00 00 00 00 jmpq *(%rip) # 0x148 <_JIT_ENTRY+0x148> + // 0000000000000144: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[328] = { + 0x50, 0x4d, 0x8b, 0x7d, 0xf8, 0x49, 0x8b, 0x47, + 0x08, 0x48, 0x8b, 0x48, 0x50, 0x48, 0x85, 0xc9, + 0x74, 0x5a, 0x48, 0x8b, 0x49, 0x08, 0x48, 0x85, + 0xc9, 0x74, 0x51, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x4c, 0x89, 0xff, 0xff, 0xd1, 0x48, 0x89, 0xc3, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0b, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x0f, 0x84, 0xce, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xdb, 0x74, 0x60, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x8b, 0x48, 0x50, 0x48, 0x85, 0xc9, + 0x74, 0x5e, 0x48, 0x83, 0x79, 0x10, 0x00, 0x74, + 0x57, 0x49, 0x89, 0x5d, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x31, 0x48, 0x8b, 0x48, 0x18, 0x48, + 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x07, 0xff, 0xc8, + 0x41, 0x89, 0x07, 0x74, 0x55, 0x49, 0x83, 0xc5, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x31, 0x48, 0x8b, 0x48, 0x18, 0x48, + 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x3d, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xdb, 0x0f, 0x85, 0x25, 0xff, 0xff, 0xff, + 0xeb, 0x83, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'async for' requires an object with __aiter__ method, got %.100s\x00'async for' received an object from __aiter__ that does not implement __anext__: %.100s\x00" + // 99: 00 00 00 00 00 00 00 + // a0: CONTINUE + // a8: &PyExc_TypeError+0x0 + // b0: &_PyErr_Format+0x0 + // b8: ERROR_TARGET + // c0: &_Py_Dealloc+0x0 + const unsigned char data_body[200] = { + 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x5f, 0x5f, 0x61, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x5f, 0x5f, 0x61, + 0x69, 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, + 0x3a, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0xa0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0xa8, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0xb0, (uintptr_t)&_PyErr_Format); + patch_64(data + 0xb8, state->instruction_starts[instruction->error_target]); + patch_64(data + 0xc0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0x9c); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0xa4); + patch_32r(code + 0x82, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + 0xac); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0xb4); + patch_x86_64_32rx(code + 0xc4, (uintptr_t)data + 0xa4); + patch_32r(code + 0xd2, (uintptr_t)data + 0x3d); + patch_x86_64_32rx(code + 0xdd, (uintptr_t)data + 0xac); + patch_x86_64_32rx(code + 0xfe, (uintptr_t)data + 0xb4); + patch_x86_64_32rx(code + 0x107, (uintptr_t)data + 0xbc); + patch_x86_64_32rx(code + 0x112, (uintptr_t)data + 0xb4); + patch_x86_64_32rx(code + 0x11b, (uintptr_t)data + 0xbc); + patch_x86_64_32rx(code + 0x12f, (uintptr_t)data + 0xbc); + patch_x86_64_32rx(code + 0x144, (uintptr_t)data + 0xb4); +} + +void +emit__GET_ANEXT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ANEXT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: ff 15 00 00 00 00 callq *(%rip) # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_GOTPCRELX _PyEval_GetANext-0x4 + // 10: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 15: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 1e: 48 85 c0 testq %rax, %rax + // 21: 74 0f je 0x32 <_JIT_ENTRY+0x32> + // 23: 49 89 45 00 movq %rax, (%r13) + // 27: 49 83 c5 08 addq $0x8, %r13 + // 2b: 58 popq %rax + // 2c: ff 25 00 00 00 00 jmpq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 32: 58 popq %rax + // 33: ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[57] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_PyEval_GetANext+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_GetANext); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0xc); +} + +void +emit__GET_AWAITABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AWAITABLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 89 df movq %rbx, %rdi + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _PyEval_GetAwaitable-0x4 + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 8b 0b movl (%rbx), %ecx + // 2a: 85 c9 testl %ecx, %ecx + // 2c: 78 06 js 0x34 <_JIT_ENTRY+0x34> + // 2e: ff c9 decl %ecx + // 30: 89 0b movl %ecx, (%rbx) + // 32: 74 10 je 0x44 <_JIT_ENTRY+0x44> + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 1f je 0x58 <_JIT_ENTRY+0x58> + // 39: 49 89 45 f8 movq %rax, -0x8(%r13) + // 3d: 58 popq %rax + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 44: 48 89 df movq %rbx, %rdi + // 47: 48 89 c3 movq %rax, %rbx + // 4a: ff 15 00 00 00 00 callq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 50: 48 89 d8 movq %rbx, %rax + // 53: 48 85 c0 testq %rax, %rax + // 56: 75 e1 jne 0x39 <_JIT_ENTRY+0x39> + // 58: 49 83 c5 f8 addq $-0x8, %r13 + // 5c: 58 popq %rax + // 5d: ff 25 00 00 00 00 jmpq *(%rip) # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[99] = { + 0x50, 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0b, 0x74, 0x10, 0x48, 0x85, 0xc0, 0x74, + 0x1f, 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0x48, + 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, 0xe1, + 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_GetAwaitable+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_GetAwaitable); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0x1c); +} + +void +emit__GET_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ITER.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 48 89 df movq %rbx, %rdi + // d: ff 15 00 00 00 00 callq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX PyObject_GetIter-0x4 + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 8b 0b movl (%rbx), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 06 js 0x2d <_JIT_ENTRY+0x2d> + // 27: ff c9 decl %ecx + // 29: 89 0b movl %ecx, (%rbx) + // 2b: 74 10 je 0x3d <_JIT_ENTRY+0x3d> + // 2d: 48 85 c0 testq %rax, %rax + // 30: 74 1f je 0x51 <_JIT_ENTRY+0x51> + // 32: 49 89 45 f8 movq %rax, -0x8(%r13) + // 36: 58 popq %rax + // 37: ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3d: 48 89 df movq %rbx, %rdi + // 40: 48 89 c3 movq %rax, %rbx + // 43: ff 15 00 00 00 00 callq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 49: 48 89 d8 movq %rbx, %rax + // 4c: 48 85 c0 testq %rax, %rax + // 4f: 75 e1 jne 0x32 <_JIT_ENTRY+0x32> + // 51: 49 83 c5 f8 addq $-0x8, %r13 + // 55: 58 popq %rax + // 56: ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[92] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, + 0xc9, 0x89, 0x0b, 0x74, 0x10, 0x48, 0x85, 0xc0, + 0x74, 0x1f, 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, + 0xe1, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_GetIter+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0x14); +} + +void +emit__GET_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_LEN.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: ff 15 00 00 00 00 callq *(%rip) # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_GOTPCRELX PyObject_Size-0x4 + // 10: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 15: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 1e: 48 85 c0 testq %rax, %rax + // 21: 78 1d js 0x40 <_JIT_ENTRY+0x40> + // 23: 48 89 c7 movq %rax, %rdi + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_GOTPCRELX PyLong_FromSsize_t-0x4 + // 2c: 48 85 c0 testq %rax, %rax + // 2f: 74 0f je 0x40 <_JIT_ENTRY+0x40> + // 31: 49 89 45 00 movq %rax, (%r13) + // 35: 49 83 c5 08 addq $0x8, %r13 + // 39: 58 popq %rax + // 3a: ff 25 00 00 00 00 jmpq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 40: 58 popq %rax + // 41: ff 25 00 00 00 00 jmpq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[71] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x78, 0x1d, 0x48, 0x89, 0xc7, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_Size+0x0 + // 8: &PyLong_FromSsize_t+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Size); + patch_64(data + 0x8, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0x14); +} + +void +emit__GET_YIELD_FROM_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_YIELD_FROM_ITER.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 48 8b 43 08 movq 0x8(%rbx), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyCoro_Type-0x4 + // 10: 74 44 je 0x56 <_JIT_ENTRY+0x56> + // 12: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_REX_GOTPCRELX PyGen_Type-0x4 + // 19: 74 4a je 0x65 <_JIT_ENTRY+0x65> + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 48 89 df movq %rbx, %rdi + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX PyObject_GetIter-0x4 + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 48 85 c0 testq %rax, %rax + // 3a: 74 61 je 0x9d <_JIT_ENTRY+0x9d> + // 3c: 8b 0b movl (%rbx), %ecx + // 3e: 85 c9 testl %ecx, %ecx + // 40: 78 62 js 0xa4 <_JIT_ENTRY+0xa4> + // 42: ff c9 decl %ecx + // 44: 89 0b movl %ecx, (%rbx) + // 46: 74 6a je 0xb2 <_JIT_ENTRY+0xb2> + // 48: 48 89 c3 movq %rax, %rbx + // 4b: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 4f: 58 popq %rax + // 50: ff 25 00 00 00 00 jmpq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 56: 49 8b 04 24 movq (%r12), %rax + // 5a: 0f b7 40 30 movzwl 0x30(%rax), %eax + // 5e: a9 80 01 00 00 testl $0x180, %eax # imm = 0x180 + // 63: 74 0b je 0x70 <_JIT_ENTRY+0x70> + // 65: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 69: 58 popq %rax + // 6a: ff 25 00 00 00 00 jmpq *(%rip) # 0x70 <_JIT_ENTRY+0x70> + // 000000000000006c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 70: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 75: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // 7c: 48 8b 30 movq (%rax), %rsi + // 7f: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: R_X86_64_PC32 .L.str-0x4 + // 86: 4c 89 f7 movq %r14, %rdi + // 89: ff 15 00 00 00 00 callq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: R_X86_64_GOTPCRELX _PyErr_SetString-0x4 + // 8f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 94: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9d: 58 popq %rax + // 9e: ff 25 00 00 00 00 jmpq *(%rip) # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // a4: 48 89 c3 movq %rax, %rbx + // a7: 49 89 5d f8 movq %rbx, -0x8(%r13) + // ab: 58 popq %rax + // ac: ff 25 00 00 00 00 jmpq *(%rip) # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // b2: 48 89 df movq %rbx, %rdi + // b5: 48 89 c3 movq %rax, %rbx + // b8: ff 15 00 00 00 00 callq *(%rip) # 0xbe <_JIT_ENTRY+0xbe> + // 00000000000000ba: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // be: 49 89 5d f8 movq %rbx, -0x8(%r13) + // c2: 58 popq %rax + // c3: ff 25 00 00 00 00 jmpq *(%rip) # 0xc9 <_JIT_ENTRY+0xc9> + // 00000000000000c5: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[195] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x44, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x4a, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x61, 0x8b, 0x0b, 0x85, 0xc9, + 0x78, 0x62, 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x6a, + 0x48, 0x89, 0xc3, 0x49, 0x89, 0x5d, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x04, 0x24, 0x0f, 0xb7, 0x40, 0x30, 0xa9, 0x80, + 0x01, 0x00, 0x00, 0x74, 0x0b, 0x49, 0x89, 0x5d, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x48, + 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, 0x49, + 0x89, 0x5d, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x5d, 0xf8, 0x58, + }; + // 0: "cannot 'yield from' a coroutine object in a non-coroutine generator\x00" + // 44: 00 00 00 00 + // 48: &PyCoro_Type+0x0 + // 50: &PyGen_Type+0x0 + // 58: &PyObject_GetIter+0x0 + // 60: CONTINUE + // 68: &PyExc_TypeError+0x0 + // 70: &_PyErr_SetString+0x0 + // 78: ERROR_TARGET + // 80: &_Py_Dealloc+0x0 + const unsigned char data_body[136] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x27, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x48, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x50, (uintptr_t)&PyGen_Type); + patch_64(data + 0x58, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x68, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x70, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x78, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x80, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x64); + patch_32r(code + 0x82, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0xae, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xba, (uintptr_t)data + 0x7c); +} + +void +emit__GUARD_BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BINARY_OP_EXTEND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 5: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 15: ff 50 08 callq *0x8(%rax) + // 18: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 26: 85 c0 testl %eax, %eax + // 28: 74 07 je 0x31 <_JIT_ENTRY+0x31> + // 2a: 58 popq %rax + // 2b: ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 31: 58 popq %rax + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[56] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf0, 0x49, 0x8b, 0x75, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x50, 0x08, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0xc); +} + +void +emit__GUARD_BOTH_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyFloat_Type-0x4 + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 45 f8 movq -0x8(%r13), %rax + // 15: 48 8b 40 08 movq 0x8(%rax), %rax + // 19: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_REX_GOTPCRELX PyFloat_Type-0x4 + // 20: 74 06 je 0x28 <_JIT_ENTRY+0x28> + // 22: ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 28: ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[40] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyFloat_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_BOTH_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 45 f8 movq -0x8(%r13), %rax + // 15: 48 8b 40 08 movq 0x8(%rax), %rax + // 19: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // 20: 74 06 je 0x28 <_JIT_ENTRY+0x28> + // 22: ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 28: ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[40] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_BOTH_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_UNICODE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyUnicode_Type-0x4 + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 45 f8 movq -0x8(%r13), %rax + // 15: 48 8b 40 08 movq 0x8(%rax), %rax + // 19: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_REX_GOTPCRELX PyUnicode_Type-0x4 + // 20: 74 06 je 0x28 <_JIT_ENTRY+0x28> + // 22: ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 28: ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[40] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_BUILTINS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BUILTINS_VERSION_PUSH_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 20 movq 0x20(%r12), %rax + // 5: 48 8b 48 08 movq 0x8(%rax), %rcx + // 9: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 10: 75 1e jne 0x30 <_JIT_ENTRY+0x30> + // 12: 48 8b 40 20 movq 0x20(%rax), %rax + // 16: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1d: 39 48 0c cmpl %ecx, 0xc(%rax) + // 20: 75 0e jne 0x30 <_JIT_ENTRY+0x30> + // 22: 49 89 45 00 movq %rax, (%r13) + // 26: 49 83 c5 08 addq $0x8, %r13 + // 2a: ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 30: ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[54] = { + 0x49, 0x8b, 0x44, 0x24, 0x20, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x1e, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x39, 0x48, 0x0c, + 0x75, 0x0e, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_DORV_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_NO_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 83 78 e8 00 cmpq $0x0, -0x18(%rax) + // 9: 74 06 je 0x11 <_JIT_ENTRY+0x11> + // b: ff 25 00 00 00 00 jmpq *(%rip) # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 11: 48 8b 48 08 movq 0x8(%rax), %rcx + // 15: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 19: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 1e: 74 eb je 0xb <_JIT_ENTRY+0xb> + // 20: ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[32] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x83, 0x78, 0xe8, + 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x8b, 0x49, + 0x20, 0x80, 0x7c, 0x08, 0x03, 0x00, 0x74, 0xeb, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); +} + +void +emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 8b 49 20 movq 0x20(%rcx), %rcx + // c: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 11: 74 06 je 0x19 <_JIT_ENTRY+0x19> + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 19: ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[31] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x8b, 0x49, 0x20, 0x80, 0x7c, 0x08, 0x03, + 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_GLOBALS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 5: 48 8b 48 08 movq 0x8(%rax), %rcx + // 9: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 10: 75 16 jne 0x28 <_JIT_ENTRY+0x28> + // 12: 48 8b 40 20 movq 0x20(%rax), %rax + // 16: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1d: 39 48 0c cmpl %ecx, 0xc(%rax) + // 20: 75 06 jne 0x28 <_JIT_ENTRY+0x28> + // 22: ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 28: ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[46] = { + 0x49, 0x8b, 0x44, 0x24, 0x18, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x16, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x39, 0x48, 0x0c, + 0x75, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_GLOBALS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION_PUSH_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 5: 48 8b 48 08 movq 0x8(%rax), %rcx + // 9: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 10: 75 1e jne 0x30 <_JIT_ENTRY+0x30> + // 12: 48 8b 40 20 movq 0x20(%rax), %rax + // 16: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1d: 39 48 0c cmpl %ecx, 0xc(%rax) + // 20: 75 0e jne 0x30 <_JIT_ENTRY+0x30> + // 22: 49 89 45 00 movq %rax, (%r13) + // 26: 49 83 c5 08 addq $0x8, %r13 + // 2a: ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 30: ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[54] = { + 0x49, 0x8b, 0x44, 0x24, 0x18, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x1e, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x39, 0x48, 0x0c, + 0x75, 0x0e, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_IS_FALSE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_FALSE_POP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_IS_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NONE_POP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 10: 74 26 je 0x38 <_JIT_ENTRY+0x38> + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 8b 07 movl (%rdi), %eax + // 19: 85 c0 testl %eax, %eax + // 1b: 78 06 js 0x23 <_JIT_ENTRY+0x23> + // 1d: ff c8 decl %eax + // 1f: 89 07 movl %eax, (%rdi) + // 21: 74 1c je 0x3f <_JIT_ENTRY+0x3f> + // 23: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 28: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 31: 58 popq %rax + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 38: 58 popq %rax + // 39: ff 25 00 00 00 00 jmpq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3f: ff 15 00 00 00 00 callq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 45: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 53: 58 popq %rax + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[90] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x26, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x07, 0x74, 0x1c, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: JUMP_TARGET + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_IS_NOT_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NOT_NONE_POP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 8b 03 movl (%rbx), %eax + // 10: 85 c0 testl %eax, %eax + // 12: 78 06 js 0x1a <_JIT_ENTRY+0x1a> + // 14: ff c8 decl %eax + // 16: 89 03 movl %eax, (%rbx) + // 18: 74 1e je 0x38 <_JIT_ENTRY+0x38> + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 48 3b 1d 00 00 00 00 cmpq (%rip), %rbx # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 2f: 74 27 je 0x58 <_JIT_ENTRY+0x58> + // 31: 58 popq %rax + // 32: ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 38: 48 89 df movq %rbx, %rdi + // 3b: ff 15 00 00 00 00 callq *(%rip) # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 41: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 46: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4f: 48 3b 1d 00 00 00 00 cmpq (%rip), %rbx # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 56: 75 d9 jne 0x31 <_JIT_ENTRY+0x31> + // 58: 58 popq %rax + // 59: ff 25 00 00 00 00 jmpq *(%rip) # 0x5f <_JIT_ENTRY+0x5f> + // 000000000000005b: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[95] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, + 0x74, 0x1e, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x3b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x27, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x3b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x75, 0xd9, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_IS_TRUE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_TRUE_POP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_KEYS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_KEYS_VERSION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 8b 80 70 03 00 00 movq 0x370(%rax), %rax + // f: 8b 40 0c movl 0xc(%rax), %eax + // 12: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 18: 75 06 jne 0x20 <_JIT_ENTRY+0x20> + // 1a: ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 20: ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[38] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x8b, 0x80, 0x70, 0x03, 0x00, 0x00, 0x8b, + 0x40, 0x0c, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + 0xc); +} + +void +emit__GUARD_NOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyFloat_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyFloat_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_LIST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 18 movq 0x18(%rax), %rcx + // 8: 48 85 c9 testq %rcx, %rcx + // b: 74 10 je 0x1d <_JIT_ENTRY+0x1d> + // d: 48 8b 50 10 movq 0x10(%rax), %rdx + // 11: 48 3b 51 10 cmpq 0x10(%rcx), %rdx + // 15: 73 0c jae 0x23 <_JIT_ENTRY+0x23> + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1d: ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 23: 48 c7 40 10 ff ff ff ff movq $-0x1, 0x10(%rax) + // 2b: ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[49] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x18, + 0x48, 0x85, 0xc9, 0x74, 0x10, 0x48, 0x8b, 0x50, + 0x10, 0x48, 0x3b, 0x51, 0x10, 0x73, 0x0c, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0x40, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_RANGE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 83 78 20 00 cmpq $0x0, 0x20(%rax) + // 9: 7e 06 jle 0x11 <_JIT_ENTRY+0x11> + // b: ff 25 00 00 00 00 jmpq *(%rip) # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x83, 0x78, 0x20, + 0x00, 0x7e, 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 18 movq 0x18(%rax), %rcx + // 8: 48 85 c9 testq %rcx, %rcx + // b: 74 10 je 0x1d <_JIT_ENTRY+0x1d> + // d: 48 8b 40 10 movq 0x10(%rax), %rax + // 11: 48 3b 41 10 cmpq 0x10(%rcx), %rax + // 15: 7d 06 jge 0x1d <_JIT_ENTRY+0x1d> + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1d: ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[35] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x18, + 0x48, 0x85, 0xc9, 0x74, 0x10, 0x48, 0x8b, 0x40, + 0x10, 0x48, 0x3b, 0x41, 0x10, 0x7d, 0x06, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_TOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_FLOAT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyFloat_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyFloat_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_TOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_TYPE_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // e: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 14: 75 06 jne 0x1c <_JIT_ENTRY+0x1c> + // 16: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1c: ff 25 00 00 00 00 jmpq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[34] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x8b, 0x80, 0x80, 0x01, 0x00, 0x00, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x06, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0xc); +} + +void +emit__GUARD_TYPE_VERSION_AND_LOCK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION_AND_LOCK.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // e: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCRELX _JIT_OPERAND0-0x4 + // 14: 75 06 jne 0x1c <_JIT_ENTRY+0x1c> + // 16: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1c: ff 25 00 00 00 00 jmpq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[34] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x8b, 0x80, 0x80, 0x01, 0x00, 0x00, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x06, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0xc); +} + +void +emit__IMPORT_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_FROM.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 5: 49 8b 04 24 movq (%r12), %rax + // 9: 48 8b 40 20 movq 0x20(%rax), %rax + // d: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 14: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 19: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1e: 4c 89 f7 movq %r14, %rdi + // 21: ff 15 00 00 00 00 callq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX _PyEval_ImportFrom-0x4 + // 27: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 35: 48 85 c0 testq %rax, %rax + // 38: 74 0f je 0x49 <_JIT_ENTRY+0x49> + // 3a: 49 89 45 00 movq %rax, (%r13) + // 3e: 49 83 c5 08 addq $0x8, %r13 + // 42: 58 popq %rax + // 43: ff 25 00 00 00 00 jmpq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 49: 58 popq %rax + // 4a: ff 25 00 00 00 00 jmpq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[80] = { + 0x50, 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8b, 0x04, + 0x24, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x54, 0xc8, + 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ImportFrom+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportFrom); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0x14); +} + +void +emit__IMPORT_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_NAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 49 8b 04 24 movq (%r12), %rax + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 18: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 4c 89 f7 movq %r14, %rdi + // 25: 4c 89 e6 movq %r12, %rsi + // 28: 48 89 d9 movq %rbx, %rcx + // 2b: 49 89 e8 movq %rbp, %r8 + // 2e: ff 15 00 00 00 00 callq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: R_X86_64_GOTPCRELX _PyEval_ImportName-0x4 + // 34: 49 89 c7 movq %rax, %r15 + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 8b 45 00 movl (%rbp), %eax + // 48: 85 c0 testl %eax, %eax + // 4a: 78 10 js 0x5c <_JIT_ENTRY+0x5c> + // 4c: ff c8 decl %eax + // 4e: 89 45 00 movl %eax, (%rbp) + // 51: 75 09 jne 0x5c <_JIT_ENTRY+0x5c> + // 53: 48 89 ef movq %rbp, %rdi + // 56: ff 15 00 00 00 00 callq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5c: 8b 03 movl (%rbx), %eax + // 5e: 85 c0 testl %eax, %eax + // 60: 78 06 js 0x68 <_JIT_ENTRY+0x68> + // 62: ff c8 decl %eax + // 64: 89 03 movl %eax, (%rbx) + // 66: 74 14 je 0x7c <_JIT_ENTRY+0x7c> + // 68: 4d 85 ff testq %r15, %r15 + // 6b: 74 1d je 0x8a <_JIT_ENTRY+0x8a> + // 6d: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 71: 49 83 c5 f8 addq $-0x8, %r13 + // 75: 5d popq %rbp + // 76: ff 25 00 00 00 00 jmpq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 7c: 48 89 df movq %rbx, %rdi + // 7f: ff 15 00 00 00 00 callq *(%rip) # 0x85 <_JIT_ENTRY+0x85> + // 0000000000000081: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 85: 4d 85 ff testq %r15, %r15 + // 88: 75 e3 jne 0x6d <_JIT_ENTRY+0x6d> + // 8a: 49 83 c5 f0 addq $-0x10, %r13 + // 8e: 5d popq %rbp + // 8f: ff 25 00 00 00 00 jmpq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[149] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x54, 0xc8, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x4c, 0x89, 0xf7, 0x4c, 0x89, 0xe6, + 0x48, 0x89, 0xd9, 0x49, 0x89, 0xe8, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc7, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, + 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x89, 0x45, + 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, 0x14, + 0x4d, 0x85, 0xff, 0x74, 0x1d, 0x4d, 0x89, 0x7d, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x85, 0xff, + 0x75, 0xe3, 0x49, 0x83, 0xc5, 0xf0, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ImportName+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportName); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x1c); +} + +void +emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_BOUND_METHOD_EXACT_ARGS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // d: 29 c2 subl %eax, %edx + // f: f7 d0 notl %eax + // 11: 48 63 c8 movslq %eax, %rcx + // 14: 48 63 c2 movslq %edx, %rax + // 17: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1c: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 20: 8b 3e movl (%rsi), %edi + // 22: 85 ff testl %edi, %edi + // 24: 78 04 js 0x2a <_JIT_ENTRY+0x2a> + // 26: ff c7 incl %edi + // 28: 89 3e movl %edi, (%rsi) + // 2a: 49 89 74 cd 00 movq %rsi, (%r13,%rcx,8) + // 2f: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 34: 48 8b 4a 10 movq 0x10(%rdx), %rcx + // 38: 8b 11 movl (%rcx), %edx + // 3a: 85 d2 testl %edx, %edx + // 3c: 78 04 js 0x42 <_JIT_ENTRY+0x42> + // 3e: ff c2 incl %edx + // 40: 89 11 movl %edx, (%rcx) + // 42: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 47: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4c: 8b 07 movl (%rdi), %eax + // 4e: 85 c0 testl %eax, %eax + // 50: 78 06 js 0x58 <_JIT_ENTRY+0x58> + // 52: ff c8 decl %eax + // 54: 89 07 movl %eax, (%rdi) + // 56: 74 15 je 0x6d <_JIT_ENTRY+0x6d> + // 58: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 66: 58 popq %rax + // 67: ff 25 00 00 00 00 jmpq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6d: ff 15 00 00 00 00 callq *(%rip) # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 73: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: 58 popq %rax + // 82: ff 25 00 00 00 00 jmpq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[130] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xba, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc2, 0xf7, + 0xd0, 0x48, 0x63, 0xc8, 0x48, 0x63, 0xc2, 0x49, + 0x8b, 0x54, 0xc5, 0x00, 0x48, 0x8b, 0x72, 0x18, + 0x8b, 0x3e, 0x85, 0xff, 0x78, 0x04, 0xff, 0xc7, + 0x89, 0x3e, 0x49, 0x89, 0x74, 0xcd, 0x00, 0x49, + 0x8b, 0x7c, 0xc5, 0x00, 0x48, 0x8b, 0x4a, 0x10, + 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, + 0x89, 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 89 f0 movl %esi, %eax + // 9: f7 d0 notl %eax + // b: 48 98 cltq + // d: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 12: 29 f1 subl %esi, %ecx + // 14: 48 63 c9 movslq %ecx, %rcx + // 17: 4d 8b 54 c5 00 movq (%r13,%rax,8), %r10 + // 1c: 49 83 fa 01 cmpq $0x1, %r10 + // 20: 89 f3 movl %esi, %ebx + // 22: 83 db ff sbbl $-0x1, %ebx + // 25: 4d 8b 44 cd 00 movq (%r13,%rcx,8), %r8 + // 2a: 49 8b 78 30 movq 0x30(%r8), %rdi + // 2e: 49 8b 96 f0 00 00 00 movq 0xf0(%r14), %rdx + // 35: 4c 63 4f 4c movslq 0x4c(%rdi), %r9 + // 39: 4e 8d 0c ca leaq (%rdx,%r9,8), %r9 + // 3d: 4d 89 8e f0 00 00 00 movq %r9, 0xf0(%r14) + // 44: 4c 89 62 08 movq %r12, 0x8(%rdx) + // 48: 4c 89 42 10 movq %r8, 0x10(%rdx) + // 4c: 44 8b 0f movl (%rdi), %r9d + // 4f: 45 85 c9 testl %r9d, %r9d + // 52: 78 06 js 0x5a <_JIT_ENTRY+0x5a> + // 54: 41 ff c1 incl %r9d + // 57: 44 89 0f movl %r9d, (%rdi) + // 5a: 48 8d 04 c5 00 00 00 00 leaq (,%rax,8), %rax + // 62: 4c 01 e8 addq %r13, %rax + // 65: 48 89 3a movq %rdi, (%rdx) + // 68: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 6d: 0f 11 42 18 movups %xmm0, 0x18(%rdx) + // 71: 48 c7 42 28 00 00 00 00 movq $0x0, 0x28(%rdx) + // 79: 4c 8d 4a 50 leaq 0x50(%rdx), %r9 + // 7d: 4c 63 47 48 movslq 0x48(%rdi), %r8 + // 81: 4e 8d 5c c2 50 leaq 0x50(%rdx,%r8,8), %r11 + // 86: 4c 89 5a 40 movq %r11, 0x40(%rdx) + // 8a: 48 c7 42 30 00 00 00 00 movq $0x0, 0x30(%rdx) + // 92: 4c 8d 9f d0 00 00 00 leaq 0xd0(%rdi), %r11 + // 99: 4c 89 5a 38 movq %r11, 0x38(%rdx) + // 9d: c7 42 48 00 00 00 00 movl $0x0, 0x48(%rdx) + // a4: 41 39 d8 cmpl %ebx, %r8d + // a7: 7e 1b jle 0xc4 <_JIT_ENTRY+0xc4> + // a9: 41 89 d8 movl %ebx, %r8d + // ac: 0f 1f 40 00 nopl (%rax) + // b0: 4b c7 04 c1 00 00 00 00 movq $0x0, (%r9,%r8,8) + // b8: 49 ff c0 incq %r8 + // bb: 4c 63 5f 48 movslq 0x48(%rdi), %r11 + // bf: 4d 39 d8 cmpq %r11, %r8 + // c2: 7c ec jl 0xb0 <_JIT_ENTRY+0xb0> + // c4: 45 31 c0 xorl %r8d, %r8d + // c7: 4d 85 d2 testq %r10, %r10 + // ca: 0f 95 c3 setne %bl + // cd: 48 8b 38 movq (%rax), %rdi + // d0: 49 89 39 movq %rdi, (%r9) + // d3: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xda <_JIT_ENTRY+0xda> + // 00000000000000d6: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // da: 66 85 ff testw %di, %di + // dd: 0f 84 15 01 00 00 je 0x1f8 <_JIT_ENTRY+0x1f8> + // e3: 41 88 d8 movb %bl, %r8b + // e6: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xed <_JIT_ENTRY+0xed> + // 00000000000000e9: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // ed: 0f b7 ff movzwl %di, %edi + // f0: 66 83 ff 11 cmpw $0x11, %di + // f4: 76 2a jbe 0x120 <_JIT_ENTRY+0x120> + // f6: 45 31 db xorl %r11d, %r11d + // f9: 4d 85 d2 testq %r10, %r10 + // fc: 41 0f 95 c3 setne %r11b + // 100: 4e 8d 14 da leaq (%rdx,%r11,8), %r10 + // 104: 44 8d 3c fd 00 00 00 00 leal (,%rdi,8), %r15d + // 10c: 4d 01 fa addq %r15, %r10 + // 10f: 4d 29 ea subq %r13, %r10 + // 112: 49 83 c2 50 addq $0x50, %r10 + // 116: 49 83 fa 20 cmpq $0x20, %r10 + // 11a: 0f 83 91 00 00 00 jae 0x1b1 <_JIT_ENTRY+0x1b1> + // 120: 45 31 d2 xorl %r10d, %r10d + // 123: 48 89 fb movq %rdi, %rbx + // 126: 4d 89 d3 movq %r10, %r11 + // 129: 48 83 e3 03 andq $0x3, %rbx + // 12d: 74 21 je 0x150 <_JIT_ENTRY+0x150> + // 12f: c1 e6 03 shll $0x3, %esi + // 132: 4d 89 ef movq %r13, %r15 + // 135: 49 29 f7 subq %rsi, %r15 + // 138: 4b 8d 34 c1 leaq (%r9,%r8,8), %rsi + // 13c: 4d 89 d3 movq %r10, %r11 + // 13f: 90 nop + // 140: 4f 8b 0c df movq (%r15,%r11,8), %r9 + // 144: 4e 89 0c de movq %r9, (%rsi,%r11,8) + // 148: 49 ff c3 incq %r11 + // 14b: 48 ff cb decq %rbx + // 14e: 75 f0 jne 0x140 <_JIT_ENTRY+0x140> + // 150: 49 29 fa subq %rdi, %r10 + // 153: 49 83 fa fc cmpq $-0x4, %r10 + // 157: 0f 87 9b 00 00 00 ja 0x1f8 <_JIT_ENTRY+0x1f8> + // 15d: 44 8d 0c fd 00 00 00 00 leal (,%rdi,8), %r9d + // 165: 4c 89 ee movq %r13, %rsi + // 168: 4c 29 ce subq %r9, %rsi + // 16b: 48 83 c6 18 addq $0x18, %rsi + // 16f: 4e 8d 04 c2 leaq (%rdx,%r8,8), %r8 + // 173: 49 83 c0 68 addq $0x68, %r8 + // 177: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 180: 4e 8b 4c de e8 movq -0x18(%rsi,%r11,8), %r9 + // 185: 4f 89 4c d8 e8 movq %r9, -0x18(%r8,%r11,8) + // 18a: 4e 8b 4c de f0 movq -0x10(%rsi,%r11,8), %r9 + // 18f: 4f 89 4c d8 f0 movq %r9, -0x10(%r8,%r11,8) + // 194: 4e 8b 4c de f8 movq -0x8(%rsi,%r11,8), %r9 + // 199: 4f 89 4c d8 f8 movq %r9, -0x8(%r8,%r11,8) + // 19e: 4e 8b 0c de movq (%rsi,%r11,8), %r9 + // 1a2: 4f 89 0c d8 movq %r9, (%r8,%r11,8) + // 1a6: 49 83 c3 04 addq $0x4, %r11 + // 1aa: 4c 39 df cmpq %r11, %rdi + // 1ad: 75 d1 jne 0x180 <_JIT_ENTRY+0x180> + // 1af: eb 47 jmp 0x1f8 <_JIT_ENTRY+0x1f8> + // 1b1: 41 89 fa movl %edi, %r10d + // 1b4: 41 83 e2 fc andl $-0x4, %r10d + // 1b8: 4e 8d 1c c2 leaq (%rdx,%r8,8), %r11 + // 1bc: 49 83 c3 60 addq $0x60, %r11 + // 1c0: 4c 89 eb movq %r13, %rbx + // 1c3: 4c 29 fb subq %r15, %rbx + // 1c6: 48 83 c3 10 addq $0x10, %rbx + // 1ca: 45 31 ff xorl %r15d, %r15d + // 1cd: 0f 1f 00 nopl (%rax) + // 1d0: 42 0f 10 44 fb f0 movups -0x10(%rbx,%r15,8), %xmm0 + // 1d6: 42 0f 10 0c fb movups (%rbx,%r15,8), %xmm1 + // 1db: 43 0f 11 44 fb f0 movups %xmm0, -0x10(%r11,%r15,8) + // 1e1: 43 0f 11 0c fb movups %xmm1, (%r11,%r15,8) + // 1e6: 49 83 c7 04 addq $0x4, %r15 + // 1ea: 4d 39 fa cmpq %r15, %r10 + // 1ed: 75 e1 jne 0x1d0 <_JIT_ENTRY+0x1d0> + // 1ef: 41 39 fa cmpl %edi, %r10d + // 1f2: 0f 85 2b ff ff ff jne 0x123 <_JIT_ENTRY+0x123> + // 1f8: 49 89 54 cd 00 movq %rdx, (%r13,%rcx,8) + // 1fd: 49 89 c5 movq %rax, %r13 + // 200: ff 25 00 00 00 00 jmpq *(%rip) # 0x206 <_JIT_ENTRY+0x206> + // 0000000000000202: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[512] = { + 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0xf7, 0xd0, 0x48, 0x98, 0xb9, 0xfe, 0xff, + 0xff, 0xff, 0x29, 0xf1, 0x48, 0x63, 0xc9, 0x4d, + 0x8b, 0x54, 0xc5, 0x00, 0x49, 0x83, 0xfa, 0x01, + 0x89, 0xf3, 0x83, 0xdb, 0xff, 0x4d, 0x8b, 0x44, + 0xcd, 0x00, 0x49, 0x8b, 0x78, 0x30, 0x49, 0x8b, + 0x96, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x4f, + 0x4c, 0x4e, 0x8d, 0x0c, 0xca, 0x4d, 0x89, 0x8e, + 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x62, 0x08, + 0x4c, 0x89, 0x42, 0x10, 0x44, 0x8b, 0x0f, 0x45, + 0x85, 0xc9, 0x78, 0x06, 0x41, 0xff, 0xc1, 0x44, + 0x89, 0x0f, 0x48, 0x8d, 0x04, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x01, 0xe8, 0x48, 0x89, 0x3a, + 0x41, 0x0f, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x42, + 0x18, 0x48, 0xc7, 0x42, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x4a, 0x50, 0x4c, 0x63, 0x47, + 0x48, 0x4e, 0x8d, 0x5c, 0xc2, 0x50, 0x4c, 0x89, + 0x5a, 0x40, 0x48, 0xc7, 0x42, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x8d, 0x9f, 0xd0, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0x5a, 0x38, 0xc7, 0x42, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x39, 0xd8, 0x7e, + 0x1b, 0x41, 0x89, 0xd8, 0x0f, 0x1f, 0x40, 0x00, + 0x4b, 0xc7, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc0, 0x4c, 0x63, 0x5f, 0x48, 0x4d, + 0x39, 0xd8, 0x7c, 0xec, 0x45, 0x31, 0xc0, 0x4d, + 0x85, 0xd2, 0x0f, 0x95, 0xc3, 0x48, 0x8b, 0x38, + 0x49, 0x89, 0x39, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xff, 0x0f, 0x84, 0x15, + 0x01, 0x00, 0x00, 0x41, 0x88, 0xd8, 0x48, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xff, + 0x66, 0x83, 0xff, 0x11, 0x76, 0x2a, 0x45, 0x31, + 0xdb, 0x4d, 0x85, 0xd2, 0x41, 0x0f, 0x95, 0xc3, + 0x4e, 0x8d, 0x14, 0xda, 0x44, 0x8d, 0x3c, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0xfa, 0x4d, + 0x29, 0xea, 0x49, 0x83, 0xc2, 0x50, 0x49, 0x83, + 0xfa, 0x20, 0x0f, 0x83, 0x91, 0x00, 0x00, 0x00, + 0x45, 0x31, 0xd2, 0x48, 0x89, 0xfb, 0x4d, 0x89, + 0xd3, 0x48, 0x83, 0xe3, 0x03, 0x74, 0x21, 0xc1, + 0xe6, 0x03, 0x4d, 0x89, 0xef, 0x49, 0x29, 0xf7, + 0x4b, 0x8d, 0x34, 0xc1, 0x4d, 0x89, 0xd3, 0x90, + 0x4f, 0x8b, 0x0c, 0xdf, 0x4e, 0x89, 0x0c, 0xde, + 0x49, 0xff, 0xc3, 0x48, 0xff, 0xcb, 0x75, 0xf0, + 0x49, 0x29, 0xfa, 0x49, 0x83, 0xfa, 0xfc, 0x0f, + 0x87, 0x9b, 0x00, 0x00, 0x00, 0x44, 0x8d, 0x0c, + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, + 0x4c, 0x29, 0xce, 0x48, 0x83, 0xc6, 0x18, 0x4e, + 0x8d, 0x04, 0xc2, 0x49, 0x83, 0xc0, 0x68, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x8b, 0x4c, 0xde, 0xe8, 0x4f, 0x89, 0x4c, + 0xd8, 0xe8, 0x4e, 0x8b, 0x4c, 0xde, 0xf0, 0x4f, + 0x89, 0x4c, 0xd8, 0xf0, 0x4e, 0x8b, 0x4c, 0xde, + 0xf8, 0x4f, 0x89, 0x4c, 0xd8, 0xf8, 0x4e, 0x8b, + 0x0c, 0xde, 0x4f, 0x89, 0x0c, 0xd8, 0x49, 0x83, + 0xc3, 0x04, 0x4c, 0x39, 0xdf, 0x75, 0xd1, 0xeb, + 0x47, 0x41, 0x89, 0xfa, 0x41, 0x83, 0xe2, 0xfc, + 0x4e, 0x8d, 0x1c, 0xc2, 0x49, 0x83, 0xc3, 0x60, + 0x4c, 0x89, 0xeb, 0x4c, 0x29, 0xfb, 0x48, 0x83, + 0xc3, 0x10, 0x45, 0x31, 0xff, 0x0f, 0x1f, 0x00, + 0x42, 0x0f, 0x10, 0x44, 0xfb, 0xf0, 0x42, 0x0f, + 0x10, 0x0c, 0xfb, 0x43, 0x0f, 0x11, 0x44, 0xfb, + 0xf0, 0x43, 0x0f, 0x11, 0x0c, 0xfb, 0x49, 0x83, + 0xc7, 0x04, 0x4d, 0x39, 0xfa, 0x75, 0xe1, 0x41, + 0x39, 0xfa, 0x0f, 0x85, 0x2b, 0xff, 0xff, 0xff, + 0x49, 0x89, 0x54, 0xcd, 0x00, 0x49, 0x89, 0xc5, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + -0x4); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_0.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 f0 movq -0x10(%r13), %r8 + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 31 ff xorl %edi, %edi + // a: 48 85 f6 testq %rsi, %rsi + // d: 40 0f 95 c7 setne %dil + // 11: 49 8b 50 30 movq 0x30(%r8), %rdx + // 15: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1c: 48 63 42 4c movslq 0x4c(%rdx), %rax + // 20: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 24: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2b: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 2f: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 33: 8b 02 movl (%rdx), %eax + // 35: 85 c0 testl %eax, %eax + // 37: 78 04 js 0x3d <_JIT_ENTRY+0x3d> + // 39: ff c0 incl %eax + // 3b: 89 02 movl %eax, (%rdx) + // 3d: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 41: 48 89 11 movq %rdx, (%rcx) + // 44: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 49: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 4d: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 55: 4c 63 42 48 movslq 0x48(%rdx), %r8 + // 59: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 5e: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 62: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 6a: 4c 8d 8a d0 00 00 00 leaq 0xd0(%rdx), %r9 + // 71: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 75: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 7c: 41 39 f8 cmpl %edi, %r8d + // 7f: 7e 23 jle 0xa4 <_JIT_ENTRY+0xa4> + // 81: 48 8d 79 50 leaq 0x50(%rcx), %rdi + // 85: 45 31 c0 xorl %r8d, %r8d + // 88: 48 85 f6 testq %rsi, %rsi + // 8b: 41 0f 95 c0 setne %r8b + // 8f: 90 nop + // 90: 4a c7 04 c7 00 00 00 00 movq $0x0, (%rdi,%r8,8) + // 98: 49 ff c0 incq %r8 + // 9b: 48 63 72 48 movslq 0x48(%rdx), %rsi + // 9f: 49 39 f0 cmpq %rsi, %r8 + // a2: 7c ec jl 0x90 <_JIT_ENTRY+0x90> + // a4: 49 8b 55 f8 movq -0x8(%r13), %rdx + // a8: 48 89 51 50 movq %rdx, 0x50(%rcx) + // ac: 49 89 4d f0 movq %rcx, -0x10(%r13) + // b0: 49 89 c5 movq %rax, %r13 + // b3: ff 25 00 00 00 00 jmpq *(%rip) # 0xb9 <_JIT_ENTRY+0xb9> + // 00000000000000b5: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[179] = { + 0x4d, 0x8b, 0x45, 0xf0, 0x49, 0x8b, 0x75, 0xf8, + 0x31, 0xff, 0x48, 0x85, 0xf6, 0x40, 0x0f, 0x95, + 0xc7, 0x49, 0x8b, 0x50, 0x30, 0x49, 0x8b, 0x8e, + 0xf0, 0x00, 0x00, 0x00, 0x48, 0x63, 0x42, 0x4c, + 0x48, 0x8d, 0x04, 0xc1, 0x49, 0x89, 0x86, 0xf0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x61, 0x08, 0x4c, + 0x89, 0x41, 0x10, 0x8b, 0x02, 0x85, 0xc0, 0x78, + 0x04, 0xff, 0xc0, 0x89, 0x02, 0x49, 0x8d, 0x45, + 0xf8, 0x48, 0x89, 0x11, 0x41, 0x0f, 0x10, 0x40, + 0x10, 0x0f, 0x11, 0x41, 0x18, 0x48, 0xc7, 0x41, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x42, + 0x48, 0x4e, 0x8d, 0x4c, 0xc1, 0x50, 0x4c, 0x89, + 0x49, 0x40, 0x48, 0xc7, 0x41, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x8d, 0x8a, 0xd0, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0x49, 0x38, 0xc7, 0x41, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x39, 0xf8, 0x7e, + 0x23, 0x48, 0x8d, 0x79, 0x50, 0x45, 0x31, 0xc0, + 0x48, 0x85, 0xf6, 0x41, 0x0f, 0x95, 0xc0, 0x90, + 0x4a, 0xc7, 0x04, 0xc7, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc0, 0x48, 0x63, 0x72, 0x48, 0x49, + 0x39, 0xf0, 0x7c, 0xec, 0x49, 0x8b, 0x55, 0xf8, + 0x48, 0x89, 0x51, 0x50, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 e8 movq -0x18(%r13), %r8 + // 4: 49 8b 55 f0 movq -0x10(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 01 00 00 00 movl $0x1, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 4c: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 50: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 58: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 5c: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 61: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 65: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 6d: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 74: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 78: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 7f: 41 39 f8 cmpl %edi, %r8d + // 82: 7e 20 jle 0xa4 <_JIT_ENTRY+0xa4> + // 84: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 88: 89 ff movl %edi, %edi + // 8a: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <_JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 f0 movq -0x10(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 f8 movq -0x8(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 89 4d e8 movq %rcx, -0x18(%r13) + // c2: 49 89 c5 movq %rax, %r13 + // c5: ff 25 00 00 00 00 jmpq *(%rip) # 0xcb <_JIT_ENTRY+0xcb> + // 00000000000000c7: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[197] = { + 0x4d, 0x8b, 0x45, 0xe8, 0x49, 0x8b, 0x55, 0xf0, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x01, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x89, 0x31, 0x41, + 0x0f, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x41, 0x18, + 0x48, 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x4c, 0xc1, + 0x50, 0x4c, 0x89, 0x49, 0x40, 0x48, 0xc7, 0x41, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x8e, + 0xd0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x49, 0x38, + 0xc7, 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x39, 0xf8, 0x7e, 0x20, 0x4c, 0x8d, 0x41, 0x50, + 0x89, 0xff, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xf0, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x89, + 0x4d, 0xe8, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_2.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 e0 movq -0x20(%r13), %r8 + // 4: 49 8b 55 e8 movq -0x18(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 02 00 00 00 movl $0x2, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 e8 leaq -0x18(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 4c: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 50: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 58: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 5c: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 61: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 65: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 6d: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 74: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 78: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 7f: 41 39 f8 cmpl %edi, %r8d + // 82: 7e 20 jle 0xa4 <_JIT_ENTRY+0xa4> + // 84: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 88: 89 ff movl %edi, %edi + // 8a: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <_JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 e8 movq -0x18(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 f0 movq -0x10(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // c7: 49 89 4d e0 movq %rcx, -0x20(%r13) + // cb: 49 89 c5 movq %rax, %r13 + // ce: ff 25 00 00 00 00 jmpq *(%rip) # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[206] = { + 0x4d, 0x8b, 0x45, 0xe0, 0x49, 0x8b, 0x55, 0xe8, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x02, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xe8, 0x48, 0x89, 0x31, 0x41, + 0x0f, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x41, 0x18, + 0x48, 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x4c, 0xc1, + 0x50, 0x4c, 0x89, 0x49, 0x40, 0x48, 0xc7, 0x41, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x8e, + 0xd0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x49, 0x38, + 0xc7, 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x39, 0xf8, 0x7e, 0x20, 0x4c, 0x8d, 0x41, 0x50, + 0x89, 0xff, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xe8, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x89, 0x4d, 0xe0, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_3.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 d8 movq -0x28(%r13), %r8 + // 4: 49 8b 55 e0 movq -0x20(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 03 00 00 00 movl $0x3, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 e0 leaq -0x20(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 4c: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 50: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 58: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 5c: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 61: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 65: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 6d: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 74: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 78: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 7f: 41 39 f8 cmpl %edi, %r8d + // 82: 7e 20 jle 0xa4 <_JIT_ENTRY+0xa4> + // 84: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 88: 89 ff movl %edi, %edi + // 8a: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <_JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 e0 movq -0x20(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 e8 movq -0x18(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 8b 55 f0 movq -0x10(%r13), %rdx + // c2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // c7: 49 8b 55 f8 movq -0x8(%r13), %rdx + // cb: 48 89 54 f1 60 movq %rdx, 0x60(%rcx,%rsi,8) + // d0: 49 89 4d d8 movq %rcx, -0x28(%r13) + // d4: 49 89 c5 movq %rax, %r13 + // d7: ff 25 00 00 00 00 jmpq *(%rip) # 0xdd <_JIT_ENTRY+0xdd> + // 00000000000000d9: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[215] = { + 0x4d, 0x8b, 0x45, 0xd8, 0x49, 0x8b, 0x55, 0xe0, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x03, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xe0, 0x48, 0x89, 0x31, 0x41, + 0x0f, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x41, 0x18, + 0x48, 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x4c, 0xc1, + 0x50, 0x4c, 0x89, 0x49, 0x40, 0x48, 0xc7, 0x41, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x8e, + 0xd0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x49, 0x38, + 0xc7, 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x39, 0xf8, 0x7e, 0x20, 0x4c, 0x8d, 0x41, 0x50, + 0x89, 0xff, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xe0, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xe8, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x60, + 0x49, 0x89, 0x4d, 0xd8, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_4.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 d0 movq -0x30(%r13), %r8 + // 4: 49 8b 55 d8 movq -0x28(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 04 00 00 00 movl $0x4, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 f0 00 00 00 movq %rax, 0xf0(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 d8 leaq -0x28(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 41 0f 10 40 10 movups 0x10(%r8), %xmm0 + // 4c: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 50: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 58: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 5c: 4e 8d 4c c1 50 leaq 0x50(%rcx,%r8,8), %r9 + // 61: 4c 89 49 40 movq %r9, 0x40(%rcx) + // 65: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 6d: 4c 8d 8e d0 00 00 00 leaq 0xd0(%rsi), %r9 + // 74: 4c 89 49 38 movq %r9, 0x38(%rcx) + // 78: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 7f: 41 39 f8 cmpl %edi, %r8d + // 82: 7e 20 jle 0xa4 <_JIT_ENTRY+0xa4> + // 84: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 88: 89 ff movl %edi, %edi + // 8a: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // 90: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // 98: 48 ff c7 incq %rdi + // 9b: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // 9f: 4c 39 cf cmpq %r9, %rdi + // a2: 7c ec jl 0x90 <_JIT_ENTRY+0x90> + // a4: 31 f6 xorl %esi, %esi + // a6: 48 85 d2 testq %rdx, %rdx + // a9: 40 0f 95 c6 setne %sil + // ad: 49 8b 55 d8 movq -0x28(%r13), %rdx + // b1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // b5: 49 8b 55 e0 movq -0x20(%r13), %rdx + // b9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // be: 49 8b 55 e8 movq -0x18(%r13), %rdx + // c2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // c7: 49 8b 55 f0 movq -0x10(%r13), %rdx + // cb: 48 89 54 f1 60 movq %rdx, 0x60(%rcx,%rsi,8) + // d0: 49 8b 55 f8 movq -0x8(%r13), %rdx + // d4: 48 89 54 f1 68 movq %rdx, 0x68(%rcx,%rsi,8) + // d9: 49 89 4d d0 movq %rcx, -0x30(%r13) + // dd: 49 89 c5 movq %rax, %r13 + // e0: ff 25 00 00 00 00 jmpq *(%rip) # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[224] = { + 0x4d, 0x8b, 0x45, 0xd0, 0x49, 0x8b, 0x55, 0xd8, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x04, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xd8, 0x48, 0x89, 0x31, 0x41, + 0x0f, 0x10, 0x40, 0x10, 0x0f, 0x11, 0x41, 0x18, + 0x48, 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x4c, 0xc1, + 0x50, 0x4c, 0x89, 0x49, 0x40, 0x48, 0xc7, 0x41, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x8e, + 0xd0, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x49, 0x38, + 0xc7, 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x39, 0xf8, 0x7e, 0x20, 0x4c, 0x8d, 0x41, 0x50, + 0x89, 0xff, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xd8, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xe0, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xe8, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x8b, 0x55, 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x60, + 0x49, 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, + 0x68, 0x49, 0x89, 0x4d, 0xd0, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__IS_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_NONE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // c: 74 1e je 0x2c <_JIT_ENTRY+0x2c> + // e: 8b 07 movl (%rdi), %eax + // 10: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 17: 85 c0 testl %eax, %eax + // 19: 78 06 js 0x21 <_JIT_ENTRY+0x21> + // 1b: ff c8 decl %eax + // 1d: 89 07 movl %eax, (%rdi) + // 1f: 74 1d je 0x3e <_JIT_ENTRY+0x3e> + // 21: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 25: 58 popq %rax + // 26: ff 25 00 00 00 00 jmpq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 2c: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 33: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 48: 58 popq %rax + // 49: ff 25 00 00 00 00 jmpq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[73] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x3b, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x1e, 0x8b, 0x07, + 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x1d, 0x49, 0x89, 0x5d, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0xf8, + 0x58, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: CONTINUE + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x1c); +} + +void +emit__IS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_OP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 5: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 9: 8b 03 movl (%rbx), %eax + // b: 85 c0 testl %eax, %eax + // d: 78 0f js 0x1e <_JIT_ENTRY+0x1e> + // f: ff c8 decl %eax + // 11: 89 03 movl %eax, (%rbx) + // 13: 75 09 jne 0x1e <_JIT_ENTRY+0x1e> + // 15: 48 89 df movq %rbx, %rdi + // 18: ff 15 00 00 00 00 callq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 1e: 41 8b 07 movl (%r15), %eax + // 21: 85 c0 testl %eax, %eax + // 23: 78 10 js 0x35 <_JIT_ENTRY+0x35> + // 25: ff c8 decl %eax + // 27: 41 89 07 movl %eax, (%r15) + // 2a: 75 09 jne 0x35 <_JIT_ENTRY+0x35> + // 2c: 4c 89 ff movq %r15, %rdi + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 35: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 39: 31 c9 xorl %ecx, %ecx + // 3b: 4c 39 fb cmpq %r15, %rbx + // 3e: 0f 94 c1 sete %cl + // 41: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 48: 66 39 d1 cmpw %dx, %cx + // 4b: 75 15 jne 0x62 <_JIT_ENTRY+0x62> + // 4d: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 54: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 58: 49 89 c5 movq %rax, %r13 + // 5b: 58 popq %rax + // 5c: ff 25 00 00 00 00 jmpq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 62: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 69: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 6d: 49 89 c5 movq %rax, %r13 + // 70: 58 popq %rax + // 71: ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[113] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf0, 0x4d, 0x8b, 0x7d, + 0xf8, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x41, + 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, 0xff, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, + 0xf8, 0x31, 0xc9, 0x4c, 0x39, 0xfb, 0x0f, 0x94, + 0xc1, 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x39, 0xd1, 0x75, 0x15, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, + 0x58, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: &_Py_TrueStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x1c); +} + +void +emit__ITER_CHECK_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_LIST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyListIter_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyListIter_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyListIter_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__ITER_CHECK_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_RANGE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyRangeIter_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyRangeIter_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyRangeIter_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__ITER_CHECK_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyTupleIter_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTupleIter_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTupleIter_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__ITER_NEXT_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_LIST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 10 movq 0x10(%rax), %rcx + // 8: 48 8b 50 18 movq 0x18(%rax), %rdx + // c: 48 8b 52 18 movq 0x18(%rdx), %rdx + // 10: 48 8d 71 01 leaq 0x1(%rcx), %rsi + // 14: 48 89 70 10 movq %rsi, 0x10(%rax) + // 18: 48 8b 04 ca movq (%rdx,%rcx,8), %rax + // 1c: 8b 08 movl (%rax), %ecx + // 1e: 85 c9 testl %ecx, %ecx + // 20: 78 04 js 0x26 <_JIT_ENTRY+0x26> + // 22: ff c1 incl %ecx + // 24: 89 08 movl %ecx, (%rax) + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[46] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x10, + 0x48, 0x8b, 0x50, 0x18, 0x48, 0x8b, 0x52, 0x18, + 0x48, 0x8d, 0x71, 0x01, 0x48, 0x89, 0x70, 0x10, + 0x48, 0x8b, 0x04, 0xca, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__ITER_NEXT_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_RANGE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 48 8b 78 10 movq 0x10(%rax), %rdi + // 9: 48 8b 48 18 movq 0x18(%rax), %rcx + // d: 48 01 f9 addq %rdi, %rcx + // 10: 48 89 48 10 movq %rcx, 0x10(%rax) + // 14: 48 ff 48 20 decq 0x20(%rax) + // 18: ff 15 00 00 00 00 callq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_GOTPCRELX PyLong_FromLong-0x4 + // 1e: 48 85 c0 testq %rax, %rax + // 21: 74 0f je 0x32 <_JIT_ENTRY+0x32> + // 23: 49 89 45 00 movq %rax, (%r13) + // 27: 49 83 c5 08 addq $0x8, %r13 + // 2b: 58 popq %rax + // 2c: ff 25 00 00 00 00 jmpq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 32: 58 popq %rax + // 33: ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[57] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x78, + 0x10, 0x48, 0x8b, 0x48, 0x18, 0x48, 0x01, 0xf9, + 0x48, 0x89, 0x48, 0x10, 0x48, 0xff, 0x48, 0x20, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyLong_FromLong+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_FromLong); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0xc); +} + +void +emit__ITER_NEXT_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 10 movq 0x10(%rax), %rcx + // 8: 48 8b 50 18 movq 0x18(%rax), %rdx + // c: 48 8d 71 01 leaq 0x1(%rcx), %rsi + // 10: 48 89 70 10 movq %rsi, 0x10(%rax) + // 14: 48 8b 44 ca 18 movq 0x18(%rdx,%rcx,8), %rax + // 19: 8b 08 movl (%rax), %ecx + // 1b: 85 c9 testl %ecx, %ecx + // 1d: 78 04 js 0x23 <_JIT_ENTRY+0x23> + // 1f: ff c1 incl %ecx + // 21: 89 08 movl %ecx, (%rax) + // 23: 49 89 45 00 movq %rax, (%r13) + // 27: 49 83 c5 08 addq $0x8, %r13 + // 2b: ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[43] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x10, + 0x48, 0x8b, 0x50, 0x18, 0x48, 0x8d, 0x71, 0x01, + 0x48, 0x89, 0x70, 0x10, 0x48, 0x8b, 0x44, 0xca, + 0x18, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__JUMP_TO_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _JUMP_TO_TOP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: ff 25 00 00 00 00 jmpq *(%rip) # 0x6 <_JIT_ENTRY+0x6> + // 0000000000000002: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[6] = { + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2, (uintptr_t)data + -0x4); +} + +void +emit__LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_APPEND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 e8 movq %r13, %rax + // 4: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0xa <_JIT_ENTRY+0xa> + // 0000000000000006: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // a: f7 d1 notl %ecx + // c: 49 83 c5 f8 addq $-0x8, %r13 + // 10: 48 8b 70 f8 movq -0x8(%rax), %rsi + // 14: c1 e1 03 shll $0x3, %ecx + // 17: 48 81 c9 00 00 f8 ff orq $-0x80000, %rcx # imm = 0xFFF80000 + // 1e: 48 8b 3c 08 movq (%rax,%rcx), %rdi + // 22: 48 8b 47 10 movq 0x10(%rdi), %rax + // 26: 48 39 47 20 cmpq %rax, 0x20(%rdi) + // 2a: 7e 16 jle 0x42 <_JIT_ENTRY+0x42> + // 2c: 48 8b 4f 18 movq 0x18(%rdi), %rcx + // 30: 48 89 34 c1 movq %rsi, (%rcx,%rax,8) + // 34: 48 ff c0 incq %rax + // 37: 48 89 47 10 movq %rax, 0x10(%rdi) + // 3b: 58 popq %rax + // 3c: ff 25 00 00 00 00 jmpq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 42: ff 15 00 00 00 00 callq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: R_X86_64_GOTPCRELX _PyList_AppendTakeRefListResize-0x4 + // 48: 85 c0 testl %eax, %eax + // 4a: 78 07 js 0x53 <_JIT_ENTRY+0x53> + // 4c: 58 popq %rax + // 4d: ff 25 00 00 00 00 jmpq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 53: 58 popq %rax + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[90] = { + 0x50, 0x4c, 0x89, 0xe8, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd1, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x8b, 0x70, 0xf8, 0xc1, 0xe1, 0x03, 0x48, + 0x81, 0xc9, 0x00, 0x00, 0xf8, 0xff, 0x48, 0x8b, + 0x3c, 0x08, 0x48, 0x8b, 0x47, 0x10, 0x48, 0x39, + 0x47, 0x20, 0x7e, 0x16, 0x48, 0x8b, 0x4f, 0x18, + 0x48, 0x89, 0x34, 0xc1, 0x48, 0xff, 0xc0, 0x48, + 0x89, 0x47, 0x10, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x07, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_PyList_AppendTakeRefListResize+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_PyList_AppendTakeRefListResize); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x14); +} + +void +emit__LIST_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_EXTEND.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 8b 05 00 00 00 00 movl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 7: f7 d0 notl %eax + // 9: 49 8b 5d f8 movq -0x8(%r13), %rbx + // d: c1 e0 03 shll $0x3, %eax + // 10: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 16: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 48 89 de movq %rbx, %rsi + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX _PyList_Extend-0x4 + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 48 85 c0 testq %rax, %rax + // 3a: 74 1b je 0x57 <_JIT_ENTRY+0x57> + // 3c: 8b 03 movl (%rbx), %eax + // 3e: 85 c0 testl %eax, %eax + // 40: 78 0a js 0x4c <_JIT_ENTRY+0x4c> + // 42: ff c8 decl %eax + // 44: 89 03 movl %eax, (%rbx) + // 46: 0f 84 a0 00 00 00 je 0xec <_JIT_ENTRY+0xec> + // 4c: 49 83 c5 f8 addq $-0x8, %r13 + // 50: 58 popq %rax + // 51: ff 25 00 00 00 00 jmpq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 57: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5c: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // 63: 49 8b 37 movq (%r15), %rsi + // 66: 4c 89 f7 movq %r14, %rdi + // 69: ff 15 00 00 00 00 callq *(%rip) # 0x6f <_JIT_ENTRY+0x6f> + // 000000000000006b: R_X86_64_GOTPCRELX _PyErr_ExceptionMatches-0x4 + // 6f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 74: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7d: 85 c0 testl %eax, %eax + // 7f: 74 54 je 0xd5 <_JIT_ENTRY+0xd5> + // 81: 48 8b 43 08 movq 0x8(%rbx), %rax + // 85: 48 83 b8 d8 00 00 00 00 cmpq $0x0, 0xd8(%rax) + // 8d: 75 46 jne 0xd5 <_JIT_ENTRY+0xd5> + // 8f: 48 89 df movq %rbx, %rdi + // 92: ff 15 00 00 00 00 callq *(%rip) # 0x98 <_JIT_ENTRY+0x98> + // 0000000000000094: R_X86_64_GOTPCRELX PySequence_Check-0x4 + // 98: 85 c0 testl %eax, %eax + // 9a: 75 39 jne 0xd5 <_JIT_ENTRY+0xd5> + // 9c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a1: 4c 89 f7 movq %r14, %rdi + // a4: ff 15 00 00 00 00 callq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: R_X86_64_GOTPCRELX _PyErr_Clear-0x4 + // aa: 49 8b 37 movq (%r15), %rsi + // ad: 48 8b 43 08 movq 0x8(%rbx), %rax + // b1: 48 8b 48 18 movq 0x18(%rax), %rcx + // b5: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000b8: R_X86_64_PC32 .L.str-0x4 + // bc: 4c 89 f7 movq %r14, %rdi + // bf: 31 c0 xorl %eax, %eax + // c1: ff 15 00 00 00 00 callq *(%rip) # 0xc7 <_JIT_ENTRY+0xc7> + // 00000000000000c3: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // c7: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // cc: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d5: 8b 03 movl (%rbx), %eax + // d7: 85 c0 testl %eax, %eax + // d9: 78 06 js 0xe1 <_JIT_ENTRY+0xe1> + // db: ff c8 decl %eax + // dd: 89 03 movl %eax, (%rbx) + // df: 74 1f je 0x100 <_JIT_ENTRY+0x100> + // e1: 49 83 c5 f8 addq $-0x8, %r13 + // e5: 58 popq %rax + // e6: ff 25 00 00 00 00 jmpq *(%rip) # 0xec <_JIT_ENTRY+0xec> + // 00000000000000e8: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // ec: 48 89 df movq %rbx, %rdi + // ef: ff 15 00 00 00 00 callq *(%rip) # 0xf5 <_JIT_ENTRY+0xf5> + // 00000000000000f1: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // f5: 49 83 c5 f8 addq $-0x8, %r13 + // f9: 58 popq %rax + // fa: ff 25 00 00 00 00 jmpq *(%rip) # 0x100 <_JIT_ENTRY+0x100> + // 00000000000000fc: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 100: 48 89 df movq %rbx, %rdi + // 103: ff 15 00 00 00 00 callq *(%rip) # 0x109 <_JIT_ENTRY+0x109> + // 0000000000000105: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 109: 49 83 c5 f8 addq $-0x8, %r13 + // 10d: 58 popq %rax + // 10e: ff 25 00 00 00 00 jmpq *(%rip) # 0x114 <_JIT_ENTRY+0x114> + // 0000000000000110: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[276] = { + 0x50, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf7, + 0xd0, 0x49, 0x8b, 0x5d, 0xf8, 0xc1, 0xe0, 0x03, + 0x48, 0x0d, 0x00, 0x00, 0xf8, 0xff, 0x49, 0x8b, + 0x7c, 0x05, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x1b, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x0a, 0xff, 0xc8, 0x89, 0x03, 0x0f, 0x84, + 0xa0, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x37, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, + 0x54, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x83, 0xb8, + 0xd8, 0x00, 0x00, 0x00, 0x00, 0x75, 0x46, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x75, 0x39, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x37, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x8b, 0x48, 0x18, 0x48, 0x8d, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, 0x31, + 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x1f, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'Value after * must be an iterable, not %.200s\x00' + // 2e: 00 00 + // 30: OPARG + // 38: &_PyList_Extend+0x0 + // 40: CONTINUE + // 48: &PyExc_TypeError+0x0 + // 50: &_PyErr_ExceptionMatches+0x0 + // 58: &PySequence_Check+0x0 + // 60: &_PyErr_Clear+0x0 + // 68: &_PyErr_Format+0x0 + // 70: ERROR_TARGET + // 78: &_Py_Dealloc+0x0 + const unsigned char data_body[128] = { + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, + 0x2e, 0x32, 0x30, 0x30, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, instruction->oparg); + patch_64(data + 0x38, (uintptr_t)&_PyList_Extend); + patch_64(data + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x48, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x50, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x58, (uintptr_t)&PySequence_Check); + patch_64(data + 0x60, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x68, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x70, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x78, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x94, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)data + 0x5c); + patch_32r(code + 0xb8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xc3, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xe8, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0xf1, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0xfc, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x105, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0x110, (uintptr_t)data + 0x6c); +} + +void +emit__LOAD_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4d 89 ef movq %r13, %r15 + // 8: 8b 2d 00 00 00 00 movl (%rip), %ebp # 0xe <_JIT_ENTRY+0xe> + // 000000000000000a: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // e: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 12: 49 8b 04 24 movq (%r12), %rax + // 16: 48 8b 40 20 movq 0x20(%rax), %rax + // 1a: 89 e9 movl %ebp, %ecx + // 1c: 81 e1 fe ff 00 00 andl $0xfffe, %ecx # imm = 0xFFFE + // 22: 48 8b 74 88 18 movq 0x18(%rax,%rcx,4), %rsi + // 27: 83 e5 01 andl $0x1, %ebp + // 2a: 75 32 jne 0x5e <_JIT_ENTRY+0x5e> + // 2c: 4d 89 7c 24 40 movq %r15, 0x40(%r12) + // 31: 48 89 df movq %rbx, %rdi + // 34: ff 15 00 00 00 00 callq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_GOTPCRELX PyObject_GetAttr-0x4 + // 3a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 48: 8b 0b movl (%rbx), %ecx + // 4a: 85 c9 testl %ecx, %ecx + // 4c: 78 06 js 0x54 <_JIT_ENTRY+0x54> + // 4e: ff c9 decl %ecx + // 50: 89 0b movl %ecx, (%rbx) + // 52: 74 79 je 0xcd <_JIT_ENTRY+0xcd> + // 54: 48 85 c0 testq %rax, %rax + // 57: 75 5e jne 0xb7 <_JIT_ENTRY+0xb7> + // 59: e9 83 00 00 00 jmp 0xe1 <_JIT_ENTRY+0xe1> + // 5e: 48 c7 44 24 08 00 00 00 00 movq $0x0, 0x8(%rsp) + // 67: 4d 89 7c 24 40 movq %r15, 0x40(%r12) + // 6c: 48 8d 54 24 08 leaq 0x8(%rsp), %rdx + // 71: 48 89 df movq %rbx, %rdi + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: R_X86_64_GOTPCRELX _PyObject_GetMethod-0x4 + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 85 c0 testl %eax, %eax + // 8a: 74 07 je 0x93 <_JIT_ENTRY+0x93> + // 8c: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // 91: eb 21 jmp 0xb4 <_JIT_ENTRY+0xb4> + // 93: 8b 03 movl (%rbx), %eax + // 95: 85 c0 testl %eax, %eax + // 97: 78 0f js 0xa8 <_JIT_ENTRY+0xa8> + // 99: ff c8 decl %eax + // 9b: 89 03 movl %eax, (%rbx) + // 9d: 75 09 jne 0xa8 <_JIT_ENTRY+0xa8> + // 9f: 48 89 df movq %rbx, %rdi + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a8: 48 8b 44 24 08 movq 0x8(%rsp), %rax + // ad: 48 85 c0 testq %rax, %rax + // b0: 74 2f je 0xe1 <_JIT_ENTRY+0xe1> + // b2: 31 db xorl %ebx, %ebx + // b4: 49 89 1f movq %rbx, (%r15) + // b7: 49 89 45 f8 movq %rax, -0x8(%r13) + // bb: 89 e8 movl %ebp, %eax + // bd: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // c2: 48 83 c4 10 addq $0x10, %rsp + // c6: 5d popq %rbp + // c7: ff 25 00 00 00 00 jmpq *(%rip) # 0xcd <_JIT_ENTRY+0xcd> + // 00000000000000c9: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // cd: 48 89 df movq %rbx, %rdi + // d0: 48 89 c3 movq %rax, %rbx + // d3: ff 15 00 00 00 00 callq *(%rip) # 0xd9 <_JIT_ENTRY+0xd9> + // 00000000000000d5: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // d9: 48 89 d8 movq %rbx, %rax + // dc: 48 85 c0 testq %rax, %rax + // df: 75 d6 jne 0xb7 <_JIT_ENTRY+0xb7> + // e1: 49 83 c5 f8 addq $-0x8, %r13 + // e5: 48 83 c4 10 addq $0x10, %rsp + // e9: 5d popq %rbp + // ea: ff 25 00 00 00 00 jmpq *(%rip) # 0xf0 <_JIT_ENTRY+0xf0> + // 00000000000000ec: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[240] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4d, 0x89, 0xef, + 0x8b, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, + 0x40, 0x20, 0x89, 0xe9, 0x81, 0xe1, 0xfe, 0xff, + 0x00, 0x00, 0x48, 0x8b, 0x74, 0x88, 0x18, 0x83, + 0xe5, 0x01, 0x75, 0x32, 0x4d, 0x89, 0x7c, 0x24, + 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0b, 0x74, 0x79, 0x48, 0x85, 0xc0, 0x75, + 0x5e, 0xe9, 0x83, 0x00, 0x00, 0x00, 0x48, 0xc7, + 0x44, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0x7c, 0x24, 0x40, 0x48, 0x8d, 0x54, 0x24, + 0x08, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x07, 0x48, 0x8b, 0x44, 0x24, + 0x08, 0xeb, 0x21, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x08, 0x48, 0x85, 0xc0, + 0x74, 0x2f, 0x31, 0xdb, 0x49, 0x89, 0x1f, 0x49, + 0x89, 0x45, 0xf8, 0x89, 0xe8, 0x4d, 0x8d, 0x6c, + 0xc5, 0x00, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, + 0xd6, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_GetAttr+0x0 + // 10: &_PyObject_GetMethod+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetAttr); + patch_64(data + 0x10, (uintptr_t)&_PyObject_GetMethod); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xec, (uintptr_t)data + 0x24); +} + +void +emit__LOAD_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_CLASS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // c: 8b 03 movl (%rbx), %eax + // e: 85 c0 testl %eax, %eax + // 10: 78 04 js 0x16 <_JIT_ENTRY+0x16> + // 12: ff c0 incl %eax + // 14: 89 03 movl %eax, (%rbx) + // 16: 8b 07 movl (%rdi), %eax + // 18: 85 c0 testl %eax, %eax + // 1a: 78 06 js 0x22 <_JIT_ENTRY+0x22> + // 1c: ff c8 decl %eax + // 1e: 89 07 movl %eax, (%rdi) + // 20: 74 0b je 0x2d <_JIT_ENTRY+0x2d> + // 22: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 26: 58 popq %rax + // 27: ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 2d: ff 15 00 00 00 00 callq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 33: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[56] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x04, 0xff, 0xc0, 0x89, 0x03, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x0b, 0x49, 0x89, 0x5d, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0xf8, 0x58, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_INSTANCE_VALUE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // c: 48 8b 04 07 movq (%rdi,%rax), %rax + // 10: 48 85 c0 testq %rax, %rax + // 13: 74 34 je 0x49 <_JIT_ENTRY+0x49> + // 15: 8b 08 movl (%rax), %ecx + // 17: 85 c9 testl %ecx, %ecx + // 19: 78 04 js 0x1f <_JIT_ENTRY+0x1f> + // 1b: ff c1 incl %ecx + // 1d: 89 08 movl %ecx, (%rax) + // 1f: 49 89 45 f8 movq %rax, -0x8(%r13) + // 23: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 28: 8b 07 movl (%rdi), %eax + // 2a: 85 c0 testl %eax, %eax + // 2c: 78 06 js 0x34 <_JIT_ENTRY+0x34> + // 2e: ff c8 decl %eax + // 30: 89 07 movl %eax, (%rdi) + // 32: 74 1c je 0x50 <_JIT_ENTRY+0x50> + // 34: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 39: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 42: 58 popq %rax + // 43: ff 25 00 00 00 00 jmpq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 49: 58 popq %rax + // 4a: ff 25 00 00 00 00 jmpq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 50: ff 15 00 00 00 00 callq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 56: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 64: 58 popq %rax + // 65: ff 25 00 00 00 00 jmpq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[101] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x04, 0x07, + 0x48, 0x85, 0xc0, 0x74, 0x34, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x07, 0x74, 0x1c, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_LAZY_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // b: 8b 11 movl (%rcx), %edx + // d: 85 d2 testl %edx, %edx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c2 incl %edx + // 13: 89 11 movl %edx, (%rcx) + // 15: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 19: 49 89 45 00 movq %rax, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4d, + 0xf8, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_NO_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // b: 8b 11 movl (%rcx), %edx + // d: 85 d2 testl %edx, %edx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c2 incl %edx + // 13: 89 11 movl %edx, (%rcx) + // 15: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 19: 49 89 45 00 movq %rax, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4d, + 0xf8, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_WITH_VALUES.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // b: 8b 11 movl (%rcx), %edx + // d: 85 d2 testl %edx, %edx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c2 incl %edx + // 13: 89 11 movl %edx, (%rcx) + // 15: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 19: 49 89 45 00 movq %rax, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4d, + 0xf8, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 10 movq 0x10(%rdi), %rax + // 9: 48 8b 40 20 movq 0x20(%rax), %rax + // d: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 11: ba 01 00 00 00 movl $0x1, %edx + // 16: 48 d3 e2 shlq %cl, %rdx + // 19: 48 01 c2 addq %rax, %rdx + // 1c: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 23: c1 e0 04 shll $0x4, %eax + // 26: 48 8b 5c 10 28 movq 0x28(%rax,%rdx), %rbx + // 2b: 48 85 db testq %rbx, %rbx + // 2e: 74 21 je 0x51 <_JIT_ENTRY+0x51> + // 30: 8b 03 movl (%rbx), %eax + // 32: 85 c0 testl %eax, %eax + // 34: 78 04 js 0x3a <_JIT_ENTRY+0x3a> + // 36: ff c0 incl %eax + // 38: 89 03 movl %eax, (%rbx) + // 3a: 8b 07 movl (%rdi), %eax + // 3c: 85 c0 testl %eax, %eax + // 3e: 78 06 js 0x46 <_JIT_ENTRY+0x46> + // 40: ff c8 decl %eax + // 42: 89 07 movl %eax, (%rdi) + // 44: 74 12 je 0x58 <_JIT_ENTRY+0x58> + // 46: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 4a: 58 popq %rax + // 4b: ff 25 00 00 00 00 jmpq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 51: 58 popq %rax + // 52: ff 25 00 00 00 00 jmpq *(%rip) # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5e: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 62: 58 popq %rax + // 63: ff 25 00 00 00 00 jmpq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[99] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x10, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb6, 0x48, + 0x09, 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, + 0xe2, 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, + 0x5c, 0x10, 0x28, 0x48, 0x85, 0xdb, 0x74, 0x21, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, + 0x89, 0x03, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x12, 0x49, 0x89, + 0x5d, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x5d, 0xf8, 0x58, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1f, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE_FROM_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 e8 movq %r13, %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 8b 50 f8 movq -0x8(%rax), %rdx + // c: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 10: be 01 00 00 00 movl $0x1, %esi + // 15: 48 d3 e6 shlq %cl, %rsi + // 18: 48 01 d6 addq %rdx, %rsi + // 1b: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 22: c1 e1 04 shll $0x4, %ecx + // 25: 48 8b 4c 31 28 movq 0x28(%rcx,%rsi), %rcx + // 2a: 48 85 c9 testq %rcx, %rcx + // 2d: 74 38 je 0x67 <_JIT_ENTRY+0x67> + // 2f: 48 8b 78 f0 movq -0x10(%rax), %rdi + // 33: 8b 11 movl (%rcx), %edx + // 35: 85 d2 testl %edx, %edx + // 37: 78 04 js 0x3d <_JIT_ENTRY+0x3d> + // 39: ff c2 incl %edx + // 3b: 89 11 movl %edx, (%rcx) + // 3d: 48 89 48 f0 movq %rcx, -0x10(%rax) + // 41: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 46: 8b 07 movl (%rdi), %eax + // 48: 85 c0 testl %eax, %eax + // 4a: 78 06 js 0x52 <_JIT_ENTRY+0x52> + // 4c: ff c8 decl %eax + // 4e: 89 07 movl %eax, (%rdi) + // 50: 74 1c je 0x6e <_JIT_ENTRY+0x6e> + // 52: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 57: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 60: 58 popq %rax + // 61: ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 67: 58 popq %rax + // 68: ff 25 00 00 00 00 jmpq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 6e: ff 15 00 00 00 00 callq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 74: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 79: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 82: 58 popq %rax + // 83: ff 25 00 00 00 00 jmpq *(%rip) # 0x89 <_JIT_ENTRY+0x89> + // 0000000000000085: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[131] = { + 0x50, 0x4c, 0x89, 0xe8, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x8b, 0x50, 0xf8, 0x0f, 0xb6, 0x4a, 0x09, + 0xbe, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe6, + 0x48, 0x01, 0xd6, 0x0f, 0xb7, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe1, 0x04, 0x48, 0x8b, 0x4c, + 0x31, 0x28, 0x48, 0x85, 0xc9, 0x74, 0x38, 0x48, + 0x8b, 0x78, 0xf0, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x48, 0x89, 0x48, + 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x1c, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1e, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_NO_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 8b 07 movl (%rdi), %eax + // 7: 85 c0 testl %eax, %eax + // 9: 78 0c js 0x17 <_JIT_ENTRY+0x17> + // b: ff c8 decl %eax + // d: 89 07 movl %eax, (%rdi) + // f: 75 06 jne 0x17 <_JIT_ENTRY+0x17> + // 11: ff 15 00 00 00 00 callq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 17: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 1e: 8b 08 movl (%rax), %ecx + // 20: 85 c9 testl %ecx, %ecx + // 22: 78 04 js 0x28 <_JIT_ENTRY+0x28> + // 24: ff c1 incl %ecx + // 26: 89 08 movl %ecx, (%rax) + // 28: 49 89 45 f8 movq %rax, -0x8(%r13) + // 2c: 58 popq %rax + // 2d: ff 25 00 00 00 00 jmpq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[45] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, + 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, + 0x49, 0x89, 0x45, 0xf8, 0x58, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 8b 07 movl (%rdi), %eax + // 7: 85 c0 testl %eax, %eax + // 9: 78 0c js 0x17 <_JIT_ENTRY+0x17> + // b: ff c8 decl %eax + // d: 89 07 movl %eax, (%rdi) + // f: 75 06 jne 0x17 <_JIT_ENTRY+0x17> + // 11: ff 15 00 00 00 00 callq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 17: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 1e: 8b 08 movl (%rax), %ecx + // 20: 85 c9 testl %ecx, %ecx + // 22: 78 04 js 0x28 <_JIT_ENTRY+0x28> + // 24: ff c1 incl %ecx + // 26: 89 08 movl %ecx, (%rax) + // 28: 49 89 45 f8 movq %rax, -0x8(%r13) + // 2c: 58 popq %rax + // 2d: ff 25 00 00 00 00 jmpq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[45] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, + 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, + 0x49, 0x89, 0x45, 0xf8, 0x58, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); +} + +void +emit__LOAD_ATTR_PROPERTY_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_PROPERTY_FRAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 7: 48 8b 42 30 movq 0x30(%rdx), %rax + // b: 8b 48 30 movl 0x30(%rax), %ecx + // e: 83 e1 0d andl $0xd, %ecx + // 11: 83 f9 01 cmpl $0x1, %ecx + // 14: 0f 85 e0 00 00 00 jne 0xfa <_JIT_ENTRY+0xfa> + // 1a: 83 78 3c 00 cmpl $0x0, 0x3c(%rax) + // 1e: 0f 85 d6 00 00 00 jne 0xfa <_JIT_ENTRY+0xfa> + // 24: 83 78 34 01 cmpl $0x1, 0x34(%rax) + // 28: 0f 85 cc 00 00 00 jne 0xfa <_JIT_ENTRY+0xfa> + // 2e: 49 8b 8e f0 00 00 00 movq 0xf0(%r14), %rcx + // 35: 48 85 c9 testq %rcx, %rcx + // 38: 0f 84 bc 00 00 00 je 0xfa <_JIT_ENTRY+0xfa> + // 3e: 48 63 78 4c movslq 0x4c(%rax), %rdi + // 42: 49 8b b6 f8 00 00 00 movq 0xf8(%r14), %rsi + // 49: 48 29 ce subq %rcx, %rsi + // 4c: 48 c1 fe 03 sarq $0x3, %rsi + // 50: 48 39 fe cmpq %rdi, %rsi + // 53: 0f 8e a1 00 00 00 jle 0xfa <_JIT_ENTRY+0xfa> + // 59: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 5d: 8b 1a movl (%rdx), %ebx + // 5f: 85 db testl %ebx, %ebx + // 61: 78 04 js 0x67 <_JIT_ENTRY+0x67> + // 63: ff c3 incl %ebx + // 65: 89 1a movl %ebx, (%rdx) + // 67: 48 8d 3c f9 leaq (%rcx,%rdi,8), %rdi + // 6b: 49 89 be f0 00 00 00 movq %rdi, 0xf0(%r14) + // 72: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 76: 48 89 51 10 movq %rdx, 0x10(%rcx) + // 7a: 8b 38 movl (%rax), %edi + // 7c: 85 ff testl %edi, %edi + // 7e: 78 04 js 0x84 <_JIT_ENTRY+0x84> + // 80: ff c7 incl %edi + // 82: 89 38 movl %edi, (%rax) + // 84: 48 89 01 movq %rax, (%rcx) + // 87: 0f 10 42 10 movups 0x10(%rdx), %xmm0 + // 8b: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 8f: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 97: 48 63 50 48 movslq 0x48(%rax), %rdx + // 9b: 48 8d 7c d1 50 leaq 0x50(%rcx,%rdx,8), %rdi + // a0: 48 89 79 40 movq %rdi, 0x40(%rcx) + // a4: 48 8d b8 d0 00 00 00 leaq 0xd0(%rax), %rdi + // ab: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // b3: 48 89 79 38 movq %rdi, 0x38(%rcx) + // b7: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // be: 48 83 fa 02 cmpq $0x2, %rdx + // c2: 7c 28 jl 0xec <_JIT_ENTRY+0xec> + // c4: ba 0b 00 00 00 movl $0xb, %edx + // c9: 0f 1f 80 00 00 00 00 nopl (%rax) + // d0: 48 c7 04 d1 00 00 00 00 movq $0x0, (%rcx,%rdx,8) + // d8: 48 63 78 48 movslq 0x48(%rax), %rdi + // dc: 4c 8d 42 01 leaq 0x1(%rdx), %r8 + // e0: 48 83 c2 f7 addq $-0x9, %rdx + // e4: 48 39 fa cmpq %rdi, %rdx + // e7: 4c 89 c2 movq %r8, %rdx + // ea: 7c e4 jl 0xd0 <_JIT_ENTRY+0xd0> + // ec: 48 89 71 50 movq %rsi, 0x50(%rcx) + // f0: 49 89 4d f8 movq %rcx, -0x8(%r13) + // f4: ff 25 00 00 00 00 jmpq *(%rip) # 0xfa <_JIT_ENTRY+0xfa> + // 00000000000000f6: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // fa: ff 25 00 00 00 00 jmpq *(%rip) # 0x100 <_JIT_ENTRY+0x100> + // 00000000000000fc: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[256] = { + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x42, 0x30, 0x8b, 0x48, 0x30, 0x83, 0xe1, + 0x0d, 0x83, 0xf9, 0x01, 0x0f, 0x85, 0xe0, 0x00, + 0x00, 0x00, 0x83, 0x78, 0x3c, 0x00, 0x0f, 0x85, + 0xd6, 0x00, 0x00, 0x00, 0x83, 0x78, 0x34, 0x01, + 0x0f, 0x85, 0xcc, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x8e, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc9, + 0x0f, 0x84, 0xbc, 0x00, 0x00, 0x00, 0x48, 0x63, + 0x78, 0x4c, 0x49, 0x8b, 0xb6, 0xf8, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xce, 0x48, 0xc1, 0xfe, 0x03, + 0x48, 0x39, 0xfe, 0x0f, 0x8e, 0xa1, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x8b, 0x1a, 0x85, + 0xdb, 0x78, 0x04, 0xff, 0xc3, 0x89, 0x1a, 0x48, + 0x8d, 0x3c, 0xf9, 0x49, 0x89, 0xbe, 0xf0, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0x61, 0x08, 0x48, 0x89, + 0x51, 0x10, 0x8b, 0x38, 0x85, 0xff, 0x78, 0x04, + 0xff, 0xc7, 0x89, 0x38, 0x48, 0x89, 0x01, 0x0f, + 0x10, 0x42, 0x10, 0x0f, 0x11, 0x41, 0x18, 0x48, + 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x50, 0x48, 0x48, 0x8d, 0x7c, 0xd1, 0x50, + 0x48, 0x89, 0x79, 0x40, 0x48, 0x8d, 0xb8, 0xd0, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0x41, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x79, 0x38, 0xc7, + 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xfa, 0x02, 0x7c, 0x28, 0xba, 0x0b, 0x00, 0x00, + 0x00, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xc7, 0x04, 0xd1, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x78, 0x48, 0x4c, 0x8d, 0x42, 0x01, + 0x48, 0x83, 0xc2, 0xf7, 0x48, 0x39, 0xfa, 0x4c, + 0x89, 0xc2, 0x7c, 0xe4, 0x48, 0x89, 0x71, 0x50, + 0x49, 0x89, 0x4d, 0xf8, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf6, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xfc, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_SLOT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // c: 48 8b 1c 07 movq (%rdi,%rax), %rbx + // 10: 48 85 db testq %rbx, %rbx + // 13: 74 21 je 0x36 <_JIT_ENTRY+0x36> + // 15: 8b 03 movl (%rbx), %eax + // 17: 85 c0 testl %eax, %eax + // 19: 78 04 js 0x1f <_JIT_ENTRY+0x1f> + // 1b: ff c0 incl %eax + // 1d: 89 03 movl %eax, (%rbx) + // 1f: 8b 07 movl (%rdi), %eax + // 21: 85 c0 testl %eax, %eax + // 23: 78 06 js 0x2b <_JIT_ENTRY+0x2b> + // 25: ff c8 decl %eax + // 27: 89 07 movl %eax, (%rdi) + // 29: 74 12 je 0x3d <_JIT_ENTRY+0x3d> + // 2b: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 2f: 58 popq %rax + // 30: ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 36: 58 popq %rax + // 37: ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 3d: ff 15 00 00 00 00 callq *(%rip) # 0x43 <_JIT_ENTRY+0x43> + // 000000000000003f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 43: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 47: 58 popq %rax + // 48: ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[72] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x1c, 0x07, + 0x48, 0x85, 0xdb, 0x74, 0x21, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x03, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x07, 0x74, 0x12, 0x49, 0x89, 0x5d, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0xf8, 0x58, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_WITH_HINT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 eb movq %r13, %rbx + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 8b 4b f8 movq -0x8(%rbx), %rcx + // c: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 13: 48 8b 51 20 movq 0x20(%rcx), %rdx + // 17: 48 39 42 18 cmpq %rax, 0x18(%rdx) + // 1b: 76 38 jbe 0x55 <_JIT_ENTRY+0x55> + // 1d: 80 7a 0a 01 cmpb $0x1, 0xa(%rdx) + // 21: 75 32 jne 0x55 <_JIT_ENTRY+0x55> + // 23: 49 8b 0c 24 movq (%r12), %rcx + // 27: 48 8b 79 20 movq 0x20(%rcx), %rdi + // 2b: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 33: 41 83 e0 fe andl $-0x2, %r8d + // 37: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 3b: be 01 00 00 00 movl $0x1, %esi + // 40: 48 d3 e6 shlq %cl, %rsi + // 43: 48 01 d6 addq %rdx, %rsi + // 46: c1 e0 04 shll $0x4, %eax + // 49: 48 8b 4c 30 20 movq 0x20(%rax,%rsi), %rcx + // 4e: 4a 3b 4c 87 18 cmpq 0x18(%rdi,%r8,4), %rcx + // 53: 74 07 je 0x5c <_JIT_ENTRY+0x5c> + // 55: 58 popq %rax + // 56: ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 5c: 48 01 f0 addq %rsi, %rax + // 5f: 48 83 c0 20 addq $0x20, %rax + // 63: 4c 8b 78 08 movq 0x8(%rax), %r15 + // 67: 4d 85 ff testq %r15, %r15 + // 6a: 74 e9 je 0x55 <_JIT_ENTRY+0x55> + // 6c: 48 8b 7b f0 movq -0x10(%rbx), %rdi + // 70: 41 8b 07 movl (%r15), %eax + // 73: 85 c0 testl %eax, %eax + // 75: 78 05 js 0x7c <_JIT_ENTRY+0x7c> + // 77: ff c0 incl %eax + // 79: 41 89 07 movl %eax, (%r15) + // 7c: 8b 07 movl (%rdi), %eax + // 7e: 85 c0 testl %eax, %eax + // 80: 78 0c js 0x8e <_JIT_ENTRY+0x8e> + // 82: ff c8 decl %eax + // 84: 89 07 movl %eax, (%rdi) + // 86: 75 06 jne 0x8e <_JIT_ENTRY+0x8e> + // 88: ff 15 00 00 00 00 callq *(%rip) # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 8e: 4c 89 7b f0 movq %r15, -0x10(%rbx) + // 92: 58 popq %rax + // 93: ff 25 00 00 00 00 jmpq *(%rip) # 0x99 <_JIT_ENTRY+0x99> + // 0000000000000095: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[147] = { + 0x50, 0x4c, 0x89, 0xeb, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x8b, 0x4b, 0xf8, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x51, 0x20, 0x48, + 0x39, 0x42, 0x18, 0x76, 0x38, 0x80, 0x7a, 0x0a, + 0x01, 0x75, 0x32, 0x49, 0x8b, 0x0c, 0x24, 0x48, + 0x8b, 0x79, 0x20, 0x44, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x83, 0xe0, 0xfe, 0x0f, + 0xb6, 0x4a, 0x09, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0x48, 0xd3, 0xe6, 0x48, 0x01, 0xd6, 0xc1, 0xe0, + 0x04, 0x48, 0x8b, 0x4c, 0x30, 0x20, 0x4a, 0x3b, + 0x4c, 0x87, 0x18, 0x74, 0x07, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0xf0, 0x48, + 0x83, 0xc0, 0x20, 0x4c, 0x8b, 0x78, 0x08, 0x4d, + 0x85, 0xff, 0x74, 0xe9, 0x48, 0x8b, 0x7b, 0xf0, + 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x05, 0xff, + 0xc0, 0x41, 0x89, 0x07, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x7b, 0xf0, 0x58, + }; + // 0: OPERAND0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xf, (uintptr_t)data + -0x4); + patch_32r(code + 0x2f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_BUILD_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_BUILD_CLASS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6: 49 8b 7c 24 20 movq 0x20(%r12), %rdi + // b: be 00 92 00 00 movl $0x9200, %esi # imm = 0x9200 + // 10: 48 03 35 00 00 00 00 addq (%rip), %rsi # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 17: 48 89 e2 movq %rsp, %rdx + // 1a: ff 15 00 00 00 00 callq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_GOTPCRELX PyMapping_GetOptionalItem-0x4 + // 20: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 25: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2e: 85 c0 testl %eax, %eax + // 30: 78 18 js 0x4a <_JIT_ENTRY+0x4a> + // 32: 48 8b 04 24 movq (%rsp), %rax + // 36: 48 85 c0 testq %rax, %rax + // 39: 74 16 je 0x51 <_JIT_ENTRY+0x51> + // 3b: 49 89 45 00 movq %rax, (%r13) + // 3f: 49 83 c5 08 addq $0x8, %r13 + // 43: 58 popq %rax + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 4a: 58 popq %rax + // 4b: ff 25 00 00 00 00 jmpq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 51: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 56: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: R_X86_64_REX_GOTPCRELX PyExc_NameError-0x4 + // 5d: 48 8b 30 movq (%rax), %rsi + // 60: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: R_X86_64_PC32 .L.str-0x4 + // 67: 4c 89 f7 movq %r14, %rdi + // 6a: ff 15 00 00 00 00 callq *(%rip) # 0x70 <_JIT_ENTRY+0x70> + // 000000000000006c: R_X86_64_GOTPCRELX _PyErr_SetString-0x4 + // 70: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 75: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7e: 58 popq %rax + // 7f: ff 25 00 00 00 00 jmpq *(%rip) # 0x85 <_JIT_ENTRY+0x85> + // 0000000000000081: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[133] = { + 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, + 0x7c, 0x24, 0x20, 0xbe, 0x00, 0x92, 0x00, 0x00, + 0x48, 0x03, 0x35, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xe2, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x78, 0x18, 0x48, 0x8b, 0x04, 0x24, 0x48, 0x85, + 0xc0, 0x74, 0x16, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, + 0x48, 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '__build_class__ not found\x00' + // 1a: 00 00 00 00 00 00 + // 20: &_PyRuntime+0x0 + // 28: &PyMapping_GetOptionalItem+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + // 40: &PyExc_NameError+0x0 + // 48: &_PyErr_SetString+0x0 + const unsigned char data_body[80] = { + 0x5f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x5f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&_PyRuntime); + patch_64(data + 0x28, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x40, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x48, (uintptr_t)&_PyErr_SetString); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x3c); + patch_32r(code + 0x63, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0x34); +} + +void +emit__LOAD_COMMON_CONSTANT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_COMMON_CONSTANT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 7: 66 85 c0 testw %ax, %ax + // a: 75 18 jne 0x24 <_JIT_ENTRY+0x24> + // c: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_REX_GOTPCRELX PyExc_AssertionError-0x4 + // 13: 48 8b 00 movq (%rax), %rax + // 16: 49 89 45 00 movq %rax, (%r13) + // 1a: 49 83 c5 08 addq $0x8, %r13 + // 1e: ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 24: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: R_X86_64_REX_GOTPCRELX PyExc_NotImplementedError-0x4 + // 2b: 48 8b 00 movq (%rax), %rax + // 2e: 49 89 45 00 movq %rax, (%r13) + // 32: 49 83 c5 08 addq $0x8, %r13 + // 36: ff 25 00 00 00 00 jmpq *(%rip) # 0x3c <_JIT_ENTRY+0x3c> + // 0000000000000038: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[54] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x75, 0x18, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + // 8: &PyExc_AssertionError+0x0 + // 10: CONTINUE + // 18: &PyExc_NotImplementedError+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyExc_AssertionError); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&PyExc_NotImplementedError); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_CONST_IMMORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_IMMORTAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 04 24 movq (%r12), %rax + // 4: 48 8b 40 18 movq 0x18(%rax), %rax + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // f: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 14: 49 89 45 00 movq %rax, (%r13) + // 18: 49 83 c5 08 addq $0x8, %r13 + // 1c: ff 25 00 00 00 00 jmpq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[28] = { + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x18, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0xc8, 0x18, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 7: 8b 08 movl (%rax), %ecx + // 9: 85 c9 testl %ecx, %ecx + // b: 78 04 js 0x11 <_JIT_ENTRY+0x11> + // d: ff c1 incl %ecx + // f: 89 08 movl %ecx, (%rax) + // 11: 49 89 45 00 movq %rax, (%r13) + // 15: 49 83 c5 08 addq $0x8, %r13 + // 19: ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[25] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE_BORROW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 7: 49 89 45 00 movq %rax, (%r13) + // b: 49 83 c5 08 addq $0x8, %r13 + // f: ff 25 00 00 00 00 jmpq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[15] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_MORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_MORTAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 04 24 movq (%r12), %rax + // 4: 48 8b 40 18 movq 0x18(%rax), %rax + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // f: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 14: 8b 08 movl (%rax), %ecx + // 16: 85 c9 testl %ecx, %ecx + // 18: 78 04 js 0x1e <_JIT_ENTRY+0x1e> + // 1a: ff c1 incl %ecx + // 1c: 89 08 movl %ecx, (%rax) + // 1e: 49 89 45 00 movq %rax, (%r13) + // 22: 49 83 c5 08 addq $0x8, %r13 + // 26: ff 25 00 00 00 00 jmpq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[38] = { + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x18, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0xc8, 0x18, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_DEREF.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // d: 48 8b 40 10 movq 0x10(%rax), %rax + // 11: 48 85 c0 testq %rax, %rax + // 14: 74 19 je 0x2f <_JIT_ENTRY+0x2f> + // 16: 8b 08 movl (%rax), %ecx + // 18: 85 c9 testl %ecx, %ecx + // 1a: 78 04 js 0x20 <_JIT_ENTRY+0x20> + // 1c: ff c1 incl %ecx + // 1e: 89 08 movl %ecx, (%rax) + // 20: 49 89 45 00 movq %rax, (%r13) + // 24: 49 83 c5 08 addq $0x8, %r13 + // 28: 58 popq %rax + // 29: ff 25 00 00 00 00 jmpq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 2f: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 36: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 3b: 49 8b 34 24 movq (%r12), %rsi + // 3f: 4c 89 f7 movq %r14, %rdi + // 42: ff 15 00 00 00 00 callq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: R_X86_64_GOTPCRELX _PyEval_FormatExcUnbound-0x4 + // 48: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 56: 58 popq %rax + // 57: ff 25 00 00 00 00 jmpq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[93] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x44, 0xc4, 0x50, 0x48, 0x8b, 0x40, + 0x10, 0x48, 0x85, 0xc0, 0x74, 0x19, 0x8b, 0x08, + 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x34, 0x24, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_PyEval_FormatExcUnbound+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_32r(code + 0x32, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // c: 8b 08 movl (%rax), %ecx + // e: 85 c9 testl %ecx, %ecx + // 10: 78 04 js 0x16 <_JIT_ENTRY+0x16> + // 12: ff c1 incl %ecx + // 14: 89 08 movl %ecx, (%rax) + // 16: 49 89 45 00 movq %rax, (%r13) + // 1a: 49 83 c5 08 addq $0x8, %r13 + // 1e: ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[30] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x44, 0xc4, 0x50, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_0.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 50 movq 0x50(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x50, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 58 movq 0x58(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x58, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_2.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 60 movq 0x60(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x60, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_3.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 68 movq 0x68(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x68, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_4.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 70 movq 0x70(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x70, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_5.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 78 movq 0x78(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x78, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_6.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 84 24 80 00 00 00 movq 0x80(%r12), %rax + // 8: 8b 08 movl (%rax), %ecx + // a: 85 c9 testl %ecx, %ecx + // c: 78 04 js 0x12 <_JIT_ENTRY+0x12> + // e: ff c1 incl %ecx + // 10: 89 08 movl %ecx, (%rax) + // 12: 49 89 45 00 movq %rax, (%r13) + // 16: 49 83 c5 08 addq $0x8, %r13 + // 1a: ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[26] = { + 0x49, 0x8b, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_7.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 84 24 88 00 00 00 movq 0x88(%r12), %rax + // 8: 8b 08 movl (%rax), %ecx + // a: 85 c9 testl %ecx, %ecx + // c: 78 04 js 0x12 <_JIT_ENTRY+0x12> + // e: ff c1 incl %ecx + // 10: 89 08 movl %ecx, (%rax) + // 12: 49 89 45 00 movq %rax, (%r13) + // 16: 49 83 c5 08 addq $0x8, %r13 + // 1a: ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[26] = { + 0x49, 0x8b, 0x84, 0x24, 0x88, 0x00, 0x00, 0x00, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_AND_CLEAR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_AND_CLEAR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: 49 8b 4c c4 50 movq 0x50(%r12,%rax,8), %rcx + // c: 49 c7 44 c4 50 00 00 00 00 movq $0x0, 0x50(%r12,%rax,8) + // 15: 49 89 4d 00 movq %rcx, (%r13) + // 19: 49 83 c5 08 addq $0x8, %r13 + // 1d: ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[29] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x4c, 0xc4, 0x50, 0x49, 0xc7, 0x44, 0xc4, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, + 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_FAST_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_CHECK.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8: 0f b7 c1 movzwl %cx, %eax + // b: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 10: 48 85 c0 testq %rax, %rax + // 13: 74 19 je 0x2e <_JIT_ENTRY+0x2e> + // 15: 8b 08 movl (%rax), %ecx + // 17: 85 c9 testl %ecx, %ecx + // 19: 78 04 js 0x1f <_JIT_ENTRY+0x1f> + // 1b: ff c1 incl %ecx + // 1d: 89 08 movl %ecx, (%rax) + // 1f: 49 89 45 00 movq %rax, (%r13) + // 23: 49 83 c5 08 addq $0x8, %r13 + // 27: 58 popq %rax + // 28: ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 2e: 0f b7 f1 movzwl %cx, %esi + // 31: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 36: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_REX_GOTPCRELX PyExc_UnboundLocalError-0x4 + // 3d: 48 8b 18 movq (%rax), %rbx + // 40: 49 8b 04 24 movq (%r12), %rax + // 44: 48 8b 78 60 movq 0x60(%rax), %rdi + // 48: ff 15 00 00 00 00 callq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: R_X86_64_GOTPCRELX PyTuple_GetItem-0x4 + // 4e: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: R_X86_64_PC32 .L.str-0x4 + // 55: 4c 89 f7 movq %r14, %rdi + // 58: 48 89 de movq %rbx, %rsi + // 5b: 48 89 c1 movq %rax, %rcx + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: R_X86_64_GOTPCRELX _PyEval_FormatExcCheckArg-0x4 + // 64: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 69: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 72: 58 popq %rax + // 73: ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[121] = { + 0x50, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc1, 0x49, 0x8b, 0x44, 0xc4, 0x50, + 0x48, 0x85, 0xc0, 0x74, 0x19, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xf1, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x18, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x78, 0x60, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, + 0x48, 0x89, 0xde, 0x48, 0x89, 0xc1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: OPARG + // 58: CONTINUE + // 60: &PyExc_UnboundLocalError+0x0 + // 68: &PyTuple_GetItem+0x0 + // 70: &_PyEval_FormatExcCheckArg+0x0 + // 78: ERROR_TARGET + const unsigned char data_body[128] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, instruction->oparg); + patch_64(data + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x60, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x68, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x70, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x78, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x4, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x64); + patch_32r(code + 0x51, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0x74); +} + +void +emit__LOAD_FROM_DICT_OR_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FROM_DICT_OR_DEREF.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 49 8b 04 24 movq (%r12), %rax + // 9: 48 8b 40 60 movq 0x60(%rax), %rax + // d: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 14: 41 0f b7 cf movzwl %r15w, %ecx + // 18: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 89 e2 movq %rsp, %rdx + // 25: 48 89 df movq %rbx, %rdi + // 28: ff 15 00 00 00 00 callq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX PyMapping_GetOptionalItem-0x4 + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: 85 c0 testl %eax, %eax + // 3e: 78 68 js 0xa8 <_JIT_ENTRY+0xa8> + // 40: 48 8b 04 24 movq (%rsp), %rax + // 44: 48 85 c0 testq %rax, %rax + // 47: 75 20 jne 0x69 <_JIT_ENTRY+0x69> + // 49: 41 0f b7 c7 movzwl %r15w, %eax + // 4d: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 52: 48 8b 40 10 movq 0x10(%rax), %rax + // 56: 48 85 c0 testq %rax, %rax + // 59: 74 54 je 0xaf <_JIT_ENTRY+0xaf> + // 5b: 8b 08 movl (%rax), %ecx + // 5d: 85 c9 testl %ecx, %ecx + // 5f: 78 04 js 0x65 <_JIT_ENTRY+0x65> + // 61: ff c1 incl %ecx + // 63: 89 08 movl %ecx, (%rax) + // 65: 48 89 04 24 movq %rax, (%rsp) + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 72: 8b 0b movl (%rbx), %ecx + // 74: 85 c9 testl %ecx, %ecx + // 76: 78 13 js 0x8b <_JIT_ENTRY+0x8b> + // 78: ff c9 decl %ecx + // 7a: 89 0b movl %ecx, (%rbx) + // 7c: 75 0d jne 0x8b <_JIT_ENTRY+0x8b> + // 7e: 48 89 df movq %rbx, %rdi + // 81: ff 15 00 00 00 00 callq *(%rip) # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 87: 48 8b 04 24 movq (%rsp), %rax + // 8b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 90: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 99: 49 89 45 00 movq %rax, (%r13) + // 9d: 49 83 c5 08 addq $0x8, %r13 + // a1: 58 popq %rax + // a2: ff 25 00 00 00 00 jmpq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // a8: 58 popq %rax + // a9: ff 25 00 00 00 00 jmpq *(%rip) # 0xaf <_JIT_ENTRY+0xaf> + // 00000000000000ab: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // af: 48 c7 04 24 00 00 00 00 movq $0x0, (%rsp) + // b7: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0xbe <_JIT_ENTRY+0xbe> + // 00000000000000ba: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // be: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // c3: 49 8b 34 24 movq (%r12), %rsi + // c7: 4c 89 f7 movq %r14, %rdi + // ca: ff 15 00 00 00 00 callq *(%rip) # 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000cc: R_X86_64_GOTPCRELX _PyEval_FormatExcUnbound-0x4 + // d0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // de: 58 popq %rax + // df: ff 25 00 00 00 00 jmpq *(%rip) # 0xe5 <_JIT_ENTRY+0xe5> + // 00000000000000e1: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[229] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, + 0x24, 0x48, 0x8b, 0x40, 0x60, 0x4c, 0x8b, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x0f, 0xb7, 0xcf, + 0x48, 0x8b, 0x74, 0xc8, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xe2, 0x48, 0x89, 0xdf, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x68, + 0x48, 0x8b, 0x04, 0x24, 0x48, 0x85, 0xc0, 0x75, + 0x20, 0x41, 0x0f, 0xb7, 0xc7, 0x49, 0x8b, 0x44, + 0xc4, 0x50, 0x48, 0x8b, 0x40, 0x10, 0x48, 0x85, + 0xc0, 0x74, 0x54, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x48, 0x89, 0x04, + 0x24, 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x13, + 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x0d, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x04, 0x24, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x34, 0x24, 0x4c, + 0x89, 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMapping_GetOptionalItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + // 28: &_PyEval_FormatExcUnbound+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&_PyEval_FormatExcUnbound); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + 0x1c); + patch_32r(code + 0xba, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xe1, (uintptr_t)data + 0x1c); +} + +void +emit__LOAD_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 eb movq %r13, %rbx + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 49 8b 7c 24 18 movq 0x18(%r12), %rdi + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 18: 83 e1 fe andl $-0x2, %ecx + // 1b: 48 8b 54 88 18 movq 0x18(%rax,%rcx,4), %rdx + // 20: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 25: 49 8b 74 24 20 movq 0x20(%r12), %rsi + // 2a: 4c 89 e9 movq %r13, %rcx + // 2d: ff 15 00 00 00 00 callq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCRELX _PyEval_LoadGlobalStackRef-0x4 + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 48 83 3b 00 cmpq $0x0, (%rbx) + // 45: 74 0b je 0x52 <_JIT_ENTRY+0x52> + // 47: 49 83 c5 08 addq $0x8, %r13 + // 4b: 58 popq %rax + // 4c: ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[89] = { + 0x50, 0x4c, 0x89, 0xeb, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x7c, 0x24, 0x18, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xe1, 0xfe, 0x48, 0x8b, 0x54, 0x88, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x74, + 0x24, 0x20, 0x4c, 0x89, 0xe9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0x3b, 0x00, 0x74, 0x0b, 0x49, + 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &_PyEval_LoadGlobalStackRef+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_LoadGlobalStackRef); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_GLOBAL_BUILTINS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 20 movq 0x20(%r12), %rax + // 5: 48 8b 40 20 movq 0x20(%rax), %rax + // 9: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // d: ba 01 00 00 00 movl $0x1, %edx + // 12: 48 d3 e2 shlq %cl, %rdx + // 15: 48 01 c2 addq %rax, %rdx + // 18: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1f: c1 e0 04 shll $0x4, %eax + // 22: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 27: 48 85 c0 testq %rax, %rax + // 2a: 74 18 je 0x44 <_JIT_ENTRY+0x44> + // 2c: 8b 08 movl (%rax), %ecx + // 2e: 85 c9 testl %ecx, %ecx + // 30: 78 04 js 0x36 <_JIT_ENTRY+0x36> + // 32: ff c1 incl %ecx + // 34: 89 08 movl %ecx, (%rax) + // 36: 49 89 45 00 movq %rax, (%r13) + // 3a: 49 83 c5 08 addq $0x8, %r13 + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[74] = { + 0x49, 0x8b, 0x44, 0x24, 0x20, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb6, 0x48, 0x09, 0xba, 0x01, 0x00, + 0x00, 0x00, 0x48, 0xd3, 0xe2, 0x48, 0x01, 0xc2, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x04, 0x48, 0x8b, 0x44, 0x10, 0x28, 0x48, + 0x85, 0xc0, 0x74, 0x18, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS_FROM_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 8: ba 01 00 00 00 movl $0x1, %edx + // d: 48 d3 e2 shlq %cl, %rdx + // 10: 48 01 c2 addq %rax, %rdx + // 13: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1a: c1 e0 04 shll $0x4, %eax + // 1d: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 14 je 0x3b <_JIT_ENTRY+0x3b> + // 27: 8b 08 movl (%rax), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 04 js 0x31 <_JIT_ENTRY+0x31> + // 2d: ff c1 incl %ecx + // 2f: 89 08 movl %ecx, (%rax) + // 31: 49 89 45 f8 movq %rax, -0x8(%r13) + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3b: 49 83 c5 f8 addq $-0x8, %r13 + // 3f: ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[69] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb6, 0x48, 0x09, + 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe2, + 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x44, + 0x10, 0x28, 0x48, 0x85, 0xc0, 0x74, 0x14, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0xf8, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_GLOBAL_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 5: 48 8b 40 20 movq 0x20(%rax), %rax + // 9: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // d: ba 01 00 00 00 movl $0x1, %edx + // 12: 48 d3 e2 shlq %cl, %rdx + // 15: 48 01 c2 addq %rax, %rdx + // 18: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1f: c1 e0 04 shll $0x4, %eax + // 22: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 27: 48 85 c0 testq %rax, %rax + // 2a: 74 18 je 0x44 <_JIT_ENTRY+0x44> + // 2c: 8b 08 movl (%rax), %ecx + // 2e: 85 c9 testl %ecx, %ecx + // 30: 78 04 js 0x36 <_JIT_ENTRY+0x36> + // 32: ff c1 incl %ecx + // 34: 89 08 movl %ecx, (%rax) + // 36: 49 89 45 00 movq %rax, (%r13) + // 3a: 49 83 c5 08 addq $0x8, %r13 + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 44: ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[74] = { + 0x49, 0x8b, 0x44, 0x24, 0x18, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb6, 0x48, 0x09, 0xba, 0x01, 0x00, + 0x00, 0x00, 0x48, 0xd3, 0xe2, 0x48, 0x01, 0xc2, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x04, 0x48, 0x8b, 0x44, 0x10, 0x28, 0x48, + 0x85, 0xc0, 0x74, 0x18, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_GLOBAL_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE_FROM_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 8: ba 01 00 00 00 movl $0x1, %edx + // d: 48 d3 e2 shlq %cl, %rdx + // 10: 48 01 c2 addq %rax, %rdx + // 13: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 1a: c1 e0 04 shll $0x4, %eax + // 1d: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 14 je 0x3b <_JIT_ENTRY+0x3b> + // 27: 8b 08 movl (%rax), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 04 js 0x31 <_JIT_ENTRY+0x31> + // 2d: ff c1 incl %ecx + // 2f: 89 08 movl %ecx, (%rax) + // 31: 49 89 45 f8 movq %rax, -0x8(%r13) + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3b: 49 83 c5 f8 addq $-0x8, %r13 + // 3f: ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[69] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb6, 0x48, 0x09, + 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe2, + 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x44, + 0x10, 0x28, 0x48, 0x85, 0xc0, 0x74, 0x14, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0xf8, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_LOCALS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_LOCALS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 44 24 28 movq 0x28(%r12), %rax + // 6: 48 85 c0 testq %rax, %rax + // 9: 74 19 je 0x24 <_JIT_ENTRY+0x24> + // b: 8b 08 movl (%rax), %ecx + // d: 85 c9 testl %ecx, %ecx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c1 incl %ecx + // 13: 89 08 movl %ecx, (%rax) + // 15: 49 89 45 00 movq %rax, (%r13) + // 19: 49 83 c5 08 addq $0x8, %r13 + // 1d: 58 popq %rax + // 1e: ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_REX_GOTPCRELX PyExc_SystemError-0x4 + // 30: 48 8b 30 movq (%rax), %rsi + // 33: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_PC32 .L.str-0x4 + // 3a: 4c 89 f7 movq %r14, %rdi + // 3d: ff 15 00 00 00 00 callq *(%rip) # 0x43 <_JIT_ENTRY+0x43> + // 000000000000003f: R_X86_64_GOTPCRELX _PyErr_SetString-0x4 + // 43: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 48: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 51: 58 popq %rax + // 52: ff 25 00 00 00 00 jmpq *(%rip) # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[88] = { + 0x50, 0x49, 0x8b, 0x44, 0x24, 0x28, 0x48, 0x85, + 0xc0, 0x74, 0x19, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xf7, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'no locals found\x00' + // 10: CONTINUE + // 18: &PyExc_SystemError+0x0 + // 20: &_PyErr_SetString+0x0 + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x20, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x14); + patch_32r(code + 0x36, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x24); +} + +void +emit__LOAD_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_NAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 04 24 movq (%r12), %rax + // 5: 48 8b 40 20 movq 0x20(%rax), %rax + // 9: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 10: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 15: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1a: 4c 89 f7 movq %r14, %rdi + // 1d: 4c 89 e6 movq %r12, %rsi + // 20: ff 15 00 00 00 00 callq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: R_X86_64_GOTPCRELX _PyEval_LoadName-0x4 + // 26: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 0f je 0x48 <_JIT_ENTRY+0x48> + // 39: 49 89 45 00 movq %rax, (%r13) + // 3d: 49 83 c5 08 addq $0x8, %r13 + // 41: 58 popq %rax + // 42: ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 48: 58 popq %rax + // 49: ff 25 00 00 00 00 jmpq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[79] = { + 0x50, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x54, 0xc8, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x4c, 0x89, 0xf7, 0x4c, 0x89, 0xe6, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_LoadName+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_LoadName); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_SMALL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: c1 e0 05 shll $0x5, %eax + // a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 11: 48 01 c8 addq %rcx, %rax + // 14: 48 05 f8 36 00 00 addq $0x36f8, %rax # imm = 0x36F8 + // 1a: 49 89 45 00 movq %rax, (%r13) + // 1e: 49 83 c5 08 addq $0x8, %r13 + // 22: ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[34] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x05, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x01, 0xc8, 0x48, 0x05, 0xf8, 0x36, + 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + 0x4); +} + +void +emit__LOAD_SMALL_INT_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_0.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 f8 36 00 00 movl $0x36f8, %eax # imm = 0x36F8 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[20] = { + 0xb8, 0xf8, 0x36, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 18 37 00 00 movl $0x3718, %eax # imm = 0x3718 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[20] = { + 0xb8, 0x18, 0x37, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_2.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 38 37 00 00 movl $0x3738, %eax # imm = 0x3738 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[20] = { + 0xb8, 0x38, 0x37, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_3.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 58 37 00 00 movl $0x3758, %eax # imm = 0x3758 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[20] = { + 0xb8, 0x58, 0x37, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SPECIAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SPECIAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 49 83 c5 f8 addq $-0x8, %r13 + // d: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 14: c1 e5 04 shll $0x4, %ebp + // 17: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_REX_GOTPCRELX _Py_SpecialMethods-0x4 + // 1e: 49 8b 34 2f movq (%r15,%rbp), %rsi + // 22: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 27: 48 8d 54 24 08 leaq 0x8(%rsp), %rdx + // 2c: 48 89 df movq %rbx, %rdi + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_GOTPCRELX _PyObject_LookupSpecialMethod-0x4 + // 35: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 43: 48 85 c0 testq %rax, %rax + // 46: 74 1c je 0x64 <_JIT_ENTRY+0x64> + // 48: 48 8b 4c 24 08 movq 0x8(%rsp), %rcx + // 4d: 49 89 45 00 movq %rax, (%r13) + // 51: 49 89 4d 08 movq %rcx, 0x8(%r13) + // 55: 49 83 c5 10 addq $0x10, %r13 + // 59: 48 83 c4 10 addq $0x10, %rsp + // 5d: 5d popq %rbp + // 5e: ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 64: 49 8b 46 70 movq 0x70(%r14), %rax + // 68: 48 85 c0 testq %rax, %rax + // 6b: 74 12 je 0x7f <_JIT_ENTRY+0x7f> + // 6d: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // 72: 74 0b je 0x7f <_JIT_ENTRY+0x7f> + // 74: 48 83 c4 10 addq $0x10, %rsp + // 78: 5d popq %rbp + // 79: ff 25 00 00 00 00 jmpq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 7f: 49 01 ef addq %rbp, %r15 + // 82: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 87: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: R_X86_64_REX_GOTPCRELX PyExc_TypeError-0x4 + // 8e: 48 8b 30 movq (%rax), %rsi + // 91: 49 8b 57 08 movq 0x8(%r15), %rdx + // 95: 48 8b 43 08 movq 0x8(%rbx), %rax + // 99: 48 8b 48 18 movq 0x18(%rax), %rcx + // 9d: 4c 89 f7 movq %r14, %rdi + // a0: 31 c0 xorl %eax, %eax + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // a8: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ad: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b6: 48 83 c4 10 addq $0x10, %rsp + // ba: 5d popq %rbp + // bb: ff 25 00 00 00 00 jmpq *(%rip) # 0xc1 <_JIT_ENTRY+0xc1> + // 00000000000000bd: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[193] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x49, 0x8b, 0x5d, + 0xf8, 0x49, 0x83, 0xc5, 0xf8, 0x0f, 0xb7, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe5, 0x04, 0x4c, + 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x34, 0x2f, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x8d, 0x54, 0x24, 0x08, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1c, + 0x48, 0x8b, 0x4c, 0x24, 0x08, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x89, 0x4d, 0x08, 0x49, 0x83, 0xc5, + 0x10, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x46, 0x70, + 0x48, 0x85, 0xc0, 0x74, 0x12, 0x48, 0x83, 0x78, + 0x08, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, 0x10, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x01, 0xef, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x30, 0x49, 0x8b, 0x57, 0x08, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x8b, 0x48, 0x18, 0x4c, 0x89, 0xf7, + 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &_Py_SpecialMethods+0x0 + // 10: &_PyObject_LookupSpecialMethod+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + // 28: &PyExc_TypeError+0x0 + // 30: &_PyErr_Format+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_SpecialMethods); + patch_64(data + 0x10, (uintptr_t)&_PyObject_LookupSpecialMethod); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x30, (uintptr_t)&_PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + 0x1c); +} + +void +emit__LOAD_SUPER_ATTR_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_ATTR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 45 e8 movq -0x18(%r13), %rax + // 5: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_REX_GOTPCRELX PySuper_Type-0x4 + // c: 75 11 jne 0x1f <_JIT_ENTRY+0x1f> + // e: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 12: 48 8b 45 08 movq 0x8(%rbp), %rax + // 16: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 1d: 75 07 jne 0x26 <_JIT_ENTRY+0x26> + // 1f: 5d popq %rbp + // 20: ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 26: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 2a: 49 8b 04 24 movq (%r12), %rax + // 2e: 48 8b 40 20 movq 0x20(%rax), %rax + // 32: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 39: 83 e1 fc andl $-0x4, %ecx + // 3c: 48 8b 54 48 18 movq 0x18(%rax,%rcx,2), %rdx + // 41: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 46: 48 89 ef movq %rbp, %rdi + // 49: 48 89 de movq %rbx, %rsi + // 4c: 31 c9 xorl %ecx, %ecx + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: R_X86_64_GOTPCRELX _PySuper_Lookup-0x4 + // 54: 49 89 c7 movq %rax, %r15 + // 57: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 65: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: R_X86_64_REX_GOTPCRELX PySuper_Type-0x4 + // 6c: 8b 08 movl (%rax), %ecx + // 6e: 85 c9 testl %ecx, %ecx + // 70: 78 13 js 0x85 <_JIT_ENTRY+0x85> + // 72: ff c9 decl %ecx + // 74: 89 08 movl %ecx, (%rax) + // 76: 75 0d jne 0x85 <_JIT_ENTRY+0x85> + // 78: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_REX_GOTPCRELX PySuper_Type-0x4 + // 7f: ff 15 00 00 00 00 callq *(%rip) # 0x85 <_JIT_ENTRY+0x85> + // 0000000000000081: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 85: 8b 45 00 movl (%rbp), %eax + // 88: 85 c0 testl %eax, %eax + // 8a: 78 10 js 0x9c <_JIT_ENTRY+0x9c> + // 8c: ff c8 decl %eax + // 8e: 89 45 00 movl %eax, (%rbp) + // 91: 75 09 jne 0x9c <_JIT_ENTRY+0x9c> + // 93: 48 89 ef movq %rbp, %rdi + // 96: ff 15 00 00 00 00 callq *(%rip) # 0x9c <_JIT_ENTRY+0x9c> + // 0000000000000098: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 9c: 8b 03 movl (%rbx), %eax + // 9e: 85 c0 testl %eax, %eax + // a0: 78 0f js 0xb1 <_JIT_ENTRY+0xb1> + // a2: ff c8 decl %eax + // a4: 89 03 movl %eax, (%rbx) + // a6: 75 09 jne 0xb1 <_JIT_ENTRY+0xb1> + // a8: 48 89 df movq %rbx, %rdi + // ab: ff 15 00 00 00 00 callq *(%rip) # 0xb1 <_JIT_ENTRY+0xb1> + // 00000000000000ad: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b1: 4d 85 ff testq %r15, %r15 + // b4: 74 0f je 0xc5 <_JIT_ENTRY+0xc5> + // b6: 4d 89 7d e8 movq %r15, -0x18(%r13) + // ba: 49 83 c5 f0 addq $-0x10, %r13 + // be: 5d popq %rbp + // bf: ff 25 00 00 00 00 jmpq *(%rip) # 0xc5 <_JIT_ENTRY+0xc5> + // 00000000000000c1: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // c5: 49 83 c5 e8 addq $-0x18, %r13 + // c9: 5d popq %rbp + // ca: ff 25 00 00 00 00 jmpq *(%rip) # 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000cc: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[208] = { + 0x55, 0x49, 0x8b, 0x45, 0xe8, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x49, 0x8b, + 0x6d, 0xf0, 0x48, 0x8b, 0x45, 0x08, 0xf6, 0x80, + 0xab, 0x00, 0x00, 0x00, 0x80, 0x75, 0x07, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xe1, 0xfc, 0x48, 0x8b, 0x54, 0x48, + 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xef, 0x48, 0x89, 0xde, 0x31, 0xc9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc7, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x13, 0xff, 0xc9, 0x89, 0x08, 0x75, 0x0d, + 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x45, 0x00, + 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x89, 0x45, + 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, + 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, + 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x85, 0xff, 0x74, 0x0f, 0x4d, 0x89, + 0x7d, 0xe8, 0x49, 0x83, 0xc5, 0xf0, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, + 0xe8, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: JUMP_TARGET + // 10: OPARG + // 18: &_PySuper_Lookup+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + 0x4); + patch_32r(code + 0x35, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x98, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc1, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x2c); +} + +void +emit__LOAD_SUPER_ATTR_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_METHOD.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 49 8b 45 e8 movq -0x18(%r13), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PySuper_Type-0x4 + // 10: 75 11 jne 0x23 <_JIT_ENTRY+0x23> + // 12: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 16: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1a: f6 80 ab 00 00 00 80 testb $-0x80, 0xab(%rax) + // 21: 75 0b jne 0x2e <_JIT_ENTRY+0x2e> + // 23: 48 83 c4 10 addq $0x10, %rsp + // 27: 5d popq %rbp + // 28: ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 2e: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 32: 49 8b 04 24 movq (%r12), %rax + // 36: 48 8b 40 20 movq 0x20(%rax), %rax + // 3a: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 41: 83 e1 fc andl $-0x4, %ecx + // 44: 48 8b 54 48 18 movq 0x18(%rax,%rcx,2), %rdx + // 49: c7 44 24 0c 00 00 00 00 movl $0x0, 0xc(%rsp) + // 51: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 56: 49 8b 47 08 movq 0x8(%r15), %rax + // 5a: 48 8b 80 90 00 00 00 movq 0x90(%rax), %rax + // 61: 31 f6 xorl %esi, %esi + // 63: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: R_X86_64_REX_GOTPCRELX PyObject_GenericGetAttr-0x4 + // 6a: 48 8d 4c 24 0c leaq 0xc(%rsp), %rcx + // 6f: 48 0f 45 ce cmovneq %rsi, %rcx + // 73: 48 89 df movq %rbx, %rdi + // 76: 4c 89 fe movq %r15, %rsi + // 79: ff 15 00 00 00 00 callq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: R_X86_64_GOTPCRELX _PySuper_Lookup-0x4 + // 7f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 84: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8d: 48 85 c0 testq %rax, %rax + // 90: 0f 84 9a 00 00 00 je 0x130 <_JIT_ENTRY+0x130> + // 96: 83 7c 24 0c 00 cmpl $0x0, 0xc(%rsp) + // 9b: 75 3b jne 0xd8 <_JIT_ENTRY+0xd8> + // 9d: 49 83 c5 f8 addq $-0x8, %r13 + // a1: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a6: 41 8b 0f movl (%r15), %ecx + // a9: 85 c9 testl %ecx, %ecx + // ab: 78 16 js 0xc3 <_JIT_ENTRY+0xc3> + // ad: ff c9 decl %ecx + // af: 41 89 0f movl %ecx, (%r15) + // b2: 75 0f jne 0xc3 <_JIT_ENTRY+0xc3> + // b4: 4c 89 ff movq %r15, %rdi + // b7: 49 89 c7 movq %rax, %r15 + // ba: ff 15 00 00 00 00 callq *(%rip) # 0xc0 <_JIT_ENTRY+0xc0> + // 00000000000000bc: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // c0: 4c 89 f8 movq %r15, %rax + // c3: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // c8: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d1: 49 83 c5 08 addq $0x8, %r13 + // d5: 45 31 ff xorl %r15d, %r15d + // d8: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: R_X86_64_REX_GOTPCRELX PySuper_Type-0x4 + // df: 8b 11 movl (%rcx), %edx + // e1: 85 d2 testl %edx, %edx + // e3: 78 19 js 0xfe <_JIT_ENTRY+0xfe> + // e5: ff ca decl %edx + // e7: 89 11 movl %edx, (%rcx) + // e9: 75 13 jne 0xfe <_JIT_ENTRY+0xfe> + // eb: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xf2 <_JIT_ENTRY+0xf2> + // 00000000000000ee: R_X86_64_REX_GOTPCRELX PySuper_Type-0x4 + // f2: 48 89 c5 movq %rax, %rbp + // f5: ff 15 00 00 00 00 callq *(%rip) # 0xfb <_JIT_ENTRY+0xfb> + // 00000000000000f7: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // fb: 48 89 e8 movq %rbp, %rax + // fe: 8b 0b movl (%rbx), %ecx + // 100: 85 c9 testl %ecx, %ecx + // 102: 78 15 js 0x119 <_JIT_ENTRY+0x119> + // 104: ff c9 decl %ecx + // 106: 89 0b movl %ecx, (%rbx) + // 108: 75 0f jne 0x119 <_JIT_ENTRY+0x119> + // 10a: 48 89 df movq %rbx, %rdi + // 10d: 48 89 c3 movq %rax, %rbx + // 110: ff 15 00 00 00 00 callq *(%rip) # 0x116 <_JIT_ENTRY+0x116> + // 0000000000000112: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 116: 48 89 d8 movq %rbx, %rax + // 119: 49 89 45 e8 movq %rax, -0x18(%r13) + // 11d: 4d 89 7d f0 movq %r15, -0x10(%r13) + // 121: 49 83 c5 f8 addq $-0x8, %r13 + // 125: 48 83 c4 10 addq $0x10, %rsp + // 129: 5d popq %rbp + // 12a: ff 25 00 00 00 00 jmpq *(%rip) # 0x130 <_JIT_ENTRY+0x130> + // 000000000000012c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 130: 48 83 c4 10 addq $0x10, %rsp + // 134: 5d popq %rbp + // 135: ff 25 00 00 00 00 jmpq *(%rip) # 0x13b <_JIT_ENTRY+0x13b> + // 0000000000000137: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[315] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x49, 0x8b, 0x45, + 0xe8, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x11, 0x49, 0x8b, 0x5d, 0xf0, 0x48, 0x8b, + 0x43, 0x08, 0xf6, 0x80, 0xab, 0x00, 0x00, 0x00, + 0x80, 0x75, 0x0b, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x7d, 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xe1, 0xfc, 0x48, 0x8b, 0x54, 0x48, + 0x18, 0xc7, 0x44, 0x24, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, + 0x47, 0x08, 0x48, 0x8b, 0x80, 0x90, 0x00, 0x00, + 0x00, 0x31, 0xf6, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x4c, 0x24, 0x0c, 0x48, + 0x0f, 0x45, 0xce, 0x48, 0x89, 0xdf, 0x4c, 0x89, + 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x0f, 0x84, 0x9a, 0x00, 0x00, 0x00, 0x83, 0x7c, + 0x24, 0x0c, 0x00, 0x75, 0x3b, 0x49, 0x83, 0xc5, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x41, 0x8b, + 0x0f, 0x85, 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x41, + 0x89, 0x0f, 0x75, 0x0f, 0x4c, 0x89, 0xff, 0x49, + 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x45, 0x31, 0xff, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x19, 0xff, 0xca, 0x89, + 0x11, 0x75, 0x13, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xc5, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xe8, 0x8b, 0x0b, + 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0b, + 0x75, 0x0f, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd8, 0x49, 0x89, 0x45, 0xe8, 0x4d, 0x89, 0x7d, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: JUMP_TARGET + // 10: OPARG + // 18: &PyObject_GenericGetAttr+0x0 + // 20: &_PySuper_Lookup+0x0 + // 28: &_Py_Dealloc+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + const unsigned char data_body[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&PyObject_GenericGetAttr); + patch_64(data + 0x20, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_32r(code + 0x3d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xbc, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xee, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x112, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x12c, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x137, (uintptr_t)data + 0x34); +} + +void +emit__MAKE_CALLARGS_A_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CALLARGS_A_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 5: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 9: 48 8b 43 08 movq 0x8(%rbx), %rax + // d: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_REX_GOTPCRELX PyTuple_Type-0x4 + // 14: 0f 84 81 00 00 00 je 0x9b <_JIT_ENTRY+0x9b> + // 1a: 49 8b 75 e0 movq -0x20(%r13), %rsi + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 4c 89 f7 movq %r14, %rdi + // 26: 48 89 da movq %rbx, %rdx + // 29: ff 15 00 00 00 00 callq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _Py_Check_ArgsIterable-0x4 + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 69 js 0xaa <_JIT_ENTRY+0xaa> + // 41: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 46: 48 89 df movq %rbx, %rdi + // 49: ff 15 00 00 00 00 callq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: R_X86_64_GOTPCRELX PySequence_Tuple-0x4 + // 4f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 54: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5d: 48 85 c0 testq %rax, %rax + // 60: 74 48 je 0xaa <_JIT_ENTRY+0xaa> + // 62: 49 83 c5 f0 addq $-0x10, %r13 + // 66: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6b: 8b 0b movl (%rbx), %ecx + // 6d: 85 c9 testl %ecx, %ecx + // 6f: 78 15 js 0x86 <_JIT_ENTRY+0x86> + // 71: ff c9 decl %ecx + // 73: 89 0b movl %ecx, (%rbx) + // 75: 75 0f jne 0x86 <_JIT_ENTRY+0x86> + // 77: 48 89 df movq %rbx, %rdi + // 7a: 48 89 c3 movq %rax, %rbx + // 7d: ff 15 00 00 00 00 callq *(%rip) # 0x83 <_JIT_ENTRY+0x83> + // 000000000000007f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 83: 48 89 d8 movq %rbx, %rax + // 86: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 8b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 94: 49 83 c5 10 addq $0x10, %r13 + // 98: 48 89 c3 movq %rax, %rbx + // 9b: 49 89 5d f0 movq %rbx, -0x10(%r13) + // 9f: 4d 89 7d f8 movq %r15, -0x8(%r13) + // a3: 58 popq %rax + // a4: ff 25 00 00 00 00 jmpq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // aa: 58 popq %rax + // ab: ff 25 00 00 00 00 jmpq *(%rip) # 0xb1 <_JIT_ENTRY+0xb1> + // 00000000000000ad: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[177] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf0, 0x4d, 0x8b, 0x7d, + 0xf8, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x84, 0x81, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x75, 0xe0, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf7, 0x48, 0x89, + 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, + 0x69, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x48, 0x49, 0x83, 0xc5, 0xf0, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x0b, 0x85, 0xc9, 0x78, + 0x15, 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, + 0x89, 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xd8, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0x10, + 0x48, 0x89, 0xc3, 0x49, 0x89, 0x5d, 0xf0, 0x4d, + 0x89, 0x7d, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: &_Py_Check_ArgsIterable+0x0 + // 10: &PySequence_Tuple+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Check_ArgsIterable); + patch_64(data + 0x10, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0x24); +} + +void +emit__MAKE_CELL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CELL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8: 0f b7 c3 movzwl %bx, %eax + // b: 49 8b 7c c4 50 movq 0x50(%r12,%rax,8), %rdi + // 10: ff 15 00 00 00 00 callq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: R_X86_64_GOTPCRELX PyCell_New-0x4 + // 16: 48 85 c0 testq %rax, %rax + // 19: 74 38 je 0x53 <_JIT_ENTRY+0x53> + // 1b: 0f b7 cb movzwl %bx, %ecx + // 1e: 49 8b 7c cc 50 movq 0x50(%r12,%rcx,8), %rdi + // 23: 49 89 44 cc 50 movq %rax, 0x50(%r12,%rcx,8) + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 48 85 ff testq %rdi, %rdi + // 30: 74 0c je 0x3e <_JIT_ENTRY+0x3e> + // 32: 8b 07 movl (%rdi), %eax + // 34: 85 c0 testl %eax, %eax + // 36: 78 06 js 0x3e <_JIT_ENTRY+0x3e> + // 38: ff c8 decl %eax + // 3a: 89 07 movl %eax, (%rdi) + // 3c: 74 1c je 0x5a <_JIT_ENTRY+0x5a> + // 3e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 43: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4c: 58 popq %rax + // 4d: ff 25 00 00 00 00 jmpq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 53: 58 popq %rax + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 5a: ff 15 00 00 00 00 callq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 60: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 65: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6e: 58 popq %rax + // 6f: ff 25 00 00 00 00 jmpq *(%rip) # 0x75 <_JIT_ENTRY+0x75> + // 0000000000000071: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[111] = { + 0x50, 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xb7, 0xc3, 0x49, 0x8b, 0x7c, 0xc4, 0x50, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x38, 0x0f, 0xb7, 0xcb, 0x49, 0x8b, + 0x7c, 0xcc, 0x50, 0x49, 0x89, 0x44, 0xcc, 0x50, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, 0xff, + 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x1c, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPARG + // 8: &PyCell_New+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCell_New); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x1c); +} + +void +emit__MAKE_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_FUNCTION.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 49 8b 74 24 18 movq 0x18(%r12), %rsi + // f: 48 89 df movq %rbx, %rdi + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCRELX PyFunction_New-0x4 + // 18: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 1e: 49 89 c7 movq %rax, %r15 + // 21: 8b 03 movl (%rbx), %eax + // 23: 85 c0 testl %eax, %eax + // 25: 78 06 js 0x2d <_JIT_ENTRY+0x2d> + // 27: ff c8 decl %eax + // 29: 89 03 movl %eax, (%rbx) + // 2b: 74 2e je 0x5b <_JIT_ENTRY+0x5b> + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 4d 85 ff testq %r15, %r15 + // 3e: 74 37 je 0x77 <_JIT_ENTRY+0x77> + // 40: 8b 73 5c movl 0x5c(%rbx), %esi + // 43: 4c 89 ff movq %r15, %rdi + // 46: ff 15 00 00 00 00 callq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: R_X86_64_GOTPCRELX _PyFunction_SetVersion-0x4 + // 4c: 4d 89 7d 00 movq %r15, (%r13) + // 50: 49 83 c5 08 addq $0x8, %r13 + // 54: 58 popq %rax + // 55: ff 25 00 00 00 00 jmpq *(%rip) # 0x5b <_JIT_ENTRY+0x5b> + // 0000000000000057: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 5b: 48 89 df movq %rbx, %rdi + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 64: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 69: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 72: 4d 85 ff testq %r15, %r15 + // 75: 75 c9 jne 0x40 <_JIT_ENTRY+0x40> + // 77: 58 popq %rax + // 78: ff 25 00 00 00 00 jmpq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[126] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x49, 0x8b, 0x74, 0x24, 0x18, 0x48, + 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0x44, 0x24, 0x40, 0xf8, 0x49, 0x89, + 0xc7, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x2e, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x74, 0x37, + 0x8b, 0x73, 0x5c, 0x4c, 0x89, 0xff, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x7d, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x85, 0xff, 0x75, 0xc9, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyFunction_New+0x0 + // 8: &_PyFunction_SetVersion+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFunction_New); + patch_64(data + 0x8, (uintptr_t)&_PyFunction_SetVersion); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x57, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x1c); +} + +void +emit__MAKE_WARM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_WARM.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_EXECUTOR-0x4 + // 7: c6 40 23 01 movb $0x1, 0x23(%rax) + // b: 49 8b 46 10 movq 0x10(%r14), %rax + // f: 48 ff 88 20 67 03 00 decq 0x36720(%rax) + // 16: 74 06 je 0x1e <_JIT_ENTRY+0x1e> + // 18: ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1e: f0 lock + // 1f: 49 81 4e 18 80 00 00 00 orq $0x80, 0x18(%r14) + // 27: ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[39] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc6, + 0x40, 0x23, 0x01, 0x49, 0x8b, 0x46, 0x10, 0x48, + 0xff, 0x88, 0x20, 0x67, 0x03, 0x00, 0x74, 0x06, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x49, + 0x81, 0x4e, 0x18, 0x80, 0x00, 0x00, 0x00, + }; + // 0: EXECUTOR + // 8: CONTINUE + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); +} + +void +emit__MAP_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAP_ADD.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 49 8b 75 f0 movq -0x10(%r13), %rsi + // c: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 10: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // 17: 48 29 c1 subq %rax, %rcx + // 1a: 49 8b 7c cd 00 movq (%r13,%rcx,8), %rdi + // 1f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_GOTPCRELX _PyDict_SetItem_Take2-0x4 + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 49 83 c5 f0 addq $-0x10, %r13 + // 3c: 85 c0 testl %eax, %eax + // 3e: 74 07 je 0x47 <_JIT_ENTRY+0x47> + // 40: 58 popq %rax + // 41: ff 25 00 00 00 00 jmpq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 47: 58 popq %rax + // 48: ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[72] = { + 0x50, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x75, 0xf0, 0x49, 0x8b, 0x55, 0xf8, + 0x48, 0xc7, 0xc1, 0xfe, 0xff, 0xff, 0xff, 0x48, + 0x29, 0xc1, 0x49, 0x8b, 0x7c, 0xcd, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf0, 0x85, 0xc0, 0x74, 0x07, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPARG + // 8: &_PyDict_SetItem_Take2+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0xc); +} + +void +emit__MATCH_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_CLASS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 4c 89 f7 movq %r14, %rdi + // 4: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 8: 49 8b 5d e8 movq -0x18(%r13), %rbx + // c: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 1c: 48 89 de movq %rbx, %rsi + // 1f: 48 89 ea movq %rbp, %rdx + // 22: 4d 89 f8 movq %r15, %r8 + // 25: ff 15 00 00 00 00 callq *(%rip) # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: R_X86_64_GOTPCRELX _PyEval_MatchClass-0x4 + // 2b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 30: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 39: 8b 0b movl (%rbx), %ecx + // 3b: 85 c9 testl %ecx, %ecx + // 3d: 78 15 js 0x54 <_JIT_ENTRY+0x54> + // 3f: ff c9 decl %ecx + // 41: 89 0b movl %ecx, (%rbx) + // 43: 75 0f jne 0x54 <_JIT_ENTRY+0x54> + // 45: 48 89 df movq %rbx, %rdi + // 48: 48 89 c3 movq %rax, %rbx + // 4b: ff 15 00 00 00 00 callq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 51: 48 89 d8 movq %rbx, %rax + // 54: 8b 4d 00 movl (%rbp), %ecx + // 57: 85 c9 testl %ecx, %ecx + // 59: 78 16 js 0x71 <_JIT_ENTRY+0x71> + // 5b: ff c9 decl %ecx + // 5d: 89 4d 00 movl %ecx, (%rbp) + // 60: 75 0f jne 0x71 <_JIT_ENTRY+0x71> + // 62: 48 89 ef movq %rbp, %rdi + // 65: 48 89 c3 movq %rax, %rbx + // 68: ff 15 00 00 00 00 callq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 6e: 48 89 d8 movq %rbx, %rax + // 71: 41 8b 0f movl (%r15), %ecx + // 74: 85 c9 testl %ecx, %ecx + // 76: 78 07 js 0x7f <_JIT_ENTRY+0x7f> + // 78: ff c9 decl %ecx + // 7a: 41 89 0f movl %ecx, (%r15) + // 7d: 74 14 je 0x93 <_JIT_ENTRY+0x93> + // 7f: 48 85 c0 testq %rax, %rax + // 82: 74 23 je 0xa7 <_JIT_ENTRY+0xa7> + // 84: 49 89 45 e8 movq %rax, -0x18(%r13) + // 88: 49 83 c5 f0 addq $-0x10, %r13 + // 8c: 5d popq %rbp + // 8d: ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 93: 4c 89 ff movq %r15, %rdi + // 96: 48 89 c3 movq %rax, %rbx + // 99: ff 15 00 00 00 00 callq *(%rip) # 0x9f <_JIT_ENTRY+0x9f> + // 000000000000009b: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 9f: 48 89 d8 movq %rbx, %rax + // a2: 48 85 c0 testq %rax, %rax + // a5: 75 dd jne 0x84 <_JIT_ENTRY+0x84> + // a7: 49 8b 4e 70 movq 0x70(%r14), %rcx + // ab: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // b2: 48 85 c9 testq %rcx, %rcx + // b5: 74 cd je 0x84 <_JIT_ENTRY+0x84> + // b7: 48 83 79 08 00 cmpq $0x0, 0x8(%rcx) + // bc: 74 c6 je 0x84 <_JIT_ENTRY+0x84> + // be: 49 83 c5 e8 addq $-0x18, %r13 + // c2: 5d popq %rbp + // c3: ff 25 00 00 00 00 jmpq *(%rip) # 0xc9 <_JIT_ENTRY+0xc9> + // 00000000000000c5: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[201] = { + 0x55, 0x4c, 0x89, 0xf7, 0x4d, 0x8b, 0x7d, 0xf8, + 0x49, 0x8b, 0x5d, 0xe8, 0x49, 0x8b, 0x6d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xde, 0x48, + 0x89, 0xea, 0x4d, 0x89, 0xf8, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x15, 0xff, + 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x8b, 0x4d, 0x00, 0x85, + 0xc9, 0x78, 0x16, 0xff, 0xc9, 0x89, 0x4d, 0x00, + 0x75, 0x0f, 0x48, 0x89, 0xef, 0x48, 0x89, 0xc3, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xd8, 0x41, 0x8b, 0x0f, 0x85, 0xc9, 0x78, 0x07, + 0xff, 0xc9, 0x41, 0x89, 0x0f, 0x74, 0x14, 0x48, + 0x85, 0xc0, 0x74, 0x23, 0x49, 0x89, 0x45, 0xe8, + 0x49, 0x83, 0xc5, 0xf0, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xff, 0x48, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, 0xdd, 0x49, + 0x8b, 0x4e, 0x70, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, 0xcd, 0x48, + 0x83, 0x79, 0x08, 0x00, 0x74, 0xc6, 0x49, 0x83, + 0xc5, 0xe8, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &_PyEval_MatchClass+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: &_Py_NoneStruct+0x0 + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_MatchClass); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x18, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xae, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + 0x24); +} + +void +emit__MATCH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_KEYS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 5: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 4c 89 f7 movq %r14, %rdi + // 11: ff 15 00 00 00 00 callq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _PyEval_MatchKeys-0x4 + // 17: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 25: 48 85 c0 testq %rax, %rax + // 28: 74 0f je 0x39 <_JIT_ENTRY+0x39> + // 2a: 49 89 45 00 movq %rax, (%r13) + // 2e: 49 83 c5 08 addq $0x8, %r13 + // 32: 58 popq %rax + // 33: ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 39: 58 popq %rax + // 3a: ff 25 00 00 00 00 jmpq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[64] = { + 0x50, 0x49, 0x8b, 0x75, 0xf0, 0x49, 0x8b, 0x55, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_MatchKeys+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_MatchKeys); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0xc); +} + +void +emit__MATCH_MAPPING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_MAPPING.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: f6 80 a8 00 00 00 40 testb $0x40, 0xa8(%rax) + // f: 75 15 jne 0x26 <_JIT_ENTRY+0x26> + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 18: 49 89 45 00 movq %rax, (%r13) + // 1c: 49 83 c5 08 addq $0x8, %r13 + // 20: ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 26: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 2d: 49 89 45 00 movq %rax, (%r13) + // 31: 49 83 c5 08 addq $0x8, %r13 + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[53] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0xf6, 0x80, 0xa8, 0x00, 0x00, 0x00, 0x40, 0x75, + 0x15, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: CONTINUE + // 10: &_Py_TrueStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0xc); +} + +void +emit__MATCH_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_SEQUENCE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: f6 80 a8 00 00 00 20 testb $0x20, 0xa8(%rax) + // f: 75 15 jne 0x26 <_JIT_ENTRY+0x26> + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 18: 49 89 45 00 movq %rax, (%r13) + // 1c: 49 83 c5 08 addq $0x8, %r13 + // 20: ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 26: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 2d: 49 89 45 00 movq %rax, (%r13) + // 31: 49 83 c5 08 addq $0x8, %r13 + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[53] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0xf6, 0x80, 0xa8, 0x00, 0x00, 0x00, 0x20, 0x75, + 0x15, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: CONTINUE + // 10: &_Py_TrueStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0xc); +} + +void +emit__MAYBE_EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // d: 29 d0 subl %edx, %eax + // f: 48 98 cltq + // 11: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 16: 48 8b 71 08 movq 0x8(%rcx), %rsi + // 1a: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 21: 74 07 je 0x2a <_JIT_ENTRY+0x2a> + // 23: 58 popq %rax + // 24: ff 25 00 00 00 00 jmpq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 2a: f7 d2 notl %edx + // 2c: 48 63 d2 movslq %edx, %rdx + // 2f: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 35: 75 ec jne 0x23 <_JIT_ENTRY+0x23> + // 37: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 3b: 8b 3e movl (%rsi), %edi + // 3d: 85 ff testl %edi, %edi + // 3f: 78 04 js 0x45 <_JIT_ENTRY+0x45> + // 41: ff c7 incl %edi + // 43: 89 3e movl %edi, (%rsi) + // 45: 49 89 74 d5 00 movq %rsi, (%r13,%rdx,8) + // 4a: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 4e: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 53: 8b 11 movl (%rcx), %edx + // 55: 85 d2 testl %edx, %edx + // 57: 78 04 js 0x5d <_JIT_ENTRY+0x5d> + // 59: ff c2 incl %edx + // 5b: 89 11 movl %edx, (%rcx) + // 5d: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 62: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 67: 8b 07 movl (%rdi), %eax + // 69: 85 c0 testl %eax, %eax + // 6b: 78 06 js 0x73 <_JIT_ENTRY+0x73> + // 6d: ff c8 decl %eax + // 6f: 89 07 movl %eax, (%rdi) + // 71: 74 15 je 0x88 <_JIT_ENTRY+0x88> + // 73: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 78: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 81: 58 popq %rax + // 82: ff 25 00 00 00 00 jmpq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 88: ff 15 00 00 00 00 callq *(%rip) # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 8e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 93: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9c: 58 popq %rax + // 9d: ff 25 00 00 00 00 jmpq *(%rip) # 0xa3 <_JIT_ENTRY+0xa3> + // 000000000000009f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[157] = { + 0x50, 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xd0, 0x48, + 0x98, 0x49, 0x8b, 0x4c, 0xc5, 0x00, 0x48, 0x8b, + 0x71, 0x08, 0x48, 0x3b, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd2, 0x48, 0x63, 0xd2, 0x49, + 0x83, 0x7c, 0xd5, 0x00, 0x00, 0x75, 0xec, 0x48, + 0x8b, 0x71, 0x18, 0x8b, 0x3e, 0x85, 0xff, 0x78, + 0x04, 0xff, 0xc7, 0x89, 0x3e, 0x49, 0x89, 0x74, + 0xd5, 0x00, 0x48, 0x8b, 0x49, 0x10, 0x49, 0x8b, + 0x7c, 0xc5, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4c, + 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x07, 0x74, 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0x14); +} + +void +emit__MAYBE_EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD_KW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: b8 fd ff ff ff movl $0xfffffffd, %eax # imm = 0xFFFFFFFD + // 11: 29 d0 subl %edx, %eax + // 13: 48 98 cltq + // 15: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 1a: 48 8b 71 08 movq 0x8(%rcx), %rsi + // 1e: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_REX_GOTPCRELX PyMethod_Type-0x4 + // 25: 74 0b je 0x32 <_JIT_ENTRY+0x32> + // 27: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 2b: 58 popq %rax + // 2c: ff 25 00 00 00 00 jmpq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 32: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 37: 29 d6 subl %edx, %esi + // 39: 48 63 d6 movslq %esi, %rdx + // 3c: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 42: 75 e3 jne 0x27 <_JIT_ENTRY+0x27> + // 44: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 48: 44 8b 06 movl (%rsi), %r8d + // 4b: 48 89 cf movq %rcx, %rdi + // 4e: 45 85 c0 testl %r8d, %r8d + // 51: 78 0b js 0x5e <_JIT_ENTRY+0x5e> + // 53: 41 ff c0 incl %r8d + // 56: 44 89 06 movl %r8d, (%rsi) + // 59: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 5e: 49 89 74 d5 00 movq %rsi, (%r13,%rdx,8) + // 63: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 67: 8b 11 movl (%rcx), %edx + // 69: 85 d2 testl %edx, %edx + // 6b: 78 04 js 0x71 <_JIT_ENTRY+0x71> + // 6d: ff c2 incl %edx + // 6f: 89 11 movl %edx, (%rcx) + // 71: 49 89 4c c5 00 movq %rcx, (%r13,%rax,8) + // 76: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7b: 8b 07 movl (%rdi), %eax + // 7d: 85 c0 testl %eax, %eax + // 7f: 78 0c js 0x8d <_JIT_ENTRY+0x8d> + // 81: ff c8 decl %eax + // 83: 89 07 movl %eax, (%rdi) + // 85: 75 06 jne 0x8d <_JIT_ENTRY+0x8d> + // 87: ff 15 00 00 00 00 callq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 8d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 92: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9b: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 9f: 58 popq %rax + // a0: ff 25 00 00 00 00 jmpq *(%rip) # 0xa6 <_JIT_ENTRY+0xa6> + // 00000000000000a2: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[160] = { + 0x50, 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x5d, 0xf8, 0xb8, 0xfd, 0xff, 0xff, + 0xff, 0x29, 0xd0, 0x48, 0x98, 0x49, 0x8b, 0x4c, + 0xc5, 0x00, 0x48, 0x8b, 0x71, 0x08, 0x48, 0x3b, + 0x35, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0b, 0x49, + 0x89, 0x5d, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xbe, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xd6, 0x48, 0x63, 0xd6, 0x49, 0x83, 0x7c, 0xd5, + 0x00, 0x00, 0x75, 0xe3, 0x48, 0x8b, 0x71, 0x18, + 0x44, 0x8b, 0x06, 0x48, 0x89, 0xcf, 0x45, 0x85, + 0xc0, 0x78, 0x0b, 0x41, 0xff, 0xc0, 0x44, 0x89, + 0x06, 0x49, 0x8b, 0x7c, 0xc5, 0x00, 0x49, 0x89, + 0x74, 0xd5, 0x00, 0x48, 0x8b, 0x49, 0x10, 0x8b, + 0x11, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, 0x89, + 0x11, 0x49, 0x89, 0x4c, 0xc5, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0xf8, 0x58, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0x14); +} + +void +emit__NOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _NOP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: ff 25 00 00 00 00 jmpq *(%rip) # 0x6 <_JIT_ENTRY+0x6> + // 0000000000000002: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 +} + +void +emit__POP_EXCEPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_EXCEPT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 48 8b 39 movq (%rcx), %rdi + // 11: 31 d2 xorl %edx, %edx + // 13: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 1a: 48 0f 45 d0 cmovneq %rax, %rdx + // 1e: 48 89 11 movq %rdx, (%rcx) + // 21: 48 85 ff testq %rdi, %rdi + // 24: 74 12 je 0x38 <_JIT_ENTRY+0x38> + // 26: 8b 07 movl (%rdi), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 0c js 0x38 <_JIT_ENTRY+0x38> + // 2c: ff c8 decl %eax + // 2e: 89 07 movl %eax, (%rdi) + // 30: 75 06 jne 0x38 <_JIT_ENTRY+0x38> + // 32: ff 15 00 00 00 00 callq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 38: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 58 popq %rax + // 4b: ff 25 00 00 00 00 jmpq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[75] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x8b, 0x4e, + 0x78, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x39, 0x31, 0xd2, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x0f, 0x45, 0xd0, 0x48, 0x89, + 0x11, 0x48, 0x85, 0xff, 0x74, 0x12, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x58, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); +} + +void +emit__POP_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 8b 07 movl (%rdi), %eax + // b: 85 c0 testl %eax, %eax + // d: 78 06 js 0x15 <_JIT_ENTRY+0x15> + // f: ff c8 decl %eax + // 11: 89 07 movl %eax, (%rdi) + // 13: 74 07 je 0x1c <_JIT_ENTRY+0x1c> + // 15: 58 popq %rax + // 16: ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1c: ff 15 00 00 00 00 callq *(%rip) # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 22: 58 popq %rax + // 23: ff 25 00 00 00 00 jmpq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[35] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x07, 0x74, 0x07, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); +} + +void +emit__POP_TOP_LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP_LOAD_CONST_INLINE_BORROW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 8b 07 movl (%rdi), %eax + // 10: 85 c0 testl %eax, %eax + // 12: 78 0c js 0x20 <_JIT_ENTRY+0x20> + // 14: ff c8 decl %eax + // 16: 89 07 movl %eax, (%rdi) + // 18: 75 06 jne 0x20 <_JIT_ENTRY+0x20> + // 1a: ff 15 00 00 00 00 callq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 20: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 25: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 35: 49 89 45 00 movq %rax, (%r13) + // 39: 49 83 c5 08 addq $0x8, %r13 + // 3d: 58 popq %rax + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[62] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0x4); +} + +void +emit__PUSH_EXC_INFO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_EXC_INFO.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 8: 48 8b 11 movq (%rcx), %rdx + // b: 8b 30 movl (%rax), %esi + // d: 85 f6 testl %esi, %esi + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c6 incl %esi + // 13: 89 30 movl %esi, (%rax) + // 15: 48 85 d2 testq %rdx, %rdx + // 18: 75 07 jne 0x21 <_JIT_ENTRY+0x21> + // 1a: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 21: 48 89 01 movq %rax, (%rcx) + // 24: 49 89 55 f8 movq %rdx, -0x8(%r13) + // 28: 49 89 45 00 movq %rax, (%r13) + // 2c: 49 83 c5 08 addq $0x8, %r13 + // 30: ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[48] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x8b, 0x4e, 0x78, + 0x48, 0x8b, 0x11, 0x8b, 0x30, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x30, 0x48, 0x85, 0xd2, + 0x75, 0x07, 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x01, 0x49, 0x89, 0x55, 0xf8, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); +} + +void +emit__PUSH_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_FRAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 49 89 46 48 movq %rax, 0x48(%r14) + // 11: 41 ff 4e 2c decl 0x2c(%r14) + // 15: 4c 8b 68 40 movq 0x40(%rax), %r13 + // 19: 48 c7 40 40 00 00 00 00 movq $0x0, 0x40(%rax) + // 21: 49 89 c4 movq %rax, %r12 + // 24: ff 25 00 00 00 00 jmpq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[36] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x89, 0x46, + 0x48, 0x41, 0xff, 0x4e, 0x2c, 0x4c, 0x8b, 0x68, + 0x40, 0x48, 0xc7, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0xc4, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 c7 45 00 00 00 00 00 movq $0x0, (%r13) + // 8: 49 83 c5 08 addq $0x8, %r13 + // c: ff 25 00 00 00 00 jmpq *(%rip) # 0x12 <_JIT_ENTRY+0x12> + // 000000000000000e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[12] = { + 0x49, 0xc7, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL_CONDITIONAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL_CONDITIONAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 7: 66 83 e0 01 andw $0x1, %ax + // b: 74 08 je 0x15 <_JIT_ENTRY+0x15> + // d: 49 c7 45 00 00 00 00 00 movq $0x0, (%r13) + // 15: 0f b7 c0 movzwl %ax, %eax + // 18: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 1d: ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[29] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x83, 0xe0, 0x01, 0x74, 0x08, 0x49, 0xc7, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc0, + 0x4d, 0x8d, 0x6c, 0xc5, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__PY_FRAME_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_GENERAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 e8 movq %r13, %rax + // 4: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // b: 8d 14 cd 00 00 00 00 leal (,%rcx,8), %edx + // 12: 4c 89 ef movq %r13, %rdi + // 15: 48 29 d7 subq %rdx, %rdi + // 18: 89 ca movl %ecx, %edx + // 1a: f7 d2 notl %edx + // 1c: 48 63 d2 movslq %edx, %rdx + // 1f: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 24: 29 ce subl %ecx, %esi + // 26: 4c 63 ee movslq %esi, %r13 + // 29: 45 31 c0 xorl %r8d, %r8d + // 2c: 31 f6 xorl %esi, %esi + // 2e: 48 83 3c d0 00 cmpq $0x0, (%rax,%rdx,8) + // 33: 4a 8b 14 e8 movq (%rax,%r13,8), %rdx + // 37: 41 0f 94 c0 sete %r8b + // 3b: 40 0f 95 c6 setne %sil + // 3f: 01 ce addl %ecx, %esi + // 41: 4a 8d 0c c7 leaq (%rdi,%r8,8), %rcx + // 45: 48 83 c1 f8 addq $-0x8, %rcx + // 49: 48 8b 7a 30 movq 0x30(%rdx), %rdi + // 4d: f6 47 30 01 testb $0x1, 0x30(%rdi) + // 51: 75 10 jne 0x63 <_JIT_ENTRY+0x63> + // 53: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 57: 8b 3a movl (%rdx), %edi + // 59: 85 ff testl %edi, %edi + // 5b: 78 08 js 0x65 <_JIT_ENTRY+0x65> + // 5d: ff c7 incl %edi + // 5f: 89 3a movl %edi, (%rdx) + // 61: eb 02 jmp 0x65 <_JIT_ENTRY+0x65> + // 63: 31 d2 xorl %edx, %edx + // 65: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 6a: 41 89 f0 movl %esi, %r8d + // 6d: 4a 8b 34 e8 movq (%rax,%r13,8), %rsi + // 71: 49 c1 e5 03 shlq $0x3, %r13 + // 75: 4c 89 24 24 movq %r12, (%rsp) + // 79: 4c 89 f7 movq %r14, %rdi + // 7c: 45 31 c9 xorl %r9d, %r9d + // 7f: ff 15 00 00 00 00 callq *(%rip) # 0x85 <_JIT_ENTRY+0x85> + // 0000000000000081: R_X86_64_GOTPCRELX _PyEvalFramePushAndInit-0x4 + // 85: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // 8a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 93: 48 85 c0 testq %rax, %rax + // 96: 74 0f je 0xa7 <_JIT_ENTRY+0xa7> + // 98: 49 89 45 00 movq %rax, (%r13) + // 9c: 49 83 c5 08 addq $0x8, %r13 + // a0: 58 popq %rax + // a1: ff 25 00 00 00 00 jmpq *(%rip) # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // a7: 58 popq %rax + // a8: ff 25 00 00 00 00 jmpq *(%rip) # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[174] = { + 0x50, 0x4c, 0x89, 0xe8, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8d, 0x14, 0xcd, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xef, 0x48, 0x29, 0xd7, + 0x89, 0xca, 0xf7, 0xd2, 0x48, 0x63, 0xd2, 0xbe, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xce, 0x4c, 0x63, + 0xee, 0x45, 0x31, 0xc0, 0x31, 0xf6, 0x48, 0x83, + 0x3c, 0xd0, 0x00, 0x4a, 0x8b, 0x14, 0xe8, 0x41, + 0x0f, 0x94, 0xc0, 0x40, 0x0f, 0x95, 0xc6, 0x01, + 0xce, 0x4a, 0x8d, 0x0c, 0xc7, 0x48, 0x83, 0xc1, + 0xf8, 0x48, 0x8b, 0x7a, 0x30, 0xf6, 0x47, 0x30, + 0x01, 0x75, 0x10, 0x48, 0x8b, 0x52, 0x10, 0x8b, + 0x3a, 0x85, 0xff, 0x78, 0x08, 0xff, 0xc7, 0x89, + 0x3a, 0xeb, 0x02, 0x31, 0xd2, 0x49, 0x89, 0x44, + 0x24, 0x40, 0x41, 0x89, 0xf0, 0x4a, 0x8b, 0x34, + 0xe8, 0x49, 0xc1, 0xe5, 0x03, 0x4c, 0x89, 0x24, + 0x24, 0x4c, 0x89, 0xf7, 0x45, 0x31, 0xc9, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x03, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0f, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x81, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x14); +} + +void +emit__PY_FRAME_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_KW.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 e8 movq %r13, %rax + // 4: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // b: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 10: 29 ca subl %ecx, %edx + // 12: 4c 63 ea movslq %edx, %r13 + // 15: ba fd ff ff ff movl $0xfffffffd, %edx # imm = 0xFFFFFFFD + // 1a: 29 ca subl %ecx, %edx + // 1c: 31 f6 xorl %esi, %esi + // 1e: 45 31 c0 xorl %r8d, %r8d + // 21: 4a 83 3c e8 00 cmpq $0x0, (%rax,%r13,8) + // 26: 48 8b 58 f8 movq -0x8(%rax), %rbx + // 2a: 40 0f 95 c6 setne %sil + // 2e: 41 0f 94 c0 sete %r8b + // 32: 01 ce addl %ecx, %esi + // 34: f7 d1 notl %ecx + // 36: 48 63 c9 movslq %ecx, %rcx + // 39: 48 8d 0c c8 leaq (%rax,%rcx,8), %rcx + // 3d: 48 63 fa movslq %edx, %rdi + // 40: 48 8b 14 f8 movq (%rax,%rdi,8), %rdx + // 44: 4a 8d 0c c1 leaq (%rcx,%r8,8), %rcx + // 48: 48 83 c1 f8 addq $-0x8, %rcx + // 4c: 4c 8b 42 30 movq 0x30(%rdx), %r8 + // 50: 2b 73 10 subl 0x10(%rbx), %esi + // 53: 41 f6 40 30 01 testb $0x1, 0x30(%r8) + // 58: 75 14 jne 0x6e <_JIT_ENTRY+0x6e> + // 5a: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 5e: 44 8b 02 movl (%rdx), %r8d + // 61: 45 85 c0 testl %r8d, %r8d + // 64: 78 0a js 0x70 <_JIT_ENTRY+0x70> + // 66: 41 ff c0 incl %r8d + // 69: 44 89 02 movl %r8d, (%rdx) + // 6c: eb 02 jmp 0x70 <_JIT_ENTRY+0x70> + // 6e: 31 d2 xorl %edx, %edx + // 70: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 75: 4c 63 c6 movslq %esi, %r8 + // 78: 48 8b 34 f8 movq (%rax,%rdi,8), %rsi + // 7c: 4c 89 24 24 movq %r12, (%rsp) + // 80: 4c 89 f7 movq %r14, %rdi + // 83: 49 89 d9 movq %rbx, %r9 + // 86: ff 15 00 00 00 00 callq *(%rip) # 0x8c <_JIT_ENTRY+0x8c> + // 0000000000000088: R_X86_64_GOTPCRELX _PyEvalFramePushAndInit-0x4 + // 8c: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 92: 8b 0b movl (%rbx), %ecx + // 94: 85 c9 testl %ecx, %ecx + // 96: 78 15 js 0xad <_JIT_ENTRY+0xad> + // 98: ff c9 decl %ecx + // 9a: 89 0b movl %ecx, (%rbx) + // 9c: 75 0f jne 0xad <_JIT_ENTRY+0xad> + // 9e: 48 89 df movq %rbx, %rdi + // a1: 48 89 c3 movq %rax, %rbx + // a4: ff 15 00 00 00 00 callq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // aa: 48 89 d8 movq %rbx, %rax + // ad: 49 c1 e5 03 shlq $0x3, %r13 + // b1: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // b6: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // bf: 48 85 c0 testq %rax, %rax + // c2: 74 0f je 0xd3 <_JIT_ENTRY+0xd3> + // c4: 49 89 45 00 movq %rax, (%r13) + // c8: 49 83 c5 08 addq $0x8, %r13 + // cc: 58 popq %rax + // cd: ff 25 00 00 00 00 jmpq *(%rip) # 0xd3 <_JIT_ENTRY+0xd3> + // 00000000000000cf: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // d3: 58 popq %rax + // d4: ff 25 00 00 00 00 jmpq *(%rip) # 0xda <_JIT_ENTRY+0xda> + // 00000000000000d6: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[218] = { + 0x50, 0x4c, 0x89, 0xe8, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xba, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xca, 0x4c, 0x63, 0xea, 0xba, 0xfd, 0xff, + 0xff, 0xff, 0x29, 0xca, 0x31, 0xf6, 0x45, 0x31, + 0xc0, 0x4a, 0x83, 0x3c, 0xe8, 0x00, 0x48, 0x8b, + 0x58, 0xf8, 0x40, 0x0f, 0x95, 0xc6, 0x41, 0x0f, + 0x94, 0xc0, 0x01, 0xce, 0xf7, 0xd1, 0x48, 0x63, + 0xc9, 0x48, 0x8d, 0x0c, 0xc8, 0x48, 0x63, 0xfa, + 0x48, 0x8b, 0x14, 0xf8, 0x4a, 0x8d, 0x0c, 0xc1, + 0x48, 0x83, 0xc1, 0xf8, 0x4c, 0x8b, 0x42, 0x30, + 0x2b, 0x73, 0x10, 0x41, 0xf6, 0x40, 0x30, 0x01, + 0x75, 0x14, 0x48, 0x8b, 0x52, 0x10, 0x44, 0x8b, + 0x02, 0x45, 0x85, 0xc0, 0x78, 0x0a, 0x41, 0xff, + 0xc0, 0x44, 0x89, 0x02, 0xeb, 0x02, 0x31, 0xd2, + 0x49, 0x89, 0x44, 0x24, 0x40, 0x4c, 0x63, 0xc6, + 0x48, 0x8b, 0x34, 0xf8, 0x4c, 0x89, 0x24, 0x24, + 0x4c, 0x89, 0xf7, 0x49, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, 0x24, + 0x40, 0xf8, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x15, + 0xff, 0xc9, 0x89, 0x0b, 0x75, 0x0f, 0x48, 0x89, + 0xdf, 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xd8, 0x49, 0xc1, 0xe5, + 0x03, 0x4d, 0x03, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x0f, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd6, (uintptr_t)data + 0x1c); +} + +void +emit__REPLACE_WITH_TRUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _REPLACE_WITH_TRUE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 8b 07 movl (%rdi), %eax + // 7: 85 c0 testl %eax, %eax + // 9: 78 06 js 0x11 <_JIT_ENTRY+0x11> + // b: ff c8 decl %eax + // d: 89 07 movl %eax, (%rdi) + // f: 74 12 je 0x23 <_JIT_ENTRY+0x23> + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 18: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1c: 58 popq %rax + // 1d: ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 29: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 30: 49 89 45 f8 movq %rax, -0x8(%r13) + // 34: 58 popq %rax + // 35: ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[53] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x12, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0xf8, 0x58, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + -0x4); +} + +void +emit__RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RESUME_CHECK.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 46 18 movq 0x18(%r14), %rax + // 4: 49 8b 0c 24 movq (%r12), %rcx + // 8: 48 3b 81 a8 00 00 00 cmpq 0xa8(%rcx), %rax + // f: 75 06 jne 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[29] = { + 0x49, 0x8b, 0x46, 0x18, 0x49, 0x8b, 0x0c, 0x24, + 0x48, 0x3b, 0x81, 0xa8, 0x00, 0x00, 0x00, 0x75, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); +} + +void +emit__RETURN_GENERATOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_GENERATOR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7c 24 10 movq 0x10(%r12), %rdi + // 6: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // b: ff 15 00 00 00 00 callq *(%rip) # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: R_X86_64_GOTPCRELX _Py_MakeCoro-0x4 + // 11: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 16: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 1f: 48 85 c0 testq %rax, %rax + // 22: 0f 84 b2 01 00 00 je 0x1da <_JIT_ENTRY+0x1da> + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 49 83 44 24 38 02 addq $0x2, 0x38(%r12) + // 33: 49 8b 4c 24 50 movq 0x50(%r12), %rcx + // 38: 48 89 88 98 00 00 00 movq %rcx, 0x98(%rax) + // 3f: 41 0f 10 04 24 movups (%r12), %xmm0 + // 44: 41 0f 10 4c 24 10 movups 0x10(%r12), %xmm1 + // 4a: 41 0f 10 54 24 20 movups 0x20(%r12), %xmm2 + // 50: 0f 11 50 68 movups %xmm2, 0x68(%rax) + // 54: 0f 11 48 58 movups %xmm1, 0x58(%rax) + // 58: 0f 11 40 48 movups %xmm0, 0x48(%rax) + // 5c: 41 0f 10 44 24 40 movups 0x40(%r12), %xmm0 + // 62: 0f 11 80 88 00 00 00 movups %xmm0, 0x88(%rax) + // 69: 41 0f 10 44 24 30 movups 0x30(%r12), %xmm0 + // 6f: 0f 11 40 78 movups %xmm0, 0x78(%rax) + // 73: 49 8d 54 24 50 leaq 0x50(%r12), %rdx + // 78: 49 8b 74 24 40 movq 0x40(%r12), %rsi + // 7d: 48 29 d6 subq %rdx, %rsi + // 80: 48 c1 ee 03 shrq $0x3, %rsi + // 84: 48 63 ce movslq %esi, %rcx + // 87: 48 8d 3c c8 leaq (%rax,%rcx,8), %rdi + // 8b: 48 81 c7 98 00 00 00 addq $0x98, %rdi + // 92: 48 89 b8 88 00 00 00 movq %rdi, 0x88(%rax) + // 99: 83 f9 02 cmpl $0x2, %ecx + // 9c: 0f 8c eb 00 00 00 jl 0x18d <_JIT_ENTRY+0x18d> + // a2: 89 f1 movl %esi, %ecx + // a4: 81 e1 ff ff ff 7f andl $0x7fffffff, %ecx # imm = 0x7FFFFFFF + // aa: 4c 8d 41 ff leaq -0x1(%rcx), %r8 + // ae: bf 01 00 00 00 movl $0x1, %edi + // b3: 49 83 f8 08 cmpq $0x8, %r8 + // b7: 72 57 jb 0x110 <_JIT_ENTRY+0x110> + // b9: 49 89 c1 movq %rax, %r9 + // bc: 4d 29 e1 subq %r12, %r9 + // bf: 49 83 c1 48 addq $0x48, %r9 + // c3: 49 83 f9 20 cmpq $0x20, %r9 + // c7: 72 47 jb 0x110 <_JIT_ENTRY+0x110> + // c9: 4d 89 c1 movq %r8, %r9 + // cc: 49 83 e1 fc andq $-0x4, %r9 + // d0: 49 8d 79 01 leaq 0x1(%r9), %rdi + // d4: 45 31 d2 xorl %r10d, %r10d + // d7: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // e0: 43 0f 10 44 d4 58 movups 0x58(%r12,%r10,8), %xmm0 + // e6: 43 0f 10 4c d4 68 movups 0x68(%r12,%r10,8), %xmm1 + // ec: 42 0f 11 84 d0 a0 00 00 00 movups %xmm0, 0xa0(%rax,%r10,8) + // f5: 42 0f 11 8c d0 b0 00 00 00 movups %xmm1, 0xb0(%rax,%r10,8) + // fe: 49 83 c2 04 addq $0x4, %r10 + // 102: 4d 39 d1 cmpq %r10, %r9 + // 105: 75 d9 jne 0xe0 <_JIT_ENTRY+0xe0> + // 107: 4d 39 c8 cmpq %r9, %r8 + // 10a: 0f 84 7d 00 00 00 je 0x18d <_JIT_ENTRY+0x18d> + // 110: 29 fe subl %edi, %esi + // 112: 49 89 f8 movq %rdi, %r8 + // 115: 83 e6 03 andl $0x3, %esi + // 118: 74 26 je 0x140 <_JIT_ENTRY+0x140> + // 11a: 49 89 c1 movq %rax, %r9 + // 11d: 49 81 c1 98 00 00 00 addq $0x98, %r9 + // 124: 49 89 f8 movq %rdi, %r8 + // 127: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 130: 4e 8b 14 c2 movq (%rdx,%r8,8), %r10 + // 134: 4f 89 14 c1 movq %r10, (%r9,%r8,8) + // 138: 49 ff c0 incq %r8 + // 13b: 48 ff ce decq %rsi + // 13e: 75 f0 jne 0x130 <_JIT_ENTRY+0x130> + // 140: 48 29 cf subq %rcx, %rdi + // 143: 48 83 ff fc cmpq $-0x4, %rdi + // 147: 77 44 ja 0x18d <_JIT_ENTRY+0x18d> + // 149: 0f 1f 80 00 00 00 00 nopl (%rax) + // 150: 4b 8b 54 c4 50 movq 0x50(%r12,%r8,8), %rdx + // 155: 4a 89 94 c0 98 00 00 00 movq %rdx, 0x98(%rax,%r8,8) + // 15d: 4b 8b 54 c4 58 movq 0x58(%r12,%r8,8), %rdx + // 162: 4a 89 94 c0 a0 00 00 00 movq %rdx, 0xa0(%rax,%r8,8) + // 16a: 4b 8b 54 c4 60 movq 0x60(%r12,%r8,8), %rdx + // 16f: 4a 89 94 c0 a8 00 00 00 movq %rdx, 0xa8(%rax,%r8,8) + // 177: 4b 8b 54 c4 68 movq 0x68(%r12,%r8,8), %rdx + // 17c: 4a 89 94 c0 b0 00 00 00 movq %rdx, 0xb0(%rax,%r8,8) + // 184: 49 83 c0 04 addq $0x4, %r8 + // 188: 4c 39 c1 cmpq %r8, %rcx + // 18b: 75 c3 jne 0x150 <_JIT_ENTRY+0x150> + // 18d: 48 c7 40 50 00 00 00 00 movq $0x0, 0x50(%rax) + // 195: c6 40 43 fd movb $-0x3, 0x43(%rax) + // 199: c6 80 92 00 00 00 01 movb $0x1, 0x92(%rax) + // 1a0: 41 ff 46 2c incl 0x2c(%r14) + // 1a4: 49 8b 5c 24 08 movq 0x8(%r12), %rbx + // 1a9: 4c 89 f7 movq %r14, %rdi + // 1ac: 4c 89 e6 movq %r12, %rsi + // 1af: 49 89 c7 movq %rax, %r15 + // 1b2: ff 15 00 00 00 00 callq *(%rip) # 0x1b8 <_JIT_ENTRY+0x1b8> + // 00000000000001b4: R_X86_64_GOTPCRELX _PyThreadState_PopFrame-0x4 + // 1b8: 49 89 5e 48 movq %rbx, 0x48(%r14) + // 1bc: 4c 8b 6b 40 movq 0x40(%rbx), %r13 + // 1c0: 48 c7 43 40 00 00 00 00 movq $0x0, 0x40(%rbx) + // 1c8: 4d 89 7d 00 movq %r15, (%r13) + // 1cc: 49 83 c5 08 addq $0x8, %r13 + // 1d0: 49 89 dc movq %rbx, %r12 + // 1d3: 58 popq %rax + // 1d4: ff 25 00 00 00 00 jmpq *(%rip) # 0x1da <_JIT_ENTRY+0x1da> + // 00000000000001d6: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 1da: 58 popq %rax + // 1db: ff 25 00 00 00 00 jmpq *(%rip) # 0x1e1 <_JIT_ENTRY+0x1e1> + // 00000000000001dd: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[481] = { + 0x50, 0x49, 0x8b, 0x7c, 0x24, 0x10, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x0f, 0x84, 0xb2, 0x01, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x83, 0x44, + 0x24, 0x38, 0x02, 0x49, 0x8b, 0x4c, 0x24, 0x50, + 0x48, 0x89, 0x88, 0x98, 0x00, 0x00, 0x00, 0x41, + 0x0f, 0x10, 0x04, 0x24, 0x41, 0x0f, 0x10, 0x4c, + 0x24, 0x10, 0x41, 0x0f, 0x10, 0x54, 0x24, 0x20, + 0x0f, 0x11, 0x50, 0x68, 0x0f, 0x11, 0x48, 0x58, + 0x0f, 0x11, 0x40, 0x48, 0x41, 0x0f, 0x10, 0x44, + 0x24, 0x40, 0x0f, 0x11, 0x80, 0x88, 0x00, 0x00, + 0x00, 0x41, 0x0f, 0x10, 0x44, 0x24, 0x30, 0x0f, + 0x11, 0x40, 0x78, 0x49, 0x8d, 0x54, 0x24, 0x50, + 0x49, 0x8b, 0x74, 0x24, 0x40, 0x48, 0x29, 0xd6, + 0x48, 0xc1, 0xee, 0x03, 0x48, 0x63, 0xce, 0x48, + 0x8d, 0x3c, 0xc8, 0x48, 0x81, 0xc7, 0x98, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xb8, 0x88, 0x00, 0x00, + 0x00, 0x83, 0xf9, 0x02, 0x0f, 0x8c, 0xeb, 0x00, + 0x00, 0x00, 0x89, 0xf1, 0x81, 0xe1, 0xff, 0xff, + 0xff, 0x7f, 0x4c, 0x8d, 0x41, 0xff, 0xbf, 0x01, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xf8, 0x08, 0x72, + 0x57, 0x49, 0x89, 0xc1, 0x4d, 0x29, 0xe1, 0x49, + 0x83, 0xc1, 0x48, 0x49, 0x83, 0xf9, 0x20, 0x72, + 0x47, 0x4d, 0x89, 0xc1, 0x49, 0x83, 0xe1, 0xfc, + 0x49, 0x8d, 0x79, 0x01, 0x45, 0x31, 0xd2, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x0f, 0x10, 0x44, 0xd4, 0x58, 0x43, 0x0f, + 0x10, 0x4c, 0xd4, 0x68, 0x42, 0x0f, 0x11, 0x84, + 0xd0, 0xa0, 0x00, 0x00, 0x00, 0x42, 0x0f, 0x11, + 0x8c, 0xd0, 0xb0, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc2, 0x04, 0x4d, 0x39, 0xd1, 0x75, 0xd9, 0x4d, + 0x39, 0xc8, 0x0f, 0x84, 0x7d, 0x00, 0x00, 0x00, + 0x29, 0xfe, 0x49, 0x89, 0xf8, 0x83, 0xe6, 0x03, + 0x74, 0x26, 0x49, 0x89, 0xc1, 0x49, 0x81, 0xc1, + 0x98, 0x00, 0x00, 0x00, 0x49, 0x89, 0xf8, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x8b, 0x14, 0xc2, 0x4f, 0x89, 0x14, 0xc1, + 0x49, 0xff, 0xc0, 0x48, 0xff, 0xce, 0x75, 0xf0, + 0x48, 0x29, 0xcf, 0x48, 0x83, 0xff, 0xfc, 0x77, + 0x44, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x8b, 0x54, 0xc4, 0x50, 0x4a, 0x89, 0x94, + 0xc0, 0x98, 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x54, + 0xc4, 0x58, 0x4a, 0x89, 0x94, 0xc0, 0xa0, 0x00, + 0x00, 0x00, 0x4b, 0x8b, 0x54, 0xc4, 0x60, 0x4a, + 0x89, 0x94, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0x4b, + 0x8b, 0x54, 0xc4, 0x68, 0x4a, 0x89, 0x94, 0xc0, + 0xb0, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc0, 0x04, + 0x4c, 0x39, 0xc1, 0x75, 0xc3, 0x48, 0xc7, 0x40, + 0x50, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x40, 0x43, + 0xfd, 0xc6, 0x80, 0x92, 0x00, 0x00, 0x00, 0x01, + 0x41, 0xff, 0x46, 0x2c, 0x49, 0x8b, 0x5c, 0x24, + 0x08, 0x4c, 0x89, 0xf7, 0x4c, 0x89, 0xe6, 0x49, + 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x5e, 0x48, 0x4c, 0x8b, 0x6b, 0x40, + 0x48, 0xc7, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x49, 0x89, 0xdc, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_MakeCoro+0x0 + // 8: &_PyThreadState_PopFrame+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_MakeCoro); + patch_64(data + 0x8, (uintptr_t)&_PyThreadState_PopFrame); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b4, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d6, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x1dd, (uintptr_t)data + 0x14); +} + +void +emit__RETURN_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_VALUE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 89 e6 movq %r12, %rsi + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 41 ff 46 2c incl 0x2c(%r14) + // 15: 4d 8b 64 24 08 movq 0x8(%r12), %r12 + // 1a: 4d 89 66 48 movq %r12, 0x48(%r14) + // 1e: 4c 89 f7 movq %r14, %rdi + // 21: ff 15 00 00 00 00 callq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: R_X86_64_GOTPCRELX _PyEval_FrameClearAndPop-0x4 + // 27: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 35: 49 89 5d 00 movq %rbx, (%r13) + // 39: 49 83 c5 08 addq $0x8, %r13 + // 3d: 58 popq %rax + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[62] = { + 0x50, 0x4c, 0x89, 0xe6, 0x49, 0x8b, 0x5d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x41, 0xff, 0x46, 0x2c, 0x4d, 0x8b, 0x64, + 0x24, 0x08, 0x4d, 0x89, 0x66, 0x48, 0x4c, 0x89, + 0xf7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, + }; + // 0: &_PyEval_FrameClearAndPop+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FrameClearAndPop); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + -0x4); +} + +void +emit__SAVE_RETURN_OFFSET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SAVE_RETURN_OFFSET.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 7: 66 41 89 44 24 48 movw %ax, 0x48(%r12) + // d: ff 25 00 00 00 00 jmpq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[13] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x41, 0x89, 0x44, 0x24, 0x48, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__SEND_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SEND_GEN_FRAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyGen_Type-0x4 + // f: 0f 94 c2 sete %dl + // 12: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_REX_GOTPCRELX PyCoro_Type-0x4 + // 19: 0f 94 c1 sete %cl + // 1c: 08 d1 orb %dl, %cl + // 1e: 74 06 je 0x26 <_JIT_ENTRY+0x26> + // 20: 80 78 43 00 cmpb $0x0, 0x43(%rax) + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff 25 00 00 00 00 jmpq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 2c: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 30: 48 8d 50 48 leaq 0x48(%rax), %rdx + // 34: 48 8b b0 88 00 00 00 movq 0x88(%rax), %rsi + // 3b: 48 89 0e movq %rcx, (%rsi) + // 3e: 48 83 80 88 00 00 00 08 addq $0x8, 0x88(%rax) + // 46: c6 40 43 00 movb $0x0, 0x43(%rax) + // 4a: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 4e: 48 8d 70 28 leaq 0x28(%rax), %rsi + // 52: 48 89 48 30 movq %rcx, 0x30(%rax) + // 56: 49 89 76 78 movq %rsi, 0x78(%r14) + // 5a: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 60: 83 c1 02 addl $0x2, %ecx + // 63: 66 41 89 4c 24 48 movw %cx, 0x48(%r12) + // 69: 4c 89 60 50 movq %r12, 0x50(%rax) + // 6d: 49 89 55 f8 movq %rdx, -0x8(%r13) + // 71: ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[113] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x94, 0xc2, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x94, 0xc1, 0x08, 0xd1, 0x74, 0x06, + 0x80, 0x78, 0x43, 0x00, 0x78, 0x06, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8d, 0x50, 0x48, 0x48, 0x8b, 0xb0, 0x88, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x0e, 0x48, 0x83, + 0x80, 0x88, 0x00, 0x00, 0x00, 0x08, 0xc6, 0x40, + 0x43, 0x00, 0x49, 0x8b, 0x4e, 0x78, 0x48, 0x8d, + 0x70, 0x28, 0x48, 0x89, 0x48, 0x30, 0x49, 0x89, + 0x76, 0x78, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xc1, 0x02, 0x66, 0x41, 0x89, 0x4c, 0x24, + 0x48, 0x4c, 0x89, 0x60, 0x50, 0x49, 0x89, 0x55, + 0xf8, + }; + // 0: &PyGen_Type+0x0 + // 8: &PyCoro_Type+0x0 + // 10: JUMP_TARGET + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyGen_Type); + patch_64(data + 0x8, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x14); +} + +void +emit__SETUP_ANNOTATIONS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SETUP_ANNOTATIONS.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // 6: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // b: 48 85 ff testq %rdi, %rdi + // e: 74 5c je 0x6c <_JIT_ENTRY+0x6c> + // 10: be b0 90 00 00 movl $0x90b0, %esi # imm = 0x90B0 + // 15: 48 03 35 00 00 00 00 addq (%rip), %rsi # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 1c: 48 89 e2 movq %rsp, %rdx + // 1f: ff 15 00 00 00 00 callq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_GOTPCRELX PyMapping_GetOptionalItem-0x4 + // 25: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 33: 85 c0 testl %eax, %eax + // 35: 78 5f js 0x96 <_JIT_ENTRY+0x96> + // 37: 48 8b 3c 24 movq (%rsp), %rdi + // 3b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 40: 48 85 ff testq %rdi, %rdi + // 43: 74 58 je 0x9d <_JIT_ENTRY+0x9d> + // 45: 8b 07 movl (%rdi), %eax + // 47: 85 c0 testl %eax, %eax + // 49: 78 0c js 0x57 <_JIT_ENTRY+0x57> + // 4b: ff c8 decl %eax + // 4d: 89 07 movl %eax, (%rdi) + // 4f: 75 06 jne 0x57 <_JIT_ENTRY+0x57> + // 51: ff 15 00 00 00 00 callq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 57: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 65: 58 popq %rax + // 66: ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 6c: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_REX_GOTPCRELX PyExc_SystemError-0x4 + // 73: 48 8b 30 movq (%rax), %rsi + // 76: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: R_X86_64_PC32 .L.str-0x4 + // 7d: 4c 89 f7 movq %r14, %rdi + // 80: 31 c0 xorl %eax, %eax + // 82: ff 15 00 00 00 00 callq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // 88: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 8d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 96: 58 popq %rax + // 97: ff 25 00 00 00 00 jmpq *(%rip) # 0x9d <_JIT_ENTRY+0x9d> + // 0000000000000099: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 9d: ff 15 00 00 00 00 callq *(%rip) # 0xa3 <_JIT_ENTRY+0xa3> + // 000000000000009f: R_X86_64_GOTPCRELX PyDict_New-0x4 + // a3: 48 89 04 24 movq %rax, (%rsp) + // a7: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ac: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b5: 48 85 c0 testq %rax, %rax + // b8: 74 dc je 0x96 <_JIT_ENTRY+0x96> + // ba: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // bf: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // c4: be b0 90 00 00 movl $0x90b0, %esi # imm = 0x90B0 + // c9: 48 03 35 00 00 00 00 addq (%rip), %rsi # 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000cc: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // d0: 48 89 c2 movq %rax, %rdx + // d3: ff 15 00 00 00 00 callq *(%rip) # 0xd9 <_JIT_ENTRY+0xd9> + // 00000000000000d5: R_X86_64_GOTPCRELX PyObject_SetItem-0x4 + // d9: 48 8b 3c 24 movq (%rsp), %rdi + // dd: 8b 0f movl (%rdi), %ecx + // df: 85 c9 testl %ecx, %ecx + // e1: 78 10 js 0xf3 <_JIT_ENTRY+0xf3> + // e3: ff c9 decl %ecx + // e5: 89 0f movl %ecx, (%rdi) + // e7: 75 0a jne 0xf3 <_JIT_ENTRY+0xf3> + // e9: 89 c3 movl %eax, %ebx + // eb: ff 15 00 00 00 00 callq *(%rip) # 0xf1 <_JIT_ENTRY+0xf1> + // 00000000000000ed: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // f1: 89 d8 movl %ebx, %eax + // f3: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f8: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 101: 85 c0 testl %eax, %eax + // 103: 0f 84 5c ff ff ff je 0x65 <_JIT_ENTRY+0x65> + // 109: 58 popq %rax + // 10a: ff 25 00 00 00 00 jmpq *(%rip) # 0x110 <_JIT_ENTRY+0x110> + // 000000000000010c: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[272] = { + 0x50, 0x49, 0x8b, 0x7c, 0x24, 0x28, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xff, 0x74, 0x5c, + 0xbe, 0xb0, 0x90, 0x00, 0x00, 0x48, 0x03, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xe2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x5f, 0x48, + 0x8b, 0x3c, 0x24, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x58, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x30, 0x48, 0x8d, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf7, + 0x31, 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x04, 0x24, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0xdc, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, + 0x8b, 0x7c, 0x24, 0x28, 0xbe, 0xb0, 0x90, 0x00, + 0x00, 0x48, 0x03, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xc2, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x3c, 0x24, 0x8b, 0x0f, 0x85, + 0xc9, 0x78, 0x10, 0xff, 0xc9, 0x89, 0x0f, 0x75, + 0x0a, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xd8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x0f, 0x84, 0x5c, 0xff, 0xff, + 0xff, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'no locals found when setting up annotations\x00' + // 2c: 00 00 00 00 + // 30: &_PyRuntime+0x0 + // 38: &PyMapping_GetOptionalItem+0x0 + // 40: &_Py_Dealloc+0x0 + // 48: CONTINUE + // 50: &PyExc_SystemError+0x0 + // 58: &_PyErr_Format+0x0 + // 60: ERROR_TARGET + // 68: &PyDict_New+0x0 + // 70: &PyObject_SetItem+0x0 + const unsigned char data_body[120] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_PyRuntime); + patch_64(data + 0x38, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x40, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x50, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x58, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x60, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x68, (uintptr_t)&PyDict_New); + patch_64(data + 0x70, (uintptr_t)&PyObject_SetItem); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0x4c); + patch_32r(code + 0x79, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x9f, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0xed, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x10c, (uintptr_t)data + 0x5c); +} + +void +emit__SET_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_ADD.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 8b 05 00 00 00 00 movl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 7: f7 d0 notl %eax + // 9: 49 8b 5d f8 movq -0x8(%r13), %rbx + // d: c1 e0 03 shll $0x3, %eax + // 10: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 16: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 48 89 de movq %rbx, %rsi + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX PySet_Add-0x4 + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 8b 0b movl (%rbx), %ecx + // 39: 85 c9 testl %ecx, %ecx + // 3b: 78 06 js 0x43 <_JIT_ENTRY+0x43> + // 3d: ff c9 decl %ecx + // 3f: 89 0b movl %ecx, (%rbx) + // 41: 74 0f je 0x52 <_JIT_ENTRY+0x52> + // 43: 49 83 c5 f8 addq $-0x8, %r13 + // 47: 85 c0 testl %eax, %eax + // 49: 74 1c je 0x67 <_JIT_ENTRY+0x67> + // 4b: 58 popq %rax + // 4c: ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 52: 48 89 df movq %rbx, %rdi + // 55: 89 c3 movl %eax, %ebx + // 57: ff 15 00 00 00 00 callq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5d: 89 d8 movl %ebx, %eax + // 5f: 49 83 c5 f8 addq $-0x8, %r13 + // 63: 85 c0 testl %eax, %eax + // 65: 75 e4 jne 0x4b <_JIT_ENTRY+0x4b> + // 67: 58 popq %rax + // 68: ff 25 00 00 00 00 jmpq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[104] = { + 0x50, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf7, + 0xd0, 0x49, 0x8b, 0x5d, 0xf8, 0xc1, 0xe0, 0x03, + 0x48, 0x0d, 0x00, 0x00, 0xf8, 0xff, 0x49, 0x8b, + 0x7c, 0x05, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0b, 0x74, 0x0f, 0x49, 0x83, 0xc5, 0xf8, 0x85, + 0xc0, 0x74, 0x1c, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x49, + 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x75, 0xe4, 0x58, + }; + // 0: OPARG + // 8: &PySet_Add+0x0 + // 10: ERROR_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySet_Add); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x14); +} + +void +emit__SET_FUNCTION_ATTRIBUTE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_FUNCTION_ATTRIBUTE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 4: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 13: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_REX_GOTPCRELX _Py_FunctionAttributeOffsets-0x4 + // 1a: 48 8b 34 f7 movq (%rdi,%rsi,8), %rsi + // 1e: 48 89 0c 32 movq %rcx, (%rdx,%rsi) + // 22: 49 89 55 f0 movq %rdx, -0x10(%r13) + // 26: 49 89 c5 movq %rax, %r13 + // 29: ff 25 00 00 00 00 jmpq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[41] = { + 0x49, 0x8d, 0x45, 0xf8, 0x49, 0x8b, 0x4d, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x0f, 0xb7, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x34, 0xf7, 0x48, 0x89, + 0x0c, 0x32, 0x49, 0x89, 0x55, 0xf0, 0x49, 0x89, + 0xc5, + }; + // 0: OPARG + // 8: &_Py_FunctionAttributeOffsets+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_FunctionAttributeOffsets); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); +} + +void +emit__SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_IP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _JIT_OPERAND0-0x4 + // 7: 49 89 44 24 38 movq %rax, 0x38(%r12) + // c: ff 25 00 00 00 00 jmpq *(%rip) # 0x12 <_JIT_ENTRY+0x12> + // 000000000000000e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[12] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x44, 0x24, 0x38, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__SET_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_UPDATE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 8b 05 00 00 00 00 movl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // 7: f7 d0 notl %eax + // 9: 49 8b 5d f8 movq -0x8(%r13), %rbx + // d: c1 e0 03 shll $0x3, %eax + // 10: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 16: 49 8b 7c 05 00 movq (%r13,%rax), %rdi + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 48 89 de movq %rbx, %rsi + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_GOTPCRELX _PySet_Update-0x4 + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 8b 0b movl (%rbx), %ecx + // 39: 85 c9 testl %ecx, %ecx + // 3b: 78 06 js 0x43 <_JIT_ENTRY+0x43> + // 3d: ff c9 decl %ecx + // 3f: 89 0b movl %ecx, (%rbx) + // 41: 74 0f je 0x52 <_JIT_ENTRY+0x52> + // 43: 49 83 c5 f8 addq $-0x8, %r13 + // 47: 85 c0 testl %eax, %eax + // 49: 78 1c js 0x67 <_JIT_ENTRY+0x67> + // 4b: 58 popq %rax + // 4c: ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 52: 48 89 df movq %rbx, %rdi + // 55: 89 c3 movl %eax, %ebx + // 57: ff 15 00 00 00 00 callq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 5d: 89 d8 movl %ebx, %eax + // 5f: 49 83 c5 f8 addq $-0x8, %r13 + // 63: 85 c0 testl %eax, %eax + // 65: 79 e4 jns 0x4b <_JIT_ENTRY+0x4b> + // 67: 58 popq %rax + // 68: ff 25 00 00 00 00 jmpq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[110] = { + 0x50, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf7, + 0xd0, 0x49, 0x8b, 0x5d, 0xf8, 0xc1, 0xe0, 0x03, + 0x48, 0x0d, 0x00, 0x00, 0xf8, 0xff, 0x49, 0x8b, + 0x7c, 0x05, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0xde, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0b, 0x74, 0x0f, 0x49, 0x83, 0xc5, 0xf8, 0x85, + 0xc0, 0x78, 0x1c, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x49, + 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x79, 0xe4, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PySet_Update+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PySet_Update); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0x1c); +} + +void +emit__START_EXECUTOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _START_EXECUTOR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6: 49 8b be 10 01 00 00 movq 0x110(%r14), %rdi + // d: 48 85 ff testq %rdi, %rdi + // 10: 74 17 je 0x29 <_JIT_ENTRY+0x29> + // 12: 49 c7 86 10 01 00 00 00 00 00 00 movq $0x0, 0x110(%r14) + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, + 0xbe, 0x10, 0x01, 0x00, 0x00, 0x48, 0x85, 0xff, + 0x74, 0x17, 0x49, 0xc7, 0x86, 0x10, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 5: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 9: 49 8b 04 24 movq (%r12), %rax + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 18: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 89 df movq %rbx, %rdi + // 25: 48 89 ea movq %rbp, %rdx + // 28: ff 15 00 00 00 00 callq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: R_X86_64_GOTPCRELX PyObject_SetAttr-0x4 + // 2e: 41 89 c7 movl %eax, %r15d + // 31: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 36: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3f: 8b 45 00 movl (%rbp), %eax + // 42: 85 c0 testl %eax, %eax + // 44: 78 10 js 0x56 <_JIT_ENTRY+0x56> + // 46: ff c8 decl %eax + // 48: 89 45 00 movl %eax, (%rbp) + // 4b: 75 09 jne 0x56 <_JIT_ENTRY+0x56> + // 4d: 48 89 ef movq %rbp, %rdi + // 50: ff 15 00 00 00 00 callq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 56: 8b 03 movl (%rbx), %eax + // 58: 85 c0 testl %eax, %eax + // 5a: 78 06 js 0x62 <_JIT_ENTRY+0x62> + // 5c: ff c8 decl %eax + // 5e: 89 03 movl %eax, (%rbx) + // 60: 74 10 je 0x72 <_JIT_ENTRY+0x72> + // 62: 49 83 c5 f0 addq $-0x10, %r13 + // 66: 45 85 ff testl %r15d, %r15d + // 69: 74 19 je 0x84 <_JIT_ENTRY+0x84> + // 6b: 5d popq %rbp + // 6c: ff 25 00 00 00 00 jmpq *(%rip) # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 72: 48 89 df movq %rbx, %rdi + // 75: ff 15 00 00 00 00 callq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 7b: 49 83 c5 f0 addq $-0x10, %r13 + // 7f: 45 85 ff testl %r15d, %r15d + // 82: 75 e7 jne 0x6b <_JIT_ENTRY+0x6b> + // 84: 5d popq %rbp + // 85: ff 25 00 00 00 00 jmpq *(%rip) # 0x8b <_JIT_ENTRY+0x8b> + // 0000000000000087: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[133] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf0, 0x49, 0x8b, 0x5d, + 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x74, 0xc8, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0x48, 0x89, 0xea, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, 0x89, + 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x45, 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x89, 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, + 0x74, 0x10, 0x49, 0x83, 0xc5, 0xf0, 0x45, 0x85, + 0xff, 0x74, 0x19, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x45, + 0x85, 0xff, 0x75, 0xe7, 0x5d, + }; + // 0: OPARG + // 8: &PyObject_SetAttr+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetAttr); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0xc); +} + +void +emit__STORE_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_INSTANCE_VALUE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 5: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 9: 49 83 c5 f0 addq $-0x10, %r13 + // d: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 14: 48 8b 1c 07 movq (%rdi,%rax), %rbx + // 18: 48 89 0c 07 movq %rcx, (%rdi,%rax) + // 1c: 48 85 db testq %rbx, %rbx + // 1f: 75 38 jne 0x59 <_JIT_ENTRY+0x59> + // 21: 48 01 f8 addq %rdi, %rax + // 24: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 28: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 2c: 48 8d 14 0f leaq (%rdi,%rcx), %rdx + // 30: 48 8d 34 0f leaq (%rdi,%rcx), %rsi + // 34: 48 83 c6 08 addq $0x8, %rsi + // 38: 29 f0 subl %esi, %eax + // 3a: c1 e8 03 shrl $0x3, %eax + // 3d: 0f b6 74 0f 01 movzbl 0x1(%rdi,%rcx), %esi + // 42: 44 0f b6 04 0f movzbl (%rdi,%rcx), %r8d + // 47: 4a 8d 14 c2 leaq (%rdx,%r8,8), %rdx + // 4b: 48 83 c2 08 addq $0x8, %rdx + // 4f: 88 04 16 movb %al, (%rsi,%rdx) + // 52: 8d 46 01 leal 0x1(%rsi), %eax + // 55: 88 44 0f 01 movb %al, 0x1(%rdi,%rcx) + // 59: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5e: 8b 07 movl (%rdi), %eax + // 60: 85 c0 testl %eax, %eax + // 62: 78 0c js 0x70 <_JIT_ENTRY+0x70> + // 64: ff c8 decl %eax + // 66: 89 07 movl %eax, (%rdi) + // 68: 75 06 jne 0x70 <_JIT_ENTRY+0x70> + // 6a: ff 15 00 00 00 00 callq *(%rip) # 0x70 <_JIT_ENTRY+0x70> + // 000000000000006c: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 70: 48 85 db testq %rbx, %rbx + // 73: 74 0c je 0x81 <_JIT_ENTRY+0x81> + // 75: 8b 03 movl (%rbx), %eax + // 77: 85 c0 testl %eax, %eax + // 79: 78 06 js 0x81 <_JIT_ENTRY+0x81> + // 7b: ff c8 decl %eax + // 7d: 89 03 movl %eax, (%rbx) + // 7f: 74 15 je 0x96 <_JIT_ENTRY+0x96> + // 81: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 86: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8f: 58 popq %rax + // 90: ff 25 00 00 00 00 jmpq *(%rip) # 0x96 <_JIT_ENTRY+0x96> + // 0000000000000092: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 96: 48 89 df movq %rbx, %rdi + // 99: ff 15 00 00 00 00 callq *(%rip) # 0x9f <_JIT_ENTRY+0x9f> + // 000000000000009b: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 9f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a4: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ad: 58 popq %rax + // ae: ff 25 00 00 00 00 jmpq *(%rip) # 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b0: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[174] = { + 0x50, 0x49, 0x8b, 0x4d, 0xf0, 0x49, 0x8b, 0x7d, + 0xf8, 0x49, 0x83, 0xc5, 0xf0, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x1c, 0x07, + 0x48, 0x89, 0x0c, 0x07, 0x48, 0x85, 0xdb, 0x75, + 0x38, 0x48, 0x01, 0xf8, 0x48, 0x8b, 0x4f, 0x08, + 0x48, 0x8b, 0x49, 0x20, 0x48, 0x8d, 0x14, 0x0f, + 0x48, 0x8d, 0x34, 0x0f, 0x48, 0x83, 0xc6, 0x08, + 0x29, 0xf0, 0xc1, 0xe8, 0x03, 0x0f, 0xb6, 0x74, + 0x0f, 0x01, 0x44, 0x0f, 0xb6, 0x04, 0x0f, 0x4a, + 0x8d, 0x14, 0xc2, 0x48, 0x83, 0xc2, 0x08, 0x88, + 0x04, 0x16, 0x8d, 0x46, 0x01, 0x88, 0x44, 0x0f, + 0x01, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xdb, 0x74, 0x0c, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x03, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x92, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)data + 0x4); +} + +void +emit__STORE_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_SLOT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f0 movq -0x10(%r13), %rax + // 5: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 9: 49 83 c5 f0 addq $-0x10, %r13 + // d: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 14: 48 8b 1c 0f movq (%rdi,%rcx), %rbx + // 18: 48 89 04 0f movq %rax, (%rdi,%rcx) + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 8b 07 movl (%rdi), %eax + // 23: 85 c0 testl %eax, %eax + // 25: 78 0c js 0x33 <_JIT_ENTRY+0x33> + // 27: ff c8 decl %eax + // 29: 89 07 movl %eax, (%rdi) + // 2b: 75 06 jne 0x33 <_JIT_ENTRY+0x33> + // 2d: ff 15 00 00 00 00 callq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 33: 48 85 db testq %rbx, %rbx + // 36: 74 0c je 0x44 <_JIT_ENTRY+0x44> + // 38: 8b 03 movl (%rbx), %eax + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 06 js 0x44 <_JIT_ENTRY+0x44> + // 3e: ff c8 decl %eax + // 40: 89 03 movl %eax, (%rbx) + // 42: 74 15 je 0x59 <_JIT_ENTRY+0x59> + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 59: 48 89 df movq %rbx, %rdi + // 5c: ff 15 00 00 00 00 callq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 62: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 67: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 70: 58 popq %rax + // 71: ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[113] = { + 0x50, 0x49, 0x8b, 0x45, 0xf0, 0x49, 0x8b, 0x7d, + 0xf8, 0x49, 0x83, 0xc5, 0xf0, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x1c, 0x0f, + 0x48, 0x89, 0x04, 0x0f, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x74, 0x0c, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x03, 0x74, 0x15, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0x4); +} + +void +emit__STORE_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_WITH_HINT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 48 8b 53 e8 movq -0x18(%rbx), %rdx + // 9: 48 85 d2 testq %rdx, %rdx + // c: 74 45 je 0x53 <_JIT_ENTRY+0x53> + // e: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCREL _JIT_OPERAND0-0x4 + // 15: 48 8b 7a 20 movq 0x20(%rdx), %rdi + // 19: 48 39 77 18 cmpq %rsi, 0x18(%rdi) + // 1d: 76 34 jbe 0x53 <_JIT_ENTRY+0x53> + // 1f: 80 7f 0a 00 cmpb $0x0, 0xa(%rdi) + // 23: 74 2e je 0x53 <_JIT_ENTRY+0x53> + // 25: 49 8b 04 24 movq (%r12), %rax + // 29: 48 8b 40 20 movq 0x20(%rax), %rax + // 2d: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 34: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 39: 0f b6 4f 09 movzbl 0x9(%rdi), %ecx + // 3d: 41 b8 01 00 00 00 movl $0x1, %r8d + // 43: 49 d3 e0 shlq %cl, %r8 + // 46: 49 01 f8 addq %rdi, %r8 + // 49: c1 e6 04 shll $0x4, %esi + // 4c: 4a 39 44 06 20 cmpq %rax, 0x20(%rsi,%r8) + // 51: 74 07 je 0x5a <_JIT_ENTRY+0x5a> + // 53: 5d popq %rbp + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 5a: 4a 8d 2c 06 leaq (%rsi,%r8), %rbp + // 5e: 48 83 c5 20 addq $0x20, %rbp + // 62: 4c 8b 7d 08 movq 0x8(%rbp), %r15 + // 66: 4d 85 ff testq %r15, %r15 + // 69: 74 e8 je 0x53 <_JIT_ENTRY+0x53> + // 6b: 4d 8b 45 f0 movq -0x10(%r13), %r8 + // 6f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 74: 0f b6 7a 18 movzbl 0x18(%rdx), %edi + // 78: 85 ff testl %edi, %edi + // 7a: 74 19 je 0x95 <_JIT_ENTRY+0x95> + // 7c: be 01 00 00 00 movl $0x1, %esi + // 81: 48 89 c1 movq %rax, %rcx + // 84: 4d 89 c5 movq %r8, %r13 + // 87: ff 15 00 00 00 00 callq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: R_X86_64_GOTPCRELX _PyDict_SendEvent-0x4 + // 8d: 4d 89 e8 movq %r13, %r8 + // 90: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 95: 4c 89 45 08 movq %r8, 0x8(%rbp) + // 99: 49 83 c5 f0 addq $-0x10, %r13 + // 9d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a2: 8b 03 movl (%rbx), %eax + // a4: 85 c0 testl %eax, %eax + // a6: 78 0f js 0xb7 <_JIT_ENTRY+0xb7> + // a8: ff c8 decl %eax + // aa: 89 03 movl %eax, (%rbx) + // ac: 75 09 jne 0xb7 <_JIT_ENTRY+0xb7> + // ae: 48 89 df movq %rbx, %rdi + // b1: ff 15 00 00 00 00 callq *(%rip) # 0xb7 <_JIT_ENTRY+0xb7> + // 00000000000000b3: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b7: 41 8b 07 movl (%r15), %eax + // ba: 85 c0 testl %eax, %eax + // bc: 78 10 js 0xce <_JIT_ENTRY+0xce> + // be: ff c8 decl %eax + // c0: 41 89 07 movl %eax, (%r15) + // c3: 75 09 jne 0xce <_JIT_ENTRY+0xce> + // c5: 4c 89 ff movq %r15, %rdi + // c8: ff 15 00 00 00 00 callq *(%rip) # 0xce <_JIT_ENTRY+0xce> + // 00000000000000ca: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // ce: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // dc: 5d popq %rbp + // dd: ff 25 00 00 00 00 jmpq *(%rip) # 0xe3 <_JIT_ENTRY+0xe3> + // 00000000000000df: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[221] = { + 0x55, 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x8b, 0x53, + 0xe8, 0x48, 0x85, 0xd2, 0x74, 0x45, 0x0f, 0xb7, + 0x35, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x7a, + 0x20, 0x48, 0x39, 0x77, 0x18, 0x76, 0x34, 0x80, + 0x7f, 0x0a, 0x00, 0x74, 0x2e, 0x49, 0x8b, 0x04, + 0x24, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x44, 0xc8, + 0x18, 0x0f, 0xb6, 0x4f, 0x09, 0x41, 0xb8, 0x01, + 0x00, 0x00, 0x00, 0x49, 0xd3, 0xe0, 0x49, 0x01, + 0xf8, 0xc1, 0xe6, 0x04, 0x4a, 0x39, 0x44, 0x06, + 0x20, 0x74, 0x07, 0x5d, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x4a, 0x8d, 0x2c, 0x06, 0x48, 0x83, + 0xc5, 0x20, 0x4c, 0x8b, 0x7d, 0x08, 0x4d, 0x85, + 0xff, 0x74, 0xe8, 0x4d, 0x8b, 0x45, 0xf0, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb6, 0x7a, 0x18, + 0x85, 0xff, 0x74, 0x19, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xc1, 0x4d, 0x89, 0xc5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xe8, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0x45, + 0x08, 0x49, 0x83, 0xc5, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, + 0x41, 0x89, 0x07, 0x75, 0x09, 0x4c, 0x89, 0xff, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x5d, + }; + // 0: OPERAND0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: &_PyDict_SendEvent+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_PyDict_SendEvent); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)data + -0x4); + patch_32r(code + 0x30, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb3, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xca, (uintptr_t)data + 0x1c); +} + +void +emit__STORE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_DEREF.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // c: 49 8b 4c cc 50 movq 0x50(%r12,%rcx,8), %rcx + // 11: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 16: 48 8b 79 10 movq 0x10(%rcx), %rdi + // 1a: 48 89 41 10 movq %rax, 0x10(%rcx) + // 1e: 48 85 ff testq %rdi, %rdi + // 21: 74 12 je 0x35 <_JIT_ENTRY+0x35> + // 23: 8b 07 movl (%rdi), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 0c js 0x35 <_JIT_ENTRY+0x35> + // 29: ff c8 decl %eax + // 2b: 89 07 movl %eax, (%rdi) + // 2d: 75 06 jne 0x35 <_JIT_ENTRY+0x35> + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 35: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 43: 49 83 c5 f8 addq $-0x8, %r13 + // 47: 58 popq %rax + // 48: ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[72] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xcc, + 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x79, 0x10, 0x48, 0x89, 0x41, 0x10, 0x48, 0x85, + 0xff, 0x74, 0x12, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x58, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 10: 49 8b 7c cc 50 movq 0x50(%r12,%rcx,8), %rdi + // 15: 49 89 44 cc 50 movq %rax, 0x50(%r12,%rcx,8) + // 1a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1f: 48 85 ff testq %rdi, %rdi + // 22: 74 0c je 0x30 <_JIT_ENTRY+0x30> + // 24: 8b 07 movl (%rdi), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c8 decl %eax + // 2c: 89 07 movl %eax, (%rdi) + // 2e: 74 15 je 0x45 <_JIT_ENTRY+0x45> + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 58 popq %rax + // 3f: ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 58 popq %rax + // 5a: ff 25 00 00 00 00 jmpq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[90] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x7c, 0xcc, 0x50, 0x49, 0x89, 0x44, + 0xcc, 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x58, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0xc); +} + +void +emit__STORE_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_0.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b 7c 24 50 movq 0x50(%r12), %rdi + // e: 49 89 44 24 50 movq %rax, 0x50(%r12) + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 85 ff testq %rdi, %rdi + // 1b: 74 0c je 0x29 <_JIT_ENTRY+0x29> + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0x7c, 0x24, 0x50, 0x49, 0x89, + 0x44, 0x24, 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_1.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b 7c 24 58 movq 0x58(%r12), %rdi + // e: 49 89 44 24 58 movq %rax, 0x58(%r12) + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 85 ff testq %rdi, %rdi + // 1b: 74 0c je 0x29 <_JIT_ENTRY+0x29> + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0x7c, 0x24, 0x58, 0x49, 0x89, + 0x44, 0x24, 0x58, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_2.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b 7c 24 60 movq 0x60(%r12), %rdi + // e: 49 89 44 24 60 movq %rax, 0x60(%r12) + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 85 ff testq %rdi, %rdi + // 1b: 74 0c je 0x29 <_JIT_ENTRY+0x29> + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0x7c, 0x24, 0x60, 0x49, 0x89, + 0x44, 0x24, 0x60, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_3.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b 7c 24 68 movq 0x68(%r12), %rdi + // e: 49 89 44 24 68 movq %rax, 0x68(%r12) + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 85 ff testq %rdi, %rdi + // 1b: 74 0c je 0x29 <_JIT_ENTRY+0x29> + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0x7c, 0x24, 0x68, 0x49, 0x89, + 0x44, 0x24, 0x68, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_4.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b 7c 24 70 movq 0x70(%r12), %rdi + // e: 49 89 44 24 70 movq %rax, 0x70(%r12) + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 85 ff testq %rdi, %rdi + // 1b: 74 0c je 0x29 <_JIT_ENTRY+0x29> + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0x7c, 0x24, 0x70, 0x49, 0x89, + 0x44, 0x24, 0x70, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_5.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b 7c 24 78 movq 0x78(%r12), %rdi + // e: 49 89 44 24 78 movq %rax, 0x78(%r12) + // 13: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 18: 48 85 ff testq %rdi, %rdi + // 1b: 74 0c je 0x29 <_JIT_ENTRY+0x29> + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 15 je 0x3e <_JIT_ENTRY+0x3e> + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 58 popq %rax + // 38: ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 44: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 49: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 52: 58 popq %rax + // 53: ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[83] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0x7c, 0x24, 0x78, 0x49, 0x89, + 0x44, 0x24, 0x78, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x15, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_6.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b bc 24 80 00 00 00 movq 0x80(%r12), %rdi + // 11: 49 89 84 24 80 00 00 00 movq %rax, 0x80(%r12) + // 19: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1e: 48 85 ff testq %rdi, %rdi + // 21: 74 0c je 0x2f <_JIT_ENTRY+0x2f> + // 23: 8b 07 movl (%rdi), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 06 js 0x2f <_JIT_ENTRY+0x2f> + // 29: ff c8 decl %eax + // 2b: 89 07 movl %eax, (%rdi) + // 2d: 74 15 je 0x44 <_JIT_ENTRY+0x44> + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 58 popq %rax + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 44: ff 15 00 00 00 00 callq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 58: 58 popq %rax + // 59: ff 25 00 00 00 00 jmpq *(%rip) # 0x5f <_JIT_ENTRY+0x5f> + // 000000000000005b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[89] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0xbc, 0x24, 0x80, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x84, 0x24, 0x80, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, + 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_7.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 45 f8 movq -0x8(%r13), %rax + // 5: 49 83 c5 f8 addq $-0x8, %r13 + // 9: 49 8b bc 24 88 00 00 00 movq 0x88(%r12), %rdi + // 11: 49 89 84 24 88 00 00 00 movq %rax, 0x88(%r12) + // 19: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1e: 48 85 ff testq %rdi, %rdi + // 21: 74 0c je 0x2f <_JIT_ENTRY+0x2f> + // 23: 8b 07 movl (%rdi), %eax + // 25: 85 c0 testl %eax, %eax + // 27: 78 06 js 0x2f <_JIT_ENTRY+0x2f> + // 29: ff c8 decl %eax + // 2b: 89 07 movl %eax, (%rdi) + // 2d: 74 15 je 0x44 <_JIT_ENTRY+0x44> + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 58 popq %rax + // 3e: ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 44: ff 15 00 00 00 00 callq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 58: 58 popq %rax + // 59: ff 25 00 00 00 00 jmpq *(%rip) # 0x5f <_JIT_ENTRY+0x5f> + // 000000000000005b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[89] = { + 0x50, 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, + 0xf8, 0x49, 0x8b, 0xbc, 0x24, 0x88, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x84, 0x24, 0x88, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, + 0xff, 0x74, 0x0c, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x15, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x58, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x4); +} + +void +emit__STORE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_GLOBAL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 49 8b 04 24 movq (%r12), %rax + // 9: 49 8b 7c 24 18 movq 0x18(%r12), %rdi + // e: 48 8b 40 20 movq 0x20(%rax), %rax + // 12: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 19: 48 8b 74 c8 18 movq 0x18(%rax,%rcx,8), %rsi + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 da movq %rbx, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: R_X86_64_GOTPCRELX PyDict_SetItem-0x4 + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 8b 0b movl (%rbx), %ecx + // 3c: 85 c9 testl %ecx, %ecx + // 3e: 78 06 js 0x46 <_JIT_ENTRY+0x46> + // 40: ff c9 decl %ecx + // 42: 89 0b movl %ecx, (%rbx) + // 44: 74 0f je 0x55 <_JIT_ENTRY+0x55> + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 85 c0 testl %eax, %eax + // 4c: 74 1c je 0x6a <_JIT_ENTRY+0x6a> + // 4e: 58 popq %rax + // 4f: ff 25 00 00 00 00 jmpq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 55: 48 89 df movq %rbx, %rdi + // 58: 89 c3 movl %eax, %ebx + // 5a: ff 15 00 00 00 00 callq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 60: 89 d8 movl %ebx, %eax + // 62: 49 83 c5 f8 addq $-0x8, %r13 + // 66: 85 c0 testl %eax, %eax + // 68: 75 e4 jne 0x4e <_JIT_ENTRY+0x4e> + // 6a: 58 popq %rax + // 6b: ff 25 00 00 00 00 jmpq *(%rip) # 0x71 <_JIT_ENTRY+0x71> + // 000000000000006d: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[107] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, + 0x24, 0x49, 0x8b, 0x7c, 0x24, 0x18, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x74, 0xc8, 0x18, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xda, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0b, 0x74, 0x0f, 0x49, 0x83, + 0xc5, 0xf8, 0x85, 0xc0, 0x74, 0x1c, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd8, 0x49, 0x83, 0xc5, 0xf8, 0x85, 0xc0, + 0x75, 0xe4, 0x58, + }; + // 0: OPARG + // 8: &PyDict_SetItem+0x0 + // 10: ERROR_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x15, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x14); +} + +void +emit__STORE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_NAME.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 49 8b 04 24 movq (%r12), %rax + // 9: 49 8b 7c 24 28 movq 0x28(%r12), %rdi + // e: 48 8b 40 20 movq 0x20(%rax), %rax + // 12: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 19: 48 8b 4c c8 18 movq 0x18(%rax,%rcx,8), %rcx + // 1e: 48 85 ff testq %rdi, %rdi + // 21: 74 20 je 0x43 <_JIT_ENTRY+0x43> + // 23: 48 8b 47 08 movq 0x8(%rdi), %rax + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 48 89 ce movq %rcx, %rsi + // 2f: 48 89 da movq %rbx, %rdx + // 32: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 39: 74 4e je 0x89 <_JIT_ENTRY+0x89> + // 3b: ff 15 00 00 00 00 callq *(%rip) # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: R_X86_64_GOTPCRELX PyObject_SetItem-0x4 + // 41: eb 4c jmp 0x8f <_JIT_ENTRY+0x8f> + // 43: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 48: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: R_X86_64_REX_GOTPCRELX PyExc_SystemError-0x4 + // 4f: 48 8b 30 movq (%rax), %rsi + // 52: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: R_X86_64_PC32 .L.str-0x4 + // 59: 4c 89 f7 movq %r14, %rdi + // 5c: 31 c0 xorl %eax, %eax + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: R_X86_64_GOTPCRELX _PyErr_Format-0x4 + // 64: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 69: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 72: 8b 03 movl (%rbx), %eax + // 74: 85 c0 testl %eax, %eax + // 76: 78 06 js 0x7e <_JIT_ENTRY+0x7e> + // 78: ff c8 decl %eax + // 7a: 89 03 movl %eax, (%rbx) + // 7c: 74 56 je 0xd4 <_JIT_ENTRY+0xd4> + // 7e: 49 83 c5 f8 addq $-0x8, %r13 + // 82: 58 popq %rax + // 83: ff 25 00 00 00 00 jmpq *(%rip) # 0x89 <_JIT_ENTRY+0x89> + // 0000000000000085: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 89: ff 15 00 00 00 00 callq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: R_X86_64_GOTPCRELX PyDict_SetItem-0x4 + // 8f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 94: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9d: 8b 0b movl (%rbx), %ecx + // 9f: 85 c9 testl %ecx, %ecx + // a1: 78 06 js 0xa9 <_JIT_ENTRY+0xa9> + // a3: ff c9 decl %ecx + // a5: 89 0b movl %ecx, (%rbx) + // a7: 74 0f je 0xb8 <_JIT_ENTRY+0xb8> + // a9: 49 83 c5 f8 addq $-0x8, %r13 + // ad: 85 c0 testl %eax, %eax + // af: 74 1c je 0xcd <_JIT_ENTRY+0xcd> + // b1: 58 popq %rax + // b2: ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // b8: 48 89 df movq %rbx, %rdi + // bb: 89 c3 movl %eax, %ebx + // bd: ff 15 00 00 00 00 callq *(%rip) # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // c3: 89 d8 movl %ebx, %eax + // c5: 49 83 c5 f8 addq $-0x8, %r13 + // c9: 85 c0 testl %eax, %eax + // cb: 75 e4 jne 0xb1 <_JIT_ENTRY+0xb1> + // cd: 58 popq %rax + // ce: ff 25 00 00 00 00 jmpq *(%rip) # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // d4: 48 89 df movq %rbx, %rdi + // d7: ff 15 00 00 00 00 callq *(%rip) # 0xdd <_JIT_ENTRY+0xdd> + // 00000000000000d9: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // dd: 49 83 c5 f8 addq $-0x8, %r13 + // e1: 58 popq %rax + // e2: ff 25 00 00 00 00 jmpq *(%rip) # 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e4: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[232] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x49, 0x8b, 0x04, + 0x24, 0x49, 0x8b, 0x7c, 0x24, 0x28, 0x48, 0x8b, + 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x4c, 0xc8, 0x18, 0x48, 0x85, + 0xff, 0x74, 0x20, 0x48, 0x8b, 0x47, 0x08, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xce, 0x48, + 0x89, 0xda, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x4e, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0xeb, 0x4c, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x30, 0x48, 0x8d, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0xf7, 0x31, 0xc0, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x03, 0x74, 0x56, 0x49, 0x83, + 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, + 0x0f, 0x49, 0x83, 0xc5, 0xf8, 0x85, 0xc0, 0x74, + 0x1c, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x49, 0x83, 0xc5, + 0xf8, 0x85, 0xc0, 0x75, 0xe4, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'no locals found when storing %R\x00' + // 20: OPARG + // 28: &PyDict_Type+0x0 + // 30: &PyObject_SetItem+0x0 + // 38: &PyExc_SystemError+0x0 + // 40: &_PyErr_Format+0x0 + // 48: ERROR_TARGET + // 50: &PyDict_SetItem+0x0 + // 58: &_Py_Dealloc+0x0 + // 60: CONTINUE + const unsigned char data_body[104] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&PyDict_Type); + patch_64(data + 0x30, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x38, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x40, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x48, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x50, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x58, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x60, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x15, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x34); + patch_32r(code + 0x55, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x85, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xd9, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)data + 0x44); +} + +void +emit__STORE_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SLICE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // a: 49 8b 75 f8 movq -0x8(%r13), %rsi + // e: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 12: 4d 8b 7d e0 movq -0x20(%r13), %r15 + // 16: 49 8b 5d e8 movq -0x18(%r13), %rbx + // 1a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1f: ff 15 00 00 00 00 callq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_GOTPCRELX _PyBuildSlice_ConsumeRefs-0x4 + // 25: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 33: 48 85 c0 testq %rax, %rax + // 36: 74 57 je 0x8f <_JIT_ENTRY+0x8f> + // 38: 48 89 c5 movq %rax, %rbp + // 3b: 49 83 c5 f0 addq $-0x10, %r13 + // 3f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 44: 48 89 df movq %rbx, %rdi + // 47: 48 89 c6 movq %rax, %rsi + // 4a: 4c 89 fa movq %r15, %rdx + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: R_X86_64_GOTPCRELX PyObject_SetItem-0x4 + // 53: 41 89 c6 movl %eax, %r14d + // 56: 8b 45 00 movl (%rbp), %eax + // 59: 85 c0 testl %eax, %eax + // 5b: 78 10 js 0x6d <_JIT_ENTRY+0x6d> + // 5d: ff c8 decl %eax + // 5f: 89 45 00 movl %eax, (%rbp) + // 62: 75 09 jne 0x6d <_JIT_ENTRY+0x6d> + // 64: 48 89 ef movq %rbp, %rdi + // 67: ff 15 00 00 00 00 callq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 6d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 72: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7b: 49 83 c5 10 addq $0x10, %r13 + // 7f: 45 85 f6 testl %r14d, %r14d + // 82: 41 0f 94 c6 sete %r14b + // 86: 41 8b 07 movl (%r15), %eax + // 89: 85 c0 testl %eax, %eax + // 8b: 79 0c jns 0x99 <_JIT_ENTRY+0x99> + // 8d: eb 1a jmp 0xa9 <_JIT_ENTRY+0xa9> + // 8f: 45 31 f6 xorl %r14d, %r14d + // 92: 41 8b 07 movl (%r15), %eax + // 95: 85 c0 testl %eax, %eax + // 97: 78 10 js 0xa9 <_JIT_ENTRY+0xa9> + // 99: ff c8 decl %eax + // 9b: 41 89 07 movl %eax, (%r15) + // 9e: 75 09 jne 0xa9 <_JIT_ENTRY+0xa9> + // a0: 4c 89 ff movq %r15, %rdi + // a3: ff 15 00 00 00 00 callq *(%rip) # 0xa9 <_JIT_ENTRY+0xa9> + // 00000000000000a5: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // a9: 8b 03 movl (%rbx), %eax + // ab: 85 c0 testl %eax, %eax + // ad: 78 06 js 0xb5 <_JIT_ENTRY+0xb5> + // af: ff c8 decl %eax + // b1: 89 03 movl %eax, (%rbx) + // b3: 74 19 je 0xce <_JIT_ENTRY+0xce> + // b5: 49 83 c5 e0 addq $-0x20, %r13 + // b9: 45 84 f6 testb %r14b, %r14b + // bc: 74 22 je 0xe0 <_JIT_ENTRY+0xe0> + // be: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // c3: 48 83 c4 10 addq $0x10, %rsp + // c7: 5d popq %rbp + // c8: ff 25 00 00 00 00 jmpq *(%rip) # 0xce <_JIT_ENTRY+0xce> + // 00000000000000ca: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // ce: 48 89 df movq %rbx, %rdi + // d1: ff 15 00 00 00 00 callq *(%rip) # 0xd7 <_JIT_ENTRY+0xd7> + // 00000000000000d3: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // d7: 49 83 c5 e0 addq $-0x20, %r13 + // db: 45 84 f6 testb %r14b, %r14b + // de: 75 de jne 0xbe <_JIT_ENTRY+0xbe> + // e0: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // e5: 48 83 c4 10 addq $0x10, %rsp + // e9: 5d popq %rbp + // ea: ff 25 00 00 00 00 jmpq *(%rip) # 0xf0 <_JIT_ENTRY+0xf0> + // 00000000000000ec: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[240] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4c, 0x89, 0x74, + 0x24, 0x08, 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8b, + 0x7d, 0xf0, 0x4d, 0x8b, 0x7d, 0xe0, 0x49, 0x8b, + 0x5d, 0xe8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x57, + 0x48, 0x89, 0xc5, 0x49, 0x83, 0xc5, 0xf0, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xdf, 0x48, + 0x89, 0xc6, 0x4c, 0x89, 0xfa, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x89, 0xc6, 0x8b, 0x45, + 0x00, 0x85, 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x89, + 0x45, 0x00, 0x75, 0x09, 0x48, 0x89, 0xef, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0x10, 0x45, + 0x85, 0xf6, 0x41, 0x0f, 0x94, 0xc6, 0x41, 0x8b, + 0x07, 0x85, 0xc0, 0x79, 0x0c, 0xeb, 0x1a, 0x45, + 0x31, 0xf6, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, + 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x19, 0x49, 0x83, 0xc5, + 0xe0, 0x45, 0x84, 0xf6, 0x74, 0x22, 0x4c, 0x8b, + 0x74, 0x24, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xe0, 0x45, 0x84, 0xf6, 0x75, 0xde, + 0x4c, 0x8b, 0x74, 0x24, 0x08, 0x48, 0x83, 0xc4, + 0x10, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyBuildSlice_ConsumeRefs+0x0 + // 8: &PyObject_SetItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa5, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xca, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xec, (uintptr_t)data + 0x1c); +} + +void +emit__STORE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // a: 49 8b 5d f8 movq -0x8(%r13), %rbx + // e: 4d 8b 7d e8 movq -0x18(%r13), %r15 + // 12: 49 8b 6d f0 movq -0x10(%r13), %rbp + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 89 ef movq %rbp, %rdi + // 1e: 48 89 de movq %rbx, %rsi + // 21: 4c 89 fa movq %r15, %rdx + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: R_X86_64_GOTPCRELX PyObject_SetItem-0x4 + // 2a: 41 89 c6 movl %eax, %r14d + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 41 8b 07 movl (%r15), %eax + // 3e: 85 c0 testl %eax, %eax + // 40: 78 10 js 0x52 <_JIT_ENTRY+0x52> + // 42: ff c8 decl %eax + // 44: 41 89 07 movl %eax, (%r15) + // 47: 75 09 jne 0x52 <_JIT_ENTRY+0x52> + // 49: 4c 89 ff movq %r15, %rdi + // 4c: ff 15 00 00 00 00 callq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 52: 8b 45 00 movl (%rbp), %eax + // 55: 85 c0 testl %eax, %eax + // 57: 78 10 js 0x69 <_JIT_ENTRY+0x69> + // 59: ff c8 decl %eax + // 5b: 89 45 00 movl %eax, (%rbp) + // 5e: 75 09 jne 0x69 <_JIT_ENTRY+0x69> + // 60: 48 89 ef movq %rbp, %rdi + // 63: ff 15 00 00 00 00 callq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 69: 8b 03 movl (%rbx), %eax + // 6b: 85 c0 testl %eax, %eax + // 6d: 78 06 js 0x75 <_JIT_ENTRY+0x75> + // 6f: ff c8 decl %eax + // 71: 89 03 movl %eax, (%rbx) + // 73: 74 19 je 0x8e <_JIT_ENTRY+0x8e> + // 75: 49 83 c5 e8 addq $-0x18, %r13 + // 79: 45 85 f6 testl %r14d, %r14d + // 7c: 74 22 je 0xa0 <_JIT_ENTRY+0xa0> + // 7e: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 83: 48 83 c4 10 addq $0x10, %rsp + // 87: 5d popq %rbp + // 88: ff 25 00 00 00 00 jmpq *(%rip) # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 8e: 48 89 df movq %rbx, %rdi + // 91: ff 15 00 00 00 00 callq *(%rip) # 0x97 <_JIT_ENTRY+0x97> + // 0000000000000093: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 97: 49 83 c5 e8 addq $-0x18, %r13 + // 9b: 45 85 f6 testl %r14d, %r14d + // 9e: 75 de jne 0x7e <_JIT_ENTRY+0x7e> + // a0: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // a5: 48 83 c4 10 addq $0x10, %rsp + // a9: 5d popq %rbp + // aa: ff 25 00 00 00 00 jmpq *(%rip) # 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000ac: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[170] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4c, 0x89, 0x74, + 0x24, 0x08, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x8b, + 0x7d, 0xe8, 0x49, 0x8b, 0x6d, 0xf0, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xef, 0x48, 0x89, + 0xde, 0x4c, 0x89, 0xfa, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, + 0x09, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x45, 0x00, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x89, 0x45, 0x00, 0x75, 0x09, + 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x03, 0x74, 0x19, 0x49, 0x83, 0xc5, + 0xe8, 0x45, 0x85, 0xf6, 0x74, 0x22, 0x4c, 0x8b, + 0x74, 0x24, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xe8, 0x45, 0x85, 0xf6, 0x75, 0xde, + 0x4c, 0x8b, 0x74, 0x24, 0x08, 0x48, 0x83, 0xc4, + 0x10, 0x5d, + }; + // 0: &PyObject_SetItem+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + 0x4); +} + +void +emit__STORE_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_DICT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 5: 48 8b 43 08 movq 0x8(%rbx), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyDict_Type-0x4 + // 10: 74 07 je 0x19 <_JIT_ENTRY+0x19> + // 12: 58 popq %rax + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 19: 49 8b 55 e8 movq -0x18(%r13), %rdx + // 1d: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 48 89 df movq %rbx, %rdi + // 29: ff 15 00 00 00 00 callq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: R_X86_64_GOTPCRELX _PyDict_SetItem_Take2-0x4 + // 2f: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 35: 8b 0b movl (%rbx), %ecx + // 37: 85 c9 testl %ecx, %ecx + // 39: 78 06 js 0x41 <_JIT_ENTRY+0x41> + // 3b: ff c9 decl %ecx + // 3d: 89 0b movl %ecx, (%rbx) + // 3f: 74 19 je 0x5a <_JIT_ENTRY+0x5a> + // 41: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 46: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4f: 85 c0 testl %eax, %eax + // 51: 74 26 je 0x79 <_JIT_ENTRY+0x79> + // 53: 58 popq %rax + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + // 5a: 48 89 df movq %rbx, %rdi + // 5d: 89 c3 movl %eax, %ebx + // 5f: ff 15 00 00 00 00 callq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 65: 89 d8 movl %ebx, %eax + // 67: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 75: 85 c0 testl %eax, %eax + // 77: 75 da jne 0x53 <_JIT_ENTRY+0x53> + // 79: 58 popq %rax + // 7a: ff 25 00 00 00 00 jmpq *(%rip) # 0x80 <_JIT_ENTRY+0x80> + // 000000000000007c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[122] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf0, 0x48, 0x8b, 0x43, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x55, 0xe8, 0x49, 0x8b, 0x75, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xdf, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0b, 0x74, + 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x26, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xdf, 0x89, 0xc3, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x75, + 0xda, 0x58, + }; + // 0: &PyDict_Type+0x0 + // 8: JUMP_TARGET + // 10: &_PyDict_SetItem_Take2+0x0 + // 18: ERROR_TARGET + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x1c); +} + +void +emit__STORE_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_LIST_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 49 8b 6d f8 movq -0x8(%r13), %rbp + // 5: 48 8b 45 08 movq 0x8(%rbp), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // 10: 0f 85 c9 00 00 00 jne 0xdf <_JIT_ENTRY+0xdf> + // 16: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 1a: 48 8b 43 08 movq 0x8(%rbx), %rax + // 1e: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_REX_GOTPCRELX PyList_Type-0x4 + // 25: 0f 85 b4 00 00 00 jne 0xdf <_JIT_ENTRY+0xdf> + // 2b: 48 8b 45 10 movq 0x10(%rbp), %rax + // 2f: 48 83 e0 fb andq $-0x5, %rax + // 33: 48 83 f8 09 cmpq $0x9, %rax + // 37: 0f 83 a2 00 00 00 jae 0xdf <_JIT_ENTRY+0xdf> + // 3d: 8b 45 18 movl 0x18(%rbp), %eax + // 40: 48 39 43 10 cmpq %rax, 0x10(%rbx) + // 44: 0f 8e 95 00 00 00 jle 0xdf <_JIT_ENTRY+0xdf> + // 4a: 49 8b 4d e8 movq -0x18(%r13), %rcx + // 4e: 49 83 c5 e8 addq $-0x18, %r13 + // 52: 48 8b 53 18 movq 0x18(%rbx), %rdx + // 56: 4c 8b 3c c2 movq (%rdx,%rax,8), %r15 + // 5a: 48 89 0c c2 movq %rcx, (%rdx,%rax,8) + // 5e: 8b 45 00 movl (%rbp), %eax + // 61: 85 c0 testl %eax, %eax + // 63: 78 34 js 0x99 <_JIT_ENTRY+0x99> + // 65: ff c8 decl %eax + // 67: 89 45 00 movl %eax, (%rbp) + // 6a: 75 2d jne 0x99 <_JIT_ENTRY+0x99> + // 6c: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 73: 48 8b 81 90 28 00 00 movq 0x2890(%rcx), %rax + // 7a: 48 85 c0 testq %rax, %rax + // 7d: 74 11 je 0x90 <_JIT_ENTRY+0x90> + // 7f: 48 8b 91 98 28 00 00 movq 0x2898(%rcx), %rdx + // 86: 48 89 ef movq %rbp, %rdi + // 89: be 01 00 00 00 movl $0x1, %esi + // 8e: ff d0 callq *%rax + // 90: 48 89 ef movq %rbp, %rdi + // 93: ff 15 00 00 00 00 callq *(%rip) # 0x99 <_JIT_ENTRY+0x99> + // 0000000000000095: R_X86_64_GOTPCRELX _PyLong_ExactDealloc-0x4 + // 99: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9e: 8b 03 movl (%rbx), %eax + // a0: 85 c0 testl %eax, %eax + // a2: 78 0f js 0xb3 <_JIT_ENTRY+0xb3> + // a4: ff c8 decl %eax + // a6: 89 03 movl %eax, (%rbx) + // a8: 75 09 jne 0xb3 <_JIT_ENTRY+0xb3> + // aa: 48 89 df movq %rbx, %rdi + // ad: ff 15 00 00 00 00 callq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // b3: 41 8b 07 movl (%r15), %eax + // b6: 85 c0 testl %eax, %eax + // b8: 78 10 js 0xca <_JIT_ENTRY+0xca> + // ba: ff c8 decl %eax + // bc: 41 89 07 movl %eax, (%r15) + // bf: 75 09 jne 0xca <_JIT_ENTRY+0xca> + // c1: 4c 89 ff movq %r15, %rdi + // c4: ff 15 00 00 00 00 callq *(%rip) # 0xca <_JIT_ENTRY+0xca> + // 00000000000000c6: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // ca: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // cf: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d8: 5d popq %rbp + // d9: ff 25 00 00 00 00 jmpq *(%rip) # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // df: 5d popq %rbp + // e0: ff 25 00 00 00 00 jmpq *(%rip) # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[230] = { + 0x55, 0x49, 0x8b, 0x6d, 0xf8, 0x48, 0x8b, 0x45, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xc9, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x5d, 0xf0, 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x85, 0xb4, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x45, 0x10, 0x48, + 0x83, 0xe0, 0xfb, 0x48, 0x83, 0xf8, 0x09, 0x0f, + 0x83, 0xa2, 0x00, 0x00, 0x00, 0x8b, 0x45, 0x18, + 0x48, 0x39, 0x43, 0x10, 0x0f, 0x8e, 0x95, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x4d, 0xe8, 0x49, 0x83, + 0xc5, 0xe8, 0x48, 0x8b, 0x53, 0x18, 0x4c, 0x8b, + 0x3c, 0xc2, 0x48, 0x89, 0x0c, 0xc2, 0x8b, 0x45, + 0x00, 0x85, 0xc0, 0x78, 0x34, 0xff, 0xc8, 0x89, + 0x45, 0x00, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x90, 0x28, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x48, + 0x8b, 0x91, 0x98, 0x28, 0x00, 0x00, 0x48, 0x89, + 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, + 0x48, 0x89, 0xef, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, + 0x75, 0x09, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, + 0x09, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x5d, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyList_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x95, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc6, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + 0x2c); +} + +void +emit__SWAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SWAP.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 7: c1 e0 03 shll $0x3, %eax + // a: 4c 89 e9 movq %r13, %rcx + // d: 48 29 c1 subq %rax, %rcx + // 10: 48 8b 01 movq (%rcx), %rax + // 13: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 17: 48 89 11 movq %rdx, (%rcx) + // 1a: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1e: ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[30] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x03, 0x4c, 0x89, 0xe9, 0x48, 0x29, 0xc1, + 0x48, 0x8b, 0x01, 0x49, 0x8b, 0x55, 0xf8, 0x48, + 0x89, 0x11, 0x49, 0x89, 0x45, 0xf8, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__TIER2_RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TIER2_RESUME_CHECK.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 46 18 movq 0x18(%r14), %rax + // 4: 84 c0 testb %al, %al + // 6: 74 06 je 0xe <_JIT_ENTRY+0xe> + // 8: ff 25 00 00 00 00 jmpq *(%rip) # 0xe <_JIT_ENTRY+0xe> + // 000000000000000a: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // e: ff 25 00 00 00 00 jmpq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[14] = { + 0x49, 0x8b, 0x46, 0x18, 0x84, 0xc0, 0x74, 0x06, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xa, (uintptr_t)data + -0x4); +} + +void +emit__TO_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 48 89 df movq %rbx, %rdi + // d: ff 15 00 00 00 00 callq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX PyObject_IsTrue-0x4 + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 8b 0b movl (%rbx), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 06 js 0x2d <_JIT_ENTRY+0x2d> + // 27: ff c9 decl %ecx + // 29: 89 0b movl %ecx, (%rbx) + // 2b: 74 2a je 0x57 <_JIT_ENTRY+0x57> + // 2d: 85 c0 testl %eax, %eax + // 2f: 78 37 js 0x68 <_JIT_ENTRY+0x68> + // 31: 75 12 jne 0x45 <_JIT_ENTRY+0x45> + // 33: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 3a: 49 89 45 f8 movq %rax, -0x8(%r13) + // 3e: 58 popq %rax + // 3f: ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 45: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 4c: 49 89 45 f8 movq %rax, -0x8(%r13) + // 50: 58 popq %rax + // 51: ff 25 00 00 00 00 jmpq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 57: 48 89 df movq %rbx, %rdi + // 5a: 89 c3 movl %eax, %ebx + // 5c: ff 15 00 00 00 00 callq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 62: 89 d8 movl %ebx, %eax + // 64: 85 c0 testl %eax, %eax + // 66: 79 c9 jns 0x31 <_JIT_ENTRY+0x31> + // 68: 49 83 c5 f8 addq $-0x8, %r13 + // 6c: 58 popq %rax + // 6d: ff 25 00 00 00 00 jmpq *(%rip) # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[115] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, + 0xc9, 0x89, 0x0b, 0x74, 0x2a, 0x85, 0xc0, 0x78, + 0x37, 0x75, 0x12, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd8, 0x85, 0xc0, 0x79, 0xc9, + 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &PyObject_IsTrue+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: CONTINUE + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0x24); +} + +void +emit__TO_BOOL_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_BOOL.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: R_X86_64_REX_GOTPCRELX PyBool_Type-0x4 + // f: 74 06 je 0x17 <_JIT_ENTRY+0x17> + // 11: ff 25 00 00 00 00 jmpq *(%rip) # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 17: ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x06, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyBool_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyBool_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + 0x4); +} + +void +emit__TO_BOOL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_INT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 08 movq 0x8(%rdi), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyLong_Type-0x4 + // 10: 74 07 je 0x19 <_JIT_ENTRY+0x19> + // 12: 58 popq %rax + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 19: 8b 47 10 movl 0x10(%rdi), %eax + // 1c: 83 e0 03 andl $0x3, %eax + // 1f: 83 f8 01 cmpl $0x1, %eax + // 22: 75 12 jne 0x36 <_JIT_ENTRY+0x36> + // 24: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 2b: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 2f: 58 popq %rax + // 30: ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 36: 8b 07 movl (%rdi), %eax + // 38: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 3f: 85 c0 testl %eax, %eax + // 41: 78 e8 js 0x2b <_JIT_ENTRY+0x2b> + // 43: ff c8 decl %eax + // 45: 89 07 movl %eax, (%rdi) + // 47: 75 e2 jne 0x2b <_JIT_ENTRY+0x2b> + // 49: ff 15 00 00 00 00 callq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 4f: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 53: 58 popq %rax + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[84] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x47, 0x10, 0x83, 0xe0, 0x03, 0x83, + 0xf8, 0x01, 0x75, 0x12, 0x48, 0x8b, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0xf8, 0x58, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, + 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0xe8, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0xe2, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x5d, 0xf8, 0x58, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: &_Py_TrueStruct+0x0 + // 28: &_Py_Dealloc+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x24); +} + +void +emit__TO_BOOL_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_LIST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 08 movq 0x8(%rdi), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyList_Type-0x4 + // 10: 74 07 je 0x19 <_JIT_ENTRY+0x19> + // 12: 58 popq %rax + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 19: 48 8b 5f 10 movq 0x10(%rdi), %rbx + // 1d: 8b 07 movl (%rdi), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 06 js 0x29 <_JIT_ENTRY+0x29> + // 23: ff c8 decl %eax + // 25: 89 07 movl %eax, (%rdi) + // 27: 74 17 je 0x40 <_JIT_ENTRY+0x40> + // 29: 48 85 db testq %rbx, %rbx + // 2c: 75 1d jne 0x4b <_JIT_ENTRY+0x4b> + // 2e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 58 popq %rax + // 3a: ff 25 00 00 00 00 jmpq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 40: ff 15 00 00 00 00 callq *(%rip) # 0x46 <_JIT_ENTRY+0x46> + // 0000000000000042: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 46: 48 85 db testq %rbx, %rbx + // 49: 74 e3 je 0x2e <_JIT_ENTRY+0x2e> + // 4b: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 52: 49 89 45 f8 movq %rax, -0x8(%r13) + // 56: 58 popq %rax + // 57: ff 25 00 00 00 00 jmpq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[87] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x5f, 0x10, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, + 0x17, 0x48, 0x85, 0xdb, 0x75, 0x1d, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xdb, 0x74, 0xe3, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x58, + }; + // 0: &PyList_Type+0x0 + // 8: JUMP_TARGET + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: &_Py_Dealloc+0x0 + // 28: &_Py_TrueStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyList_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x42, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x24); +} + +void +emit__TO_BOOL_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_NONE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // b: 74 06 je 0x13 <_JIT_ENTRY+0x13> + // d: ff 25 00 00 00 00 jmpq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 13: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 1a: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1e: ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[30] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x06, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: JUMP_TARGET + // 10: &_Py_FalseStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0xc); +} + +void +emit__TO_BOOL_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_STR.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 08 movq 0x8(%rdi), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyUnicode_Type-0x4 + // 10: 74 07 je 0x19 <_JIT_ENTRY+0x19> + // 12: 58 popq %rax + // 13: ff 25 00 00 00 00 jmpq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 19: b8 30 8a 00 00 movl $0x8a30, %eax # imm = 0x8A30 + // 1e: 48 03 05 00 00 00 00 addq (%rip), %rax # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: R_X86_64_REX_GOTPCRELX _PyRuntime-0x4 + // 25: 48 39 c7 cmpq %rax, %rdi + // 28: 74 1e je 0x48 <_JIT_ENTRY+0x48> + // 2a: 8b 07 movl (%rdi), %eax + // 2c: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 33: 85 c0 testl %eax, %eax + // 35: 78 06 js 0x3d <_JIT_ENTRY+0x3d> + // 37: ff c8 decl %eax + // 39: 89 07 movl %eax, (%rdi) + // 3b: 74 1d je 0x5a <_JIT_ENTRY+0x5a> + // 3d: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 41: 58 popq %rax + // 42: ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 48: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 4f: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 53: 58 popq %rax + // 54: ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 5a: ff 15 00 00 00 00 callq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 60: 49 89 5d f8 movq %rbx, -0x8(%r13) + // 64: 58 popq %rax + // 65: ff 25 00 00 00 00 jmpq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[101] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xb8, 0x30, 0x8a, 0x00, 0x00, 0x48, 0x03, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x39, 0xc7, + 0x74, 0x1e, 0x8b, 0x07, 0x48, 0x8b, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x07, 0x74, 0x1d, 0x49, 0x89, 0x5d, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x5d, 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x5d, 0xf8, 0x58, + }; + // 0: &PyUnicode_Type+0x0 + // 8: JUMP_TARGET + // 10: &_PyRuntime+0x0 + // 18: &_Py_TrueStruct+0x0 + // 20: CONTINUE + // 28: &_Py_FalseStruct+0x0 + // 30: &_Py_Dealloc+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x30, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x2c); +} + +void +emit__UNARY_INVERT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_INVERT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 48 89 df movq %rbx, %rdi + // d: ff 15 00 00 00 00 callq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX PyNumber_Invert-0x4 + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 8b 0b movl (%rbx), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 06 js 0x2d <_JIT_ENTRY+0x2d> + // 27: ff c9 decl %ecx + // 29: 89 0b movl %ecx, (%rbx) + // 2b: 74 10 je 0x3d <_JIT_ENTRY+0x3d> + // 2d: 48 85 c0 testq %rax, %rax + // 30: 74 1f je 0x51 <_JIT_ENTRY+0x51> + // 32: 49 89 45 f8 movq %rax, -0x8(%r13) + // 36: 58 popq %rax + // 37: ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3d: 48 89 df movq %rbx, %rdi + // 40: 48 89 c3 movq %rax, %rbx + // 43: ff 15 00 00 00 00 callq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 49: 48 89 d8 movq %rbx, %rax + // 4c: 48 85 c0 testq %rax, %rax + // 4f: 75 e1 jne 0x32 <_JIT_ENTRY+0x32> + // 51: 49 83 c5 f8 addq $-0x8, %r13 + // 55: 58 popq %rax + // 56: ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[92] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, + 0xc9, 0x89, 0x0b, 0x74, 0x10, 0x48, 0x85, 0xc0, + 0x74, 0x1f, 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, + 0xe1, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyNumber_Invert+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyNumber_Invert); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0x14); +} + +void +emit__UNARY_NEGATIVE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NEGATIVE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 5: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a: 48 89 df movq %rbx, %rdi + // d: ff 15 00 00 00 00 callq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: R_X86_64_GOTPCRELX PyNumber_Negative-0x4 + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 8b 0b movl (%rbx), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 06 js 0x2d <_JIT_ENTRY+0x2d> + // 27: ff c9 decl %ecx + // 29: 89 0b movl %ecx, (%rbx) + // 2b: 74 10 je 0x3d <_JIT_ENTRY+0x3d> + // 2d: 48 85 c0 testq %rax, %rax + // 30: 74 1f je 0x51 <_JIT_ENTRY+0x51> + // 32: 49 89 45 f8 movq %rax, -0x8(%r13) + // 36: 58 popq %rax + // 37: ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 3d: 48 89 df movq %rbx, %rdi + // 40: 48 89 c3 movq %rax, %rbx + // 43: ff 15 00 00 00 00 callq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 49: 48 89 d8 movq %rbx, %rax + // 4c: 48 85 c0 testq %rax, %rax + // 4f: 75 e1 jne 0x32 <_JIT_ENTRY+0x32> + // 51: 49 83 c5 f8 addq $-0x8, %r13 + // 55: 58 popq %rax + // 56: ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[92] = { + 0x50, 0x49, 0x8b, 0x5d, 0xf8, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xdf, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, + 0xc9, 0x89, 0x0b, 0x74, 0x10, 0x48, 0x85, 0xc0, + 0x74, 0x1f, 0x49, 0x89, 0x45, 0xf8, 0x58, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xdf, + 0x48, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xd8, 0x48, 0x85, 0xc0, 0x75, + 0xe1, 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyNumber_Negative+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyNumber_Negative); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0x14); +} + +void +emit__UNARY_NOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NOT.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: R_X86_64_REX_GOTPCRELX _Py_FalseStruct-0x4 + // 7: 49 39 45 f8 cmpq %rax, -0x8(%r13) + // b: 75 07 jne 0x14 <_JIT_ENTRY+0x14> + // d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: R_X86_64_REX_GOTPCRELX _Py_TrueStruct-0x4 + // 14: 49 89 45 f8 movq %rax, -0x8(%r13) + // 18: ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[24] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x39, 0x45, 0xf8, 0x75, 0x07, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); +} + +void +emit__UNPACK_EX( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_EX.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 10 subq $0x10, %rsp + // 5: 4c 89 f7 movq %r14, %rdi + // 8: 8b 05 00 00 00 00 movl (%rip), %eax # 0xe <_JIT_ENTRY+0xe> + // 000000000000000a: R_X86_64_GOTPCRELX _JIT_OPARG-0x4 + // e: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // 12: 0f b6 d8 movzbl %al, %ebx + // 15: 49 8d 4c dd 00 leaq (%r13,%rbx,8), %rcx + // 1a: 0f b6 ec movzbl %ah, %ebp + // 1d: 4c 8d 04 e9 leaq (%rcx,%rbp,8), %r8 + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // 2b: 4c 89 fe movq %r15, %rsi + // 2e: 89 da movl %ebx, %edx + // 30: 89 e9 movl %ebp, %ecx + // 32: ff 15 00 00 00 00 callq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: R_X86_64_GOTPCRELX _PyEval_UnpackIterableStackRef-0x4 + // 38: 41 89 c6 movl %eax, %r14d + // 3b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 40: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 49: 41 8b 07 movl (%r15), %eax + // 4c: 85 c0 testl %eax, %eax + // 4e: 78 07 js 0x57 <_JIT_ENTRY+0x57> + // 50: ff c8 decl %eax + // 52: 41 89 07 movl %eax, (%r15) + // 55: 74 1c je 0x73 <_JIT_ENTRY+0x73> + // 57: 45 85 f6 testl %r14d, %r14d + // 5a: 74 25 je 0x81 <_JIT_ENTRY+0x81> + // 5c: 01 eb addl %ebp, %ebx + // 5e: 4d 8d 6c dd 00 leaq (%r13,%rbx,8), %r13 + // 63: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 68: 48 83 c4 10 addq $0x10, %rsp + // 6c: 5d popq %rbp + // 6d: ff 25 00 00 00 00 jmpq *(%rip) # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 73: 4c 89 ff movq %r15, %rdi + // 76: ff 15 00 00 00 00 callq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 7c: 45 85 f6 testl %r14d, %r14d + // 7f: 75 db jne 0x5c <_JIT_ENTRY+0x5c> + // 81: 49 83 c5 f8 addq $-0x8, %r13 + // 85: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // 8a: 48 83 c4 10 addq $0x10, %rsp + // 8e: 5d popq %rbp + // 8f: ff 25 00 00 00 00 jmpq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[149] = { + 0x55, 0x48, 0x83, 0xec, 0x10, 0x4c, 0x89, 0xf7, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x7d, 0xf8, 0x0f, 0xb6, 0xd8, 0x49, 0x8d, 0x4c, + 0xdd, 0x00, 0x0f, 0xb6, 0xec, 0x4c, 0x8d, 0x04, + 0xe9, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0x74, 0x24, 0x08, 0x4c, 0x89, 0xfe, 0x89, 0xda, + 0x89, 0xe9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x07, + 0xff, 0xc8, 0x41, 0x89, 0x07, 0x74, 0x1c, 0x45, + 0x85, 0xf6, 0x74, 0x25, 0x01, 0xeb, 0x4d, 0x8d, + 0x6c, 0xdd, 0x00, 0x4c, 0x8b, 0x74, 0x24, 0x08, + 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xff, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x85, 0xf6, 0x75, + 0xdb, 0x49, 0x83, 0xc5, 0xf8, 0x4c, 0x8b, 0x74, + 0x24, 0x08, 0x48, 0x83, 0xc4, 0x10, 0x5d, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x8 <_JIT_ENTRY+0x8> + // 0000000000000004: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 8: 41 0f b7 d7 movzwl %r15w, %edx + // c: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 10: 4c 8d 04 d5 f8 ff ff ff leaq -0x8(,%rdx,8), %r8 + // 18: 4d 01 e8 addq %r13, %r8 + // 1b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 20: 4c 89 f7 movq %r14, %rdi + // 23: 48 89 de movq %rbx, %rsi + // 26: b9 ff ff ff ff movl $0xffffffff, %ecx # imm = 0xFFFFFFFF + // 2b: ff 15 00 00 00 00 callq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: R_X86_64_GOTPCRELX _PyEval_UnpackIterableStackRef-0x4 + // 31: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 36: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3f: 8b 0b movl (%rbx), %ecx + // 41: 85 c9 testl %ecx, %ecx + // 43: 78 06 js 0x4b <_JIT_ENTRY+0x4b> + // 45: ff c9 decl %ecx + // 47: 89 0b movl %ecx, (%rbx) + // 49: 74 14 je 0x5f <_JIT_ENTRY+0x5f> + // 4b: 85 c0 testl %eax, %eax + // 4d: 74 21 je 0x70 <_JIT_ENTRY+0x70> + // 4f: 41 0f b7 c7 movzwl %r15w, %eax + // 53: 4d 8d 6c c5 f8 leaq -0x8(%r13,%rax,8), %r13 + // 58: 58 popq %rax + // 59: ff 25 00 00 00 00 jmpq *(%rip) # 0x5f <_JIT_ENTRY+0x5f> + // 000000000000005b: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 5f: 48 89 df movq %rbx, %rdi + // 62: 89 c3 movl %eax, %ebx + // 64: ff 15 00 00 00 00 callq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 6a: 89 d8 movl %ebx, %eax + // 6c: 85 c0 testl %eax, %eax + // 6e: 75 df jne 0x4f <_JIT_ENTRY+0x4f> + // 70: 49 83 c5 f8 addq $-0x8, %r13 + // 74: 58 popq %rax + // 75: ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[123] = { + 0x50, 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x0f, 0xb7, 0xd7, 0x49, 0x8b, 0x5d, 0xf8, + 0x4c, 0x8d, 0x04, 0xd5, 0xf8, 0xff, 0xff, 0xff, + 0x4d, 0x01, 0xe8, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x4c, 0x89, 0xf7, 0x48, 0x89, 0xde, 0xb9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0b, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0b, 0x74, 0x14, 0x85, 0xc0, 0x74, 0x21, 0x41, + 0x0f, 0xb7, 0xc7, 0x4d, 0x8d, 0x6c, 0xc5, 0xf8, + 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xdf, 0x89, 0xc3, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xd8, 0x85, 0xc0, 0x75, 0xdf, + 0x49, 0x83, 0xc5, 0xf8, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x4, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_LIST.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 08 movq 0x8(%rdi), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyList_Type-0x4 + // 10: 75 53 jne 0x65 <_JIT_ENTRY+0x65> + // 12: 48 8b 5f 10 movq 0x10(%rdi), %rbx + // 16: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 1d: 48 39 c3 cmpq %rax, %rbx + // 20: 75 43 jne 0x65 <_JIT_ENTRY+0x65> + // 22: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 29: 66 85 c0 testw %ax, %ax + // 2c: 74 3e je 0x6c <_JIT_ENTRY+0x6c> + // 2e: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 32: 48 8b 4f 18 movq 0x18(%rdi), %rcx + // 36: 48 8d 53 01 leaq 0x1(%rbx), %rdx + // 3a: eb 14 jmp 0x50 <_JIT_ENTRY+0x50> + // 3c: 0f 1f 40 00 nopl (%rax) + // 40: 48 89 30 movq %rsi, (%rax) + // 43: 48 83 c0 08 addq $0x8, %rax + // 47: 48 ff ca decq %rdx + // 4a: 48 83 fa 01 cmpq $0x1, %rdx + // 4e: 76 1c jbe 0x6c <_JIT_ENTRY+0x6c> + // 50: 48 8b 74 d1 f0 movq -0x10(%rcx,%rdx,8), %rsi + // 55: 44 8b 06 movl (%rsi), %r8d + // 58: 45 85 c0 testl %r8d, %r8d + // 5b: 78 e3 js 0x40 <_JIT_ENTRY+0x40> + // 5d: 41 ff c0 incl %r8d + // 60: 44 89 06 movl %r8d, (%rsi) + // 63: eb db jmp 0x40 <_JIT_ENTRY+0x40> + // 65: 58 popq %rax + // 66: ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 6c: 8b 07 movl (%rdi), %eax + // 6e: 85 c0 testl %eax, %eax + // 70: 78 06 js 0x78 <_JIT_ENTRY+0x78> + // 72: ff c8 decl %eax + // 74: 89 07 movl %eax, (%rdi) + // 76: 74 0c je 0x84 <_JIT_ENTRY+0x84> + // 78: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 7d: 58 popq %rax + // 7e: ff 25 00 00 00 00 jmpq *(%rip) # 0x84 <_JIT_ENTRY+0x84> + // 0000000000000080: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 84: ff 15 00 00 00 00 callq *(%rip) # 0x8a <_JIT_ENTRY+0x8a> + // 0000000000000086: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 8a: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 8f: 58 popq %rax + // 90: ff 25 00 00 00 00 jmpq *(%rip) # 0x96 <_JIT_ENTRY+0x96> + // 0000000000000092: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[144] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x53, 0x48, 0x8b, 0x5f, 0x10, 0x0f, 0xb7, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x39, 0xc3, + 0x75, 0x43, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3e, 0x49, 0x8d, + 0x45, 0xf8, 0x48, 0x8b, 0x4f, 0x18, 0x48, 0x8d, + 0x53, 0x01, 0xeb, 0x14, 0x0f, 0x1f, 0x40, 0x00, + 0x48, 0x89, 0x30, 0x48, 0x83, 0xc0, 0x08, 0x48, + 0xff, 0xca, 0x48, 0x83, 0xfa, 0x01, 0x76, 0x1c, + 0x48, 0x8b, 0x74, 0xd1, 0xf0, 0x44, 0x8b, 0x06, + 0x45, 0x85, 0xc0, 0x78, 0xe3, 0x41, 0xff, 0xc0, + 0x44, 0x89, 0x06, 0xeb, 0xdb, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x0c, + 0x4d, 0x8d, 0x6c, 0xdd, 0xf8, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8d, 0x6c, 0xdd, 0xf8, 0x58, + }; + // 0: &PyList_Type+0x0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: CONTINUE + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyList_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x80, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x86, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 08 movq 0x8(%rdi), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyTuple_Type-0x4 + // 10: 75 4f jne 0x61 <_JIT_ENTRY+0x61> + // 12: 48 8b 5f 10 movq 0x10(%rdi), %rbx + // 16: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 1d: 48 39 c3 cmpq %rax, %rbx + // 20: 75 3f jne 0x61 <_JIT_ENTRY+0x61> + // 22: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: R_X86_64_REX_GOTPCRELX _JIT_OPARG-0x4 + // 29: 66 85 c0 testw %ax, %ax + // 2c: 74 3a je 0x68 <_JIT_ENTRY+0x68> + // 2e: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 32: 48 8d 4b 01 leaq 0x1(%rbx), %rcx + // 36: eb 18 jmp 0x50 <_JIT_ENTRY+0x50> + // 38: 0f 1f 84 00 00 00 00 00 nopl (%rax,%rax) + // 40: 48 89 10 movq %rdx, (%rax) + // 43: 48 83 c0 08 addq $0x8, %rax + // 47: 48 ff c9 decq %rcx + // 4a: 48 83 f9 01 cmpq $0x1, %rcx + // 4e: 76 18 jbe 0x68 <_JIT_ENTRY+0x68> + // 50: 48 8b 54 cf 08 movq 0x8(%rdi,%rcx,8), %rdx + // 55: 8b 32 movl (%rdx), %esi + // 57: 85 f6 testl %esi, %esi + // 59: 78 e5 js 0x40 <_JIT_ENTRY+0x40> + // 5b: ff c6 incl %esi + // 5d: 89 32 movl %esi, (%rdx) + // 5f: eb df jmp 0x40 <_JIT_ENTRY+0x40> + // 61: 58 popq %rax + // 62: ff 25 00 00 00 00 jmpq *(%rip) # 0x68 <_JIT_ENTRY+0x68> + // 0000000000000064: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + // 68: 8b 07 movl (%rdi), %eax + // 6a: 85 c0 testl %eax, %eax + // 6c: 78 06 js 0x74 <_JIT_ENTRY+0x74> + // 6e: ff c8 decl %eax + // 70: 89 07 movl %eax, (%rdi) + // 72: 74 0c je 0x80 <_JIT_ENTRY+0x80> + // 74: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 79: 58 popq %rax + // 7a: ff 25 00 00 00 00 jmpq *(%rip) # 0x80 <_JIT_ENTRY+0x80> + // 000000000000007c: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 80: ff 15 00 00 00 00 callq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 86: 4d 8d 6c dd f8 leaq -0x8(%r13,%rbx,8), %r13 + // 8b: 58 popq %rax + // 8c: ff 25 00 00 00 00 jmpq *(%rip) # 0x92 <_JIT_ENTRY+0x92> + // 000000000000008e: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[140] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x4f, 0x48, 0x8b, 0x5f, 0x10, 0x0f, 0xb7, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x39, 0xc3, + 0x75, 0x3f, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3a, 0x49, 0x8d, + 0x45, 0xf8, 0x48, 0x8d, 0x4b, 0x01, 0xeb, 0x18, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0x10, 0x48, 0x83, 0xc0, 0x08, 0x48, + 0xff, 0xc9, 0x48, 0x83, 0xf9, 0x01, 0x76, 0x18, + 0x48, 0x8b, 0x54, 0xcf, 0x08, 0x8b, 0x32, 0x85, + 0xf6, 0x78, 0xe5, 0xff, 0xc6, 0x89, 0x32, 0xeb, + 0xdf, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x07, 0x74, 0x0c, 0x4d, 0x8d, 0x6c, 0xdd, + 0xf8, 0x58, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8d, + 0x6c, 0xdd, 0xf8, 0x58, + }; + // 0: &PyTuple_Type+0x0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: CONTINUE + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_32r(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x64, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE_TWO_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TWO_TUPLE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 50 pushq %rax + // 1: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 5: 48 8b 47 08 movq 0x8(%rdi), %rax + // 9: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: R_X86_64_REX_GOTPCRELX PyTuple_Type-0x4 + // 10: 75 4a jne 0x5c <_JIT_ENTRY+0x5c> + // 12: 48 83 7f 10 02 cmpq $0x2, 0x10(%rdi) + // 17: 75 43 jne 0x5c <_JIT_ENTRY+0x5c> + // 19: 48 8b 5f 18 movq 0x18(%rdi), %rbx + // 1d: 8b 03 movl (%rbx), %eax + // 1f: 85 c0 testl %eax, %eax + // 21: 78 04 js 0x27 <_JIT_ENTRY+0x27> + // 23: ff c0 incl %eax + // 25: 89 03 movl %eax, (%rbx) + // 27: 4c 8b 7f 20 movq 0x20(%rdi), %r15 + // 2b: 41 8b 07 movl (%r15), %eax + // 2e: 85 c0 testl %eax, %eax + // 30: 78 05 js 0x37 <_JIT_ENTRY+0x37> + // 32: ff c0 incl %eax + // 34: 41 89 07 movl %eax, (%r15) + // 37: 8b 07 movl (%rdi), %eax + // 39: 85 c0 testl %eax, %eax + // 3b: 78 0c js 0x49 <_JIT_ENTRY+0x49> + // 3d: ff c8 decl %eax + // 3f: 89 07 movl %eax, (%rdi) + // 41: 75 06 jne 0x49 <_JIT_ENTRY+0x49> + // 43: ff 15 00 00 00 00 callq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 49: 4d 89 7d f8 movq %r15, -0x8(%r13) + // 4d: 49 89 5d 00 movq %rbx, (%r13) + // 51: 49 83 c5 08 addq $0x8, %r13 + // 55: 58 popq %rax + // 56: ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // 5c: 58 popq %rax + // 5d: ff 25 00 00 00 00 jmpq *(%rip) # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: R_X86_64_GOTPCRELX _JIT_JUMP_TARGET-0x4 + const unsigned char code_body[99] = { + 0x50, 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x4a, 0x48, 0x83, 0x7f, 0x10, 0x02, 0x75, + 0x43, 0x48, 0x8b, 0x5f, 0x18, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x03, 0x4c, + 0x8b, 0x7f, 0x20, 0x41, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x05, 0xff, 0xc0, 0x41, 0x89, 0x07, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x7d, 0xf8, 0x49, 0x89, 0x5d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x58, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0x14); +} + +void +emit__WITH_EXCEPT_START( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _WITH_EXCEPT_START.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 40 subq $0x40, %rsp + // 5: 4c 89 74 24 08 movq %r14, 0x8(%rsp) + // a: 4d 8b 7d f8 movq -0x8(%r13), %r15 + // e: 4d 8b 75 d8 movq -0x28(%r13), %r14 + // 12: 49 8b 6d e0 movq -0x20(%r13), %rbp + // 16: 49 8b 5f 08 movq 0x8(%r15), %rbx + // 1a: 4c 89 ff movq %r15, %rdi + // 1d: ff 15 00 00 00 00 callq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: R_X86_64_GOTPCRELX PyException_GetTraceback-0x4 + // 23: 48 85 c0 testq %rax, %rax + // 26: 74 27 je 0x4f <_JIT_ENTRY+0x4f> + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 8b 08 movl (%rax), %ecx + // 2f: 85 c9 testl %ecx, %ecx + // 31: 78 15 js 0x48 <_JIT_ENTRY+0x48> + // 33: ff c9 decl %ecx + // 35: 89 08 movl %ecx, (%rax) + // 37: 75 0f jne 0x48 <_JIT_ENTRY+0x48> + // 39: 48 89 c7 movq %rax, %rdi + // 3c: 49 89 c5 movq %rax, %r13 + // 3f: ff 15 00 00 00 00 callq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: R_X86_64_GOTPCRELX _Py_Dealloc-0x4 + // 45: 4c 89 e8 movq %r13, %rax + // 48: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4d: eb 07 jmp 0x56 <_JIT_ENTRY+0x56> + // 4f: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: R_X86_64_REX_GOTPCRELX _Py_NoneStruct-0x4 + // 56: 48 c7 44 24 10 00 00 00 00 movq $0x0, 0x10(%rsp) + // 5f: 48 89 6c 24 18 movq %rbp, 0x18(%rsp) + // 64: 48 8d 74 24 20 leaq 0x20(%rsp), %rsi + // 69: 48 89 5c 24 20 movq %rbx, 0x20(%rsp) + // 6e: 4c 89 7c 24 28 movq %r15, 0x28(%rsp) + // 73: 48 89 44 24 30 movq %rax, 0x30(%rsp) + // 78: 48 b8 03 00 00 00 00 00 00 80 movabsq $-0x7ffffffffffffffd, %rax # imm = 0x8000000000000003 + // 82: 48 8d 50 01 leaq 0x1(%rax), %rdx + // 86: 31 c9 xorl %ecx, %ecx + // 88: 48 85 ed testq %rbp, %rbp + // 8b: 0f 95 c1 setne %cl + // 8e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 93: 48 0f 44 d0 cmoveq %rax, %rdx + // 97: c1 e1 03 shll $0x3, %ecx + // 9a: 48 29 ce subq %rcx, %rsi + // 9d: 4c 89 f7 movq %r14, %rdi + // a0: 31 c9 xorl %ecx, %ecx + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: R_X86_64_GOTPCRELX PyObject_Vectorcall-0x4 + // a8: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ad: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b6: 48 85 c0 testq %rax, %rax + // b9: 74 18 je 0xd3 <_JIT_ENTRY+0xd3> + // bb: 49 89 45 00 movq %rax, (%r13) + // bf: 49 83 c5 08 addq $0x8, %r13 + // c3: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // c8: 48 83 c4 40 addq $0x40, %rsp + // cc: 5d popq %rbp + // cd: ff 25 00 00 00 00 jmpq *(%rip) # 0xd3 <_JIT_ENTRY+0xd3> + // 00000000000000cf: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + // d3: 4c 8b 74 24 08 movq 0x8(%rsp), %r14 + // d8: 48 83 c4 40 addq $0x40, %rsp + // dc: 5d popq %rbp + // dd: ff 25 00 00 00 00 jmpq *(%rip) # 0xe3 <_JIT_ENTRY+0xe3> + // 00000000000000df: R_X86_64_GOTPCRELX _JIT_ERROR_TARGET-0x4 + const unsigned char code_body[227] = { + 0x55, 0x48, 0x83, 0xec, 0x40, 0x4c, 0x89, 0x74, + 0x24, 0x08, 0x4d, 0x8b, 0x7d, 0xf8, 0x4d, 0x8b, + 0x75, 0xd8, 0x49, 0x8b, 0x6d, 0xe0, 0x49, 0x8b, + 0x5f, 0x08, 0x4c, 0x89, 0xff, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x27, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x08, 0x75, + 0x0f, 0x48, 0x89, 0xc7, 0x49, 0x89, 0xc5, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xe8, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0xeb, 0x07, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0xc7, + 0x44, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0x6c, 0x24, 0x18, 0x48, 0x8d, 0x74, 0x24, + 0x20, 0x48, 0x89, 0x5c, 0x24, 0x20, 0x4c, 0x89, + 0x7c, 0x24, 0x28, 0x48, 0x89, 0x44, 0x24, 0x30, + 0x48, 0xb8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x48, 0x8d, 0x50, 0x01, 0x31, 0xc9, + 0x48, 0x85, 0xed, 0x0f, 0x95, 0xc1, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x0f, 0x44, 0xd0, 0xc1, + 0xe1, 0x03, 0x48, 0x29, 0xce, 0x4c, 0x89, 0xf7, + 0x31, 0xc9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x74, 0x18, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x4c, 0x8b, 0x74, 0x24, 0x08, + 0x48, 0x83, 0xc4, 0x40, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x74, 0x24, 0x08, + 0x48, 0x83, 0xc4, 0x40, 0x5d, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &PyException_GetTraceback+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &PyObject_Vectorcall+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyException_GetTraceback); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xcf, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xdf, (uintptr_t)data + 0x24); +} + +void +emit__YIELD_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _YIELD_VALUE.o: file format elf64-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 4: 49 83 44 24 38 02 addq $0x2, 0x38(%r12) + // a: 49 83 c5 f8 addq $-0x8, %r13 + // e: 0f b6 05 00 00 00 00 movzbl (%rip), %eax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: R_X86_64_GOTPCREL _JIT_OPARG-0x4 + // 15: 04 fe addb $-0x2, %al + // 17: 41 88 44 24 fb movb %al, -0x5(%r12) + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 49 8b 44 24 e8 movq -0x18(%r12), %rax + // 26: 49 89 46 78 movq %rax, 0x78(%r14) + // 2a: 49 c7 44 24 e8 00 00 00 00 movq $0x0, -0x18(%r12) + // 33: 41 ff 46 2c incl 0x2c(%r14) + // 37: 49 8b 44 24 08 movq 0x8(%r12), %rax + // 3c: 49 89 46 48 movq %rax, 0x48(%r14) + // 40: 49 c7 44 24 08 00 00 00 00 movq $0x0, 0x8(%r12) + // 49: 4c 8b 68 40 movq 0x40(%rax), %r13 + // 4d: 48 c7 40 40 00 00 00 00 movq $0x0, 0x40(%rax) + // 55: 49 89 4d 00 movq %rcx, (%r13) + // 59: 49 83 c5 08 addq $0x8, %r13 + // 5d: 49 89 c4 movq %rax, %r12 + // 60: ff 25 00 00 00 00 jmpq *(%rip) # 0x66 <_JIT_ENTRY+0x66> + // 0000000000000062: R_X86_64_GOTPCRELX _JIT_CONTINUE-0x4 + const unsigned char code_body[96] = { + 0x49, 0x8b, 0x4d, 0xf8, 0x49, 0x83, 0x44, 0x24, + 0x38, 0x02, 0x49, 0x83, 0xc5, 0xf8, 0x0f, 0xb6, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0x41, + 0x88, 0x44, 0x24, 0xfb, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x49, 0x8b, 0x44, 0x24, 0xe8, 0x49, 0x89, + 0x46, 0x78, 0x49, 0xc7, 0x44, 0x24, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x41, 0xff, 0x46, 0x2c, 0x49, + 0x8b, 0x44, 0x24, 0x08, 0x49, 0x89, 0x46, 0x48, + 0x49, 0xc7, 0x44, 0x24, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8b, 0x68, 0x40, 0x48, 0xc7, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x49, 0x89, 0xc4, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_32r(code + 0x11, (uintptr_t)data + -0x4); +} + +static_assert(SYMBOL_MASK_WORDS >= 1, "SYMBOL_MASK_WORDS too small"); + +typedef struct { + void (*emit)( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state); + size_t code_size; + size_t data_size; + symbol_mask trampoline_mask; +} StencilGroup; + +static const StencilGroup shim = {emit_shim, 34, 8, {0}}; + +static const StencilGroup stencil_groups[MAX_UOP_ID + 1] = { + [_BINARY_OP] = {emit__BINARY_OP, 134, 40, {0}}, + [_BINARY_OP_ADD_FLOAT] = {emit__BINARY_OP_ADD_FLOAT, 58, 24, {0}}, + [_BINARY_OP_ADD_INT] = {emit__BINARY_OP_ADD_INT, 184, 40, {0}}, + [_BINARY_OP_ADD_UNICODE] = {emit__BINARY_OP_ADD_UNICODE, 184, 40, {0}}, + [_BINARY_OP_EXTEND] = {emit__BINARY_OP_EXTEND, 115, 24, {0}}, + [_BINARY_OP_INPLACE_ADD_UNICODE] = {emit__BINARY_OP_INPLACE_ADD_UNICODE, 220, 56, {0}}, + [_BINARY_OP_MULTIPLY_FLOAT] = {emit__BINARY_OP_MULTIPLY_FLOAT, 58, 24, {0}}, + [_BINARY_OP_MULTIPLY_INT] = {emit__BINARY_OP_MULTIPLY_INT, 184, 40, {0}}, + [_BINARY_OP_SUBSCR_CHECK_FUNC] = {emit__BINARY_OP_SUBSCR_CHECK_FUNC, 112, 16, {0}}, + [_BINARY_OP_SUBSCR_DICT] = {emit__BINARY_OP_SUBSCR_DICT, 201, 56, {0}}, + [_BINARY_OP_SUBSCR_INIT_CALL] = {emit__BINARY_OP_SUBSCR_INIT_CALL, 176, 0, {0}}, + [_BINARY_OP_SUBSCR_LIST_INT] = {emit__BINARY_OP_SUBSCR_LIST_INT, 220, 56, {0}}, + [_BINARY_OP_SUBSCR_STR_INT] = {emit__BINARY_OP_SUBSCR_STR_INT, 360, 48, {0}}, + [_BINARY_OP_SUBSCR_TUPLE_INT] = {emit__BINARY_OP_SUBSCR_TUPLE_INT, 217, 56, {0}}, + [_BINARY_OP_SUBTRACT_FLOAT] = {emit__BINARY_OP_SUBTRACT_FLOAT, 58, 24, {0}}, + [_BINARY_OP_SUBTRACT_INT] = {emit__BINARY_OP_SUBTRACT_INT, 184, 40, {0}}, + [_BINARY_SLICE] = {emit__BINARY_SLICE, 190, 40, {0}}, + [_BUILD_LIST] = {emit__BUILD_LIST, 74, 32, {0}}, + [_BUILD_MAP] = {emit__BUILD_MAP, 232, 40, {0}}, + [_BUILD_SET] = {emit__BUILD_SET, 446, 40, {0}}, + [_BUILD_SLICE] = {emit__BUILD_SLICE, 214, 40, {0}}, + [_BUILD_STRING] = {emit__BUILD_STRING, 205, 48, {0}}, + [_BUILD_TUPLE] = {emit__BUILD_TUPLE, 74, 32, {0}}, + [_CALL_BUILTIN_CLASS] = {emit__CALL_BUILTIN_CLASS, 343, 40, {0}}, + [_CALL_BUILTIN_FAST] = {emit__CALL_BUILTIN_FAST, 340, 48, {0}}, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = {emit__CALL_BUILTIN_FAST_WITH_KEYWORDS, 340, 48, {0}}, + [_CALL_BUILTIN_O] = {emit__CALL_BUILTIN_O, 262, 48, {0}}, + [_CALL_INTRINSIC_1] = {emit__CALL_INTRINSIC_1, 109, 40, {0}}, + [_CALL_INTRINSIC_2] = {emit__CALL_INTRINSIC_2, 140, 40, {0}}, + [_CALL_ISINSTANCE] = {emit__CALL_ISINSTANCE, 332, 56, {0}}, + [_CALL_KW_NON_PY] = {emit__CALL_KW_NON_PY, 378, 40, {0}}, + [_CALL_LEN] = {emit__CALL_LEN, 257, 56, {0}}, + [_CALL_LIST_APPEND] = {emit__CALL_LIST_APPEND, 214, 40, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST] = {emit__CALL_METHOD_DESCRIPTOR_FAST, 345, 48, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 345, 48, {0}}, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = {emit__CALL_METHOD_DESCRIPTOR_NOARGS, 268, 48, {0}}, + [_CALL_METHOD_DESCRIPTOR_O] = {emit__CALL_METHOD_DESCRIPTOR_O, 361, 48, {0}}, + [_CALL_NON_PY_GENERAL] = {emit__CALL_NON_PY_GENERAL, 321, 40, {0}}, + [_CALL_STR_1] = {emit__CALL_STR_1, 120, 48, {0}}, + [_CALL_TUPLE_1] = {emit__CALL_TUPLE_1, 120, 48, {0}}, + [_CALL_TYPE_1] = {emit__CALL_TYPE_1, 113, 32, {0}}, + [_CHECK_AND_ALLOCATE_OBJECT] = {emit__CHECK_AND_ALLOCATE_OBJECT, 261, 64, {0}}, + [_CHECK_ATTR_CLASS] = {emit__CHECK_ATTR_CLASS, 43, 24, {0}}, + [_CHECK_ATTR_METHOD_LAZY_DICT] = {emit__CHECK_ATTR_METHOD_LAZY_DICT, 25, 16, {0}}, + [_CHECK_ATTR_MODULE_PUSH_KEYS] = {emit__CHECK_ATTR_MODULE_PUSH_KEYS, 70, 32, {0}}, + [_CHECK_ATTR_WITH_HINT] = {emit__CHECK_ATTR_WITH_HINT, 33, 16, {0}}, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 56, 24, {0}}, + [_CHECK_EG_MATCH] = {emit__CHECK_EG_MATCH, 331, 56, {0}}, + [_CHECK_EXC_MATCH] = {emit__CHECK_EXC_MATCH, 187, 56, {0}}, + [_CHECK_FUNCTION] = {emit__CHECK_FUNCTION, 31, 24, {0}}, + [_CHECK_FUNCTION_EXACT_ARGS] = {emit__CHECK_FUNCTION_EXACT_ARGS, 59, 24, {0}}, + [_CHECK_FUNCTION_VERSION] = {emit__CHECK_FUNCTION_VERSION, 61, 40, {0}}, + [_CHECK_FUNCTION_VERSION_INLINE] = {emit__CHECK_FUNCTION_VERSION_INLINE, 33, 32, {0}}, + [_CHECK_FUNCTION_VERSION_KW] = {emit__CHECK_FUNCTION_VERSION_KW, 61, 40, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE] = {emit__CHECK_IS_NOT_PY_CALLABLE, 56, 40, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = {emit__CHECK_IS_NOT_PY_CALLABLE_KW, 56, 40, {0}}, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = {emit__CHECK_MANAGED_OBJECT_HAS_VALUES, 31, 16, {0}}, + [_CHECK_METHOD_VERSION] = {emit__CHECK_METHOD_VERSION, 84, 40, {0}}, + [_CHECK_METHOD_VERSION_KW] = {emit__CHECK_METHOD_VERSION_KW, 90, 40, {0}}, + [_CHECK_PEP_523] = {emit__CHECK_PEP_523, 20, 8, {0}}, + [_CHECK_PERIODIC] = {emit__CHECK_PERIODIC, 49, 16, {0}}, + [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = {emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM, 60, 24, {0}}, + [_CHECK_STACK_SPACE] = {emit__CHECK_STACK_SPACE, 74, 16, {0}}, + [_CHECK_STACK_SPACE_OPERAND] = {emit__CHECK_STACK_SPACE_OPERAND, 51, 16, {0}}, + [_CHECK_VALIDITY] = {emit__CHECK_VALIDITY, 19, 16, {0}}, + [_CHECK_VALIDITY_AND_SET_IP] = {emit__CHECK_VALIDITY_AND_SET_IP, 31, 24, {0}}, + [_COMPARE_OP] = {emit__COMPARE_OP, 274, 64, {0}}, + [_COMPARE_OP_FLOAT] = {emit__COMPARE_OP_FLOAT, 266, 48, {0}}, + [_COMPARE_OP_INT] = {emit__COMPARE_OP_INT, 315, 48, {0}}, + [_COMPARE_OP_STR] = {emit__COMPARE_OP_STR, 196, 56, {0}}, + [_CONTAINS_OP] = {emit__CONTAINS_OP, 162, 56, {0}}, + [_CONTAINS_OP_DICT] = {emit__CONTAINS_OP_DICT, 184, 72, {0}}, + [_CONTAINS_OP_SET] = {emit__CONTAINS_OP_SET, 199, 80, {0}}, + [_CONVERT_VALUE] = {emit__CONVERT_VALUE, 123, 40, {0}}, + [_COPY] = {emit__COPY, 37, 8, {0}}, + [_COPY_FREE_VARS] = {emit__COPY_FREE_VARS, 166, 16, {0}}, + [_CREATE_INIT_FRAME] = {emit__CREATE_INIT_FRAME, 273, 56, {0}}, + [_DELETE_ATTR] = {emit__DELETE_ATTR, 102, 32, {0}}, + [_DELETE_DEREF] = {emit__DELETE_DEREF, 135, 40, {0}}, + [_DELETE_FAST] = {emit__DELETE_FAST, 164, 136, {0}}, + [_DELETE_GLOBAL] = {emit__DELETE_GLOBAL, 131, 80, {0}}, + [_DELETE_NAME] = {emit__DELETE_NAME, 171, 112, {0}}, + [_DELETE_SUBSCR] = {emit__DELETE_SUBSCR, 113, 24, {0}}, + [_DEOPT] = {emit__DEOPT, 40, 16, {0}}, + [_DICT_MERGE] = {emit__DICT_MERGE, 193, 48, {0}}, + [_DICT_UPDATE] = {emit__DICT_UPDATE, 246, 112, {0}}, + [_END_FOR] = {emit__END_FOR, 68, 16, {0}}, + [_END_SEND] = {emit__END_SEND, 50, 16, {0}}, + [_ERROR_POP_N] = {emit__ERROR_POP_N, 47, 16, {0}}, + [_EXIT_INIT_CHECK] = {emit__EXIT_INIT_CHECK, 78, 80, {0}}, + [_EXIT_TRACE] = {emit__EXIT_TRACE, 443, 32, {0}}, + [_EXPAND_METHOD] = {emit__EXPAND_METHOD, 130, 24, {0}}, + [_EXPAND_METHOD_KW] = {emit__EXPAND_METHOD_KW, 130, 24, {0}}, + [_FATAL_ERROR] = {emit__FATAL_ERROR, 21, 48, {0}}, + [_FORMAT_SIMPLE] = {emit__FORMAT_SIMPLE, 149, 40, {0}}, + [_FORMAT_WITH_SPEC] = {emit__FORMAT_WITH_SPEC, 125, 32, {0}}, + [_FOR_ITER_GEN_FRAME] = {emit__FOR_ITER_GEN_FRAME, 105, 32, {0}}, + [_FOR_ITER_TIER_TWO] = {emit__FOR_ITER_TIER_TWO, 171, 56, {0}}, + [_GET_AITER] = {emit__GET_AITER, 328, 200, {0}}, + [_GET_ANEXT] = {emit__GET_ANEXT, 57, 24, {0}}, + [_GET_AWAITABLE] = {emit__GET_AWAITABLE, 99, 40, {0}}, + [_GET_ITER] = {emit__GET_ITER, 92, 32, {0}}, + [_GET_LEN] = {emit__GET_LEN, 71, 32, {0}}, + [_GET_YIELD_FROM_ITER] = {emit__GET_YIELD_FROM_ITER, 195, 136, {0}}, + [_GUARD_BINARY_OP_EXTEND] = {emit__GUARD_BINARY_OP_EXTEND, 56, 24, {0}}, + [_GUARD_BOTH_FLOAT] = {emit__GUARD_BOTH_FLOAT, 40, 16, {0}}, + [_GUARD_BOTH_INT] = {emit__GUARD_BOTH_INT, 40, 16, {0}}, + [_GUARD_BOTH_UNICODE] = {emit__GUARD_BOTH_UNICODE, 40, 16, {0}}, + [_GUARD_BUILTINS_VERSION_PUSH_KEYS] = {emit__GUARD_BUILTINS_VERSION_PUSH_KEYS, 54, 32, {0}}, + [_GUARD_DORV_NO_DICT] = {emit__GUARD_DORV_NO_DICT, 32, 8, {0}}, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = {emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 31, 16, {0}}, + [_GUARD_GLOBALS_VERSION] = {emit__GUARD_GLOBALS_VERSION, 46, 32, {0}}, + [_GUARD_GLOBALS_VERSION_PUSH_KEYS] = {emit__GUARD_GLOBALS_VERSION_PUSH_KEYS, 54, 32, {0}}, + [_GUARD_IS_FALSE_POP] = {emit__GUARD_IS_FALSE_POP, 23, 16, {0}}, + [_GUARD_IS_NONE_POP] = {emit__GUARD_IS_NONE_POP, 90, 32, {0}}, + [_GUARD_IS_NOT_NONE_POP] = {emit__GUARD_IS_NOT_NONE_POP, 95, 32, {0}}, + [_GUARD_IS_TRUE_POP] = {emit__GUARD_IS_TRUE_POP, 23, 16, {0}}, + [_GUARD_KEYS_VERSION] = {emit__GUARD_KEYS_VERSION, 38, 24, {0}}, + [_GUARD_NOS_FLOAT] = {emit__GUARD_NOS_FLOAT, 23, 16, {0}}, + [_GUARD_NOS_INT] = {emit__GUARD_NOS_INT, 23, 16, {0}}, + [_GUARD_NOT_EXHAUSTED_LIST] = {emit__GUARD_NOT_EXHAUSTED_LIST, 49, 16, {0}}, + [_GUARD_NOT_EXHAUSTED_RANGE] = {emit__GUARD_NOT_EXHAUSTED_RANGE, 23, 16, {0}}, + [_GUARD_NOT_EXHAUSTED_TUPLE] = {emit__GUARD_NOT_EXHAUSTED_TUPLE, 35, 16, {0}}, + [_GUARD_TOS_FLOAT] = {emit__GUARD_TOS_FLOAT, 23, 16, {0}}, + [_GUARD_TOS_INT] = {emit__GUARD_TOS_INT, 23, 16, {0}}, + [_GUARD_TYPE_VERSION] = {emit__GUARD_TYPE_VERSION, 34, 24, {0}}, + [_GUARD_TYPE_VERSION_AND_LOCK] = {emit__GUARD_TYPE_VERSION_AND_LOCK, 34, 24, {0}}, + [_IMPORT_FROM] = {emit__IMPORT_FROM, 80, 32, {0}}, + [_IMPORT_NAME] = {emit__IMPORT_NAME, 149, 40, {0}}, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS, 130, 24, {0}}, + [_INIT_CALL_PY_EXACT_ARGS] = {emit__INIT_CALL_PY_EXACT_ARGS, 512, 8, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_0] = {emit__INIT_CALL_PY_EXACT_ARGS_0, 179, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_1] = {emit__INIT_CALL_PY_EXACT_ARGS_1, 197, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_2] = {emit__INIT_CALL_PY_EXACT_ARGS_2, 206, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_3] = {emit__INIT_CALL_PY_EXACT_ARGS_3, 215, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_4] = {emit__INIT_CALL_PY_EXACT_ARGS_4, 224, 0, {0}}, + [_IS_NONE] = {emit__IS_NONE, 73, 40, {0}}, + [_IS_OP] = {emit__IS_OP, 113, 40, {0}}, + [_ITER_CHECK_LIST] = {emit__ITER_CHECK_LIST, 23, 16, {0}}, + [_ITER_CHECK_RANGE] = {emit__ITER_CHECK_RANGE, 23, 16, {0}}, + [_ITER_CHECK_TUPLE] = {emit__ITER_CHECK_TUPLE, 23, 16, {0}}, + [_ITER_NEXT_LIST] = {emit__ITER_NEXT_LIST, 46, 0, {0}}, + [_ITER_NEXT_RANGE] = {emit__ITER_NEXT_RANGE, 57, 24, {0}}, + [_ITER_NEXT_TUPLE] = {emit__ITER_NEXT_TUPLE, 43, 0, {0}}, + [_JUMP_TO_TOP] = {emit__JUMP_TO_TOP, 6, 8, {0}}, + [_LIST_APPEND] = {emit__LIST_APPEND, 90, 32, {0}}, + [_LIST_EXTEND] = {emit__LIST_EXTEND, 276, 128, {0}}, + [_LOAD_ATTR] = {emit__LOAD_ATTR, 240, 48, {0}}, + [_LOAD_ATTR_CLASS] = {emit__LOAD_ATTR_CLASS, 56, 24, {0}}, + [_LOAD_ATTR_INSTANCE_VALUE] = {emit__LOAD_ATTR_INSTANCE_VALUE, 101, 32, {0}}, + [_LOAD_ATTR_METHOD_LAZY_DICT] = {emit__LOAD_ATTR_METHOD_LAZY_DICT, 33, 8, {0}}, + [_LOAD_ATTR_METHOD_NO_DICT] = {emit__LOAD_ATTR_METHOD_NO_DICT, 33, 8, {0}}, + [_LOAD_ATTR_METHOD_WITH_VALUES] = {emit__LOAD_ATTR_METHOD_WITH_VALUES, 33, 8, {0}}, + [_LOAD_ATTR_MODULE] = {emit__LOAD_ATTR_MODULE, 99, 32, {0}}, + [_LOAD_ATTR_MODULE_FROM_KEYS] = {emit__LOAD_ATTR_MODULE_FROM_KEYS, 131, 32, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 45, 16, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 45, 16, {0}}, + [_LOAD_ATTR_PROPERTY_FRAME] = {emit__LOAD_ATTR_PROPERTY_FRAME, 256, 24, {0}}, + [_LOAD_ATTR_SLOT] = {emit__LOAD_ATTR_SLOT, 72, 32, {0}}, + [_LOAD_ATTR_WITH_HINT] = {emit__LOAD_ATTR_WITH_HINT, 147, 32, {0}}, + [_LOAD_BUILD_CLASS] = {emit__LOAD_BUILD_CLASS, 133, 80, {0}}, + [_LOAD_COMMON_CONSTANT] = {emit__LOAD_COMMON_CONSTANT, 54, 32, {0}}, + [_LOAD_CONST_IMMORTAL] = {emit__LOAD_CONST_IMMORTAL, 28, 8, {0}}, + [_LOAD_CONST_INLINE] = {emit__LOAD_CONST_INLINE, 25, 8, {0}}, + [_LOAD_CONST_INLINE_BORROW] = {emit__LOAD_CONST_INLINE_BORROW, 15, 8, {0}}, + [_LOAD_CONST_MORTAL] = {emit__LOAD_CONST_MORTAL, 38, 8, {0}}, + [_LOAD_DEREF] = {emit__LOAD_DEREF, 93, 32, {0}}, + [_LOAD_FAST] = {emit__LOAD_FAST, 30, 8, {0}}, + [_LOAD_FAST_0] = {emit__LOAD_FAST_0, 23, 0, {0}}, + [_LOAD_FAST_1] = {emit__LOAD_FAST_1, 23, 0, {0}}, + [_LOAD_FAST_2] = {emit__LOAD_FAST_2, 23, 0, {0}}, + [_LOAD_FAST_3] = {emit__LOAD_FAST_3, 23, 0, {0}}, + [_LOAD_FAST_4] = {emit__LOAD_FAST_4, 23, 0, {0}}, + [_LOAD_FAST_5] = {emit__LOAD_FAST_5, 23, 0, {0}}, + [_LOAD_FAST_6] = {emit__LOAD_FAST_6, 26, 0, {0}}, + [_LOAD_FAST_7] = {emit__LOAD_FAST_7, 26, 0, {0}}, + [_LOAD_FAST_AND_CLEAR] = {emit__LOAD_FAST_AND_CLEAR, 29, 8, {0}}, + [_LOAD_FAST_CHECK] = {emit__LOAD_FAST_CHECK, 121, 128, {0}}, + [_LOAD_FROM_DICT_OR_DEREF] = {emit__LOAD_FROM_DICT_OR_DEREF, 229, 48, {0}}, + [_LOAD_GLOBAL] = {emit__LOAD_GLOBAL, 89, 32, {0}}, + [_LOAD_GLOBAL_BUILTINS] = {emit__LOAD_GLOBAL_BUILTINS, 74, 24, {0}}, + [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = {emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS, 69, 24, {0}}, + [_LOAD_GLOBAL_MODULE] = {emit__LOAD_GLOBAL_MODULE, 74, 24, {0}}, + [_LOAD_GLOBAL_MODULE_FROM_KEYS] = {emit__LOAD_GLOBAL_MODULE_FROM_KEYS, 69, 24, {0}}, + [_LOAD_LOCALS] = {emit__LOAD_LOCALS, 88, 48, {0}}, + [_LOAD_NAME] = {emit__LOAD_NAME, 79, 32, {0}}, + [_LOAD_SMALL_INT] = {emit__LOAD_SMALL_INT, 34, 16, {0}}, + [_LOAD_SMALL_INT_0] = {emit__LOAD_SMALL_INT_0, 20, 8, {0}}, + [_LOAD_SMALL_INT_1] = {emit__LOAD_SMALL_INT_1, 20, 8, {0}}, + [_LOAD_SMALL_INT_2] = {emit__LOAD_SMALL_INT_2, 20, 8, {0}}, + [_LOAD_SMALL_INT_3] = {emit__LOAD_SMALL_INT_3, 20, 8, {0}}, + [_LOAD_SPECIAL] = {emit__LOAD_SPECIAL, 193, 56, {0}}, + [_LOAD_SUPER_ATTR_ATTR] = {emit__LOAD_SUPER_ATTR_ATTR, 208, 56, {0}}, + [_LOAD_SUPER_ATTR_METHOD] = {emit__LOAD_SUPER_ATTR_METHOD, 315, 64, {0}}, + [_MAKE_CALLARGS_A_TUPLE] = {emit__MAKE_CALLARGS_A_TUPLE, 177, 48, {0}}, + [_MAKE_CELL] = {emit__MAKE_CELL, 111, 40, {0}}, + [_MAKE_FUNCTION] = {emit__MAKE_FUNCTION, 126, 40, {0}}, + [_MAKE_WARM] = {emit__MAKE_WARM, 39, 16, {0}}, + [_MAP_ADD] = {emit__MAP_ADD, 72, 24, {0}}, + [_MATCH_CLASS] = {emit__MATCH_CLASS, 201, 48, {0}}, + [_MATCH_KEYS] = {emit__MATCH_KEYS, 64, 24, {0}}, + [_MATCH_MAPPING] = {emit__MATCH_MAPPING, 53, 24, {0}}, + [_MATCH_SEQUENCE] = {emit__MATCH_SEQUENCE, 53, 24, {0}}, + [_MAYBE_EXPAND_METHOD] = {emit__MAYBE_EXPAND_METHOD, 157, 32, {0}}, + [_MAYBE_EXPAND_METHOD_KW] = {emit__MAYBE_EXPAND_METHOD_KW, 160, 32, {0}}, + [_NOP] = {emit__NOP, 0, 0, {0}}, + [_POP_EXCEPT] = {emit__POP_EXCEPT, 75, 16, {0}}, + [_POP_TOP] = {emit__POP_TOP, 35, 16, {0}}, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = {emit__POP_TOP_LOAD_CONST_INLINE_BORROW, 62, 16, {0}}, + [_PUSH_EXC_INFO] = {emit__PUSH_EXC_INFO, 48, 8, {0}}, + [_PUSH_FRAME] = {emit__PUSH_FRAME, 36, 0, {0}}, + [_PUSH_NULL] = {emit__PUSH_NULL, 12, 0, {0}}, + [_PUSH_NULL_CONDITIONAL] = {emit__PUSH_NULL_CONDITIONAL, 29, 8, {0}}, + [_PY_FRAME_GENERAL] = {emit__PY_FRAME_GENERAL, 174, 32, {0}}, + [_PY_FRAME_KW] = {emit__PY_FRAME_KW, 218, 40, {0}}, + [_REPLACE_WITH_TRUE] = {emit__REPLACE_WITH_TRUE, 53, 24, {0}}, + [_RESUME_CHECK] = {emit__RESUME_CHECK, 29, 16, {0}}, + [_RETURN_GENERATOR] = {emit__RETURN_GENERATOR, 481, 32, {0}}, + [_RETURN_VALUE] = {emit__RETURN_VALUE, 62, 8, {0}}, + [_SAVE_RETURN_OFFSET] = {emit__SAVE_RETURN_OFFSET, 13, 8, {0}}, + [_SEND_GEN_FRAME] = {emit__SEND_GEN_FRAME, 113, 32, {0}}, + [_SETUP_ANNOTATIONS] = {emit__SETUP_ANNOTATIONS, 272, 120, {0}}, + [_SET_ADD] = {emit__SET_ADD, 104, 32, {0}}, + [_SET_FUNCTION_ATTRIBUTE] = {emit__SET_FUNCTION_ATTRIBUTE, 41, 16, {0}}, + [_SET_IP] = {emit__SET_IP, 12, 8, {0}}, + [_SET_UPDATE] = {emit__SET_UPDATE, 110, 40, {0}}, + [_START_EXECUTOR] = {emit__START_EXECUTOR, 83, 16, {0}}, + [_STORE_ATTR] = {emit__STORE_ATTR, 133, 32, {0}}, + [_STORE_ATTR_INSTANCE_VALUE] = {emit__STORE_ATTR_INSTANCE_VALUE, 174, 24, {0}}, + [_STORE_ATTR_SLOT] = {emit__STORE_ATTR_SLOT, 113, 24, {0}}, + [_STORE_ATTR_WITH_HINT] = {emit__STORE_ATTR_WITH_HINT, 221, 40, {0}}, + [_STORE_DEREF] = {emit__STORE_DEREF, 72, 16, {0}}, + [_STORE_FAST] = {emit__STORE_FAST, 90, 24, {0}}, + [_STORE_FAST_0] = {emit__STORE_FAST_0, 83, 16, {0}}, + [_STORE_FAST_1] = {emit__STORE_FAST_1, 83, 16, {0}}, + [_STORE_FAST_2] = {emit__STORE_FAST_2, 83, 16, {0}}, + [_STORE_FAST_3] = {emit__STORE_FAST_3, 83, 16, {0}}, + [_STORE_FAST_4] = {emit__STORE_FAST_4, 83, 16, {0}}, + [_STORE_FAST_5] = {emit__STORE_FAST_5, 83, 16, {0}}, + [_STORE_FAST_6] = {emit__STORE_FAST_6, 89, 16, {0}}, + [_STORE_FAST_7] = {emit__STORE_FAST_7, 89, 16, {0}}, + [_STORE_GLOBAL] = {emit__STORE_GLOBAL, 107, 32, {0}}, + [_STORE_NAME] = {emit__STORE_NAME, 232, 104, {0}}, + [_STORE_SLICE] = {emit__STORE_SLICE, 240, 40, {0}}, + [_STORE_SUBSCR] = {emit__STORE_SUBSCR, 170, 24, {0}}, + [_STORE_SUBSCR_DICT] = {emit__STORE_SUBSCR_DICT, 122, 40, {0}}, + [_STORE_SUBSCR_LIST_INT] = {emit__STORE_SUBSCR_LIST_INT, 230, 56, {0}}, + [_SWAP] = {emit__SWAP, 30, 8, {0}}, + [_TIER2_RESUME_CHECK] = {emit__TIER2_RESUME_CHECK, 14, 8, {0}}, + [_TO_BOOL] = {emit__TO_BOOL, 115, 48, {0}}, + [_TO_BOOL_BOOL] = {emit__TO_BOOL_BOOL, 23, 16, {0}}, + [_TO_BOOL_INT] = {emit__TO_BOOL_INT, 84, 48, {0}}, + [_TO_BOOL_LIST] = {emit__TO_BOOL_LIST, 87, 48, {0}}, + [_TO_BOOL_NONE] = {emit__TO_BOOL_NONE, 30, 24, {0}}, + [_TO_BOOL_STR] = {emit__TO_BOOL_STR, 101, 56, {0}}, + [_UNARY_INVERT] = {emit__UNARY_INVERT, 92, 32, {0}}, + [_UNARY_NEGATIVE] = {emit__UNARY_NEGATIVE, 92, 32, {0}}, + [_UNARY_NOT] = {emit__UNARY_NOT, 24, 16, {0}}, + [_UNPACK_EX] = {emit__UNPACK_EX, 149, 40, {0}}, + [_UNPACK_SEQUENCE] = {emit__UNPACK_SEQUENCE, 123, 40, {0}}, + [_UNPACK_SEQUENCE_LIST] = {emit__UNPACK_SEQUENCE_LIST, 144, 40, {0}}, + [_UNPACK_SEQUENCE_TUPLE] = {emit__UNPACK_SEQUENCE_TUPLE, 140, 40, {0}}, + [_UNPACK_SEQUENCE_TWO_TUPLE] = {emit__UNPACK_SEQUENCE_TWO_TUPLE, 99, 32, {0}}, + [_WITH_EXCEPT_START] = {emit__WITH_EXCEPT_START, 227, 48, {0}}, + [_YIELD_VALUE] = {emit__YIELD_VALUE, 96, 8, {0}}, +}; + +static const void * const symbols_map[1] = { + 0 +}; diff --git a/Tools/jit/stencils/x86_64-pc-windows-msvc.h b/Tools/jit/stencils/x86_64-pc-windows-msvc.h new file mode 100644 index 00000000000000..c13cbe97706330 --- /dev/null +++ b/Tools/jit/stencils/x86_64-pc-windows-msvc.h @@ -0,0 +1,23318 @@ +void +emit_shim( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // shim.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 41 57 pushq %r15 + // 2: 41 56 pushq %r14 + // 4: 41 55 pushq %r13 + // 6: 41 54 pushq %r12 + // 8: 56 pushq %rsi + // 9: 57 pushq %rdi + // a: 53 pushq %rbx + // b: 48 81 ec a0 00 00 00 subq $0xa0, %rsp + // 12: 44 0f 29 bc 24 90 00 00 00 movaps %xmm15, 0x90(%rsp) + // 1b: 44 0f 29 b4 24 80 00 00 00 movaps %xmm14, 0x80(%rsp) + // 24: 44 0f 29 6c 24 70 movaps %xmm13, 0x70(%rsp) + // 2a: 44 0f 29 64 24 60 movaps %xmm12, 0x60(%rsp) + // 30: 44 0f 29 5c 24 50 movaps %xmm11, 0x50(%rsp) + // 36: 44 0f 29 54 24 40 movaps %xmm10, 0x40(%rsp) + // 3c: 44 0f 29 4c 24 30 movaps %xmm9, 0x30(%rsp) + // 42: 44 0f 29 44 24 20 movaps %xmm8, 0x20(%rsp) + // 48: 0f 29 7c 24 10 movaps %xmm7, 0x10(%rsp) + // 4d: 0f 29 34 24 movaps %xmm6, (%rsp) + // 51: 49 89 cc movq %rcx, %r12 + // 54: 49 89 d5 movq %rdx, %r13 + // 57: 4d 89 c6 movq %r8, %r14 + // 5a: ff 15 00 00 00 00 callq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 60: 0f 28 34 24 movaps (%rsp), %xmm6 + // 64: 0f 28 7c 24 10 movaps 0x10(%rsp), %xmm7 + // 69: 44 0f 28 44 24 20 movaps 0x20(%rsp), %xmm8 + // 6f: 44 0f 28 4c 24 30 movaps 0x30(%rsp), %xmm9 + // 75: 44 0f 28 54 24 40 movaps 0x40(%rsp), %xmm10 + // 7b: 44 0f 28 5c 24 50 movaps 0x50(%rsp), %xmm11 + // 81: 44 0f 28 64 24 60 movaps 0x60(%rsp), %xmm12 + // 87: 44 0f 28 6c 24 70 movaps 0x70(%rsp), %xmm13 + // 8d: 44 0f 28 b4 24 80 00 00 00 movaps 0x80(%rsp), %xmm14 + // 96: 44 0f 28 bc 24 90 00 00 00 movaps 0x90(%rsp), %xmm15 + // 9f: 48 81 c4 a0 00 00 00 addq $0xa0, %rsp + // a6: 5b popq %rbx + // a7: 5f popq %rdi + // a8: 5e popq %rsi + // a9: 41 5c popq %r12 + // ab: 41 5d popq %r13 + // ad: 41 5e popq %r14 + // af: 41 5f popq %r15 + // b1: c3 retq + const unsigned char code_body[178] = { + 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, + 0x56, 0x57, 0x53, 0x48, 0x81, 0xec, 0xa0, 0x00, + 0x00, 0x00, 0x44, 0x0f, 0x29, 0xbc, 0x24, 0x90, + 0x00, 0x00, 0x00, 0x44, 0x0f, 0x29, 0xb4, 0x24, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x0f, 0x29, 0x6c, + 0x24, 0x70, 0x44, 0x0f, 0x29, 0x64, 0x24, 0x60, + 0x44, 0x0f, 0x29, 0x5c, 0x24, 0x50, 0x44, 0x0f, + 0x29, 0x54, 0x24, 0x40, 0x44, 0x0f, 0x29, 0x4c, + 0x24, 0x30, 0x44, 0x0f, 0x29, 0x44, 0x24, 0x20, + 0x0f, 0x29, 0x7c, 0x24, 0x10, 0x0f, 0x29, 0x34, + 0x24, 0x49, 0x89, 0xcc, 0x49, 0x89, 0xd5, 0x4d, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x28, 0x34, 0x24, 0x0f, 0x28, 0x7c, 0x24, + 0x10, 0x44, 0x0f, 0x28, 0x44, 0x24, 0x20, 0x44, + 0x0f, 0x28, 0x4c, 0x24, 0x30, 0x44, 0x0f, 0x28, + 0x54, 0x24, 0x40, 0x44, 0x0f, 0x28, 0x5c, 0x24, + 0x50, 0x44, 0x0f, 0x28, 0x64, 0x24, 0x60, 0x44, + 0x0f, 0x28, 0x6c, 0x24, 0x70, 0x44, 0x0f, 0x28, + 0xb4, 0x24, 0x80, 0x00, 0x00, 0x00, 0x44, 0x0f, + 0x28, 0xbc, 0x24, 0x90, 0x00, 0x00, 0x00, 0x48, + 0x81, 0xc4, 0xa0, 0x00, 0x00, 0x00, 0x5b, 0x5f, + 0x5e, 0x41, 0x5c, 0x41, 0x5d, 0x41, 0x5e, 0x41, + 0x5f, 0xc3, + }; + // 0: CONTINUE + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + -0x4); +} + +void +emit__BINARY_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 18: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__PyEval_BinaryOps + // 1f: 48 89 d9 movq %rbx, %rcx + // 22: 48 89 f2 movq %rsi, %rdx + // 25: ff 14 c7 callq *(%rdi,%rax,8) + // 28: 48 89 c7 movq %rax, %rdi + // 2b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 30: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 39: 8b 03 movl (%rbx), %eax + // 3b: 85 c0 testl %eax, %eax + // 3d: 78 0f js 0x4e <_JIT_ENTRY+0x4e> + // 3f: ff c8 decl %eax + // 41: 89 03 movl %eax, (%rbx) + // 43: 75 09 jne 0x4e <_JIT_ENTRY+0x4e> + // 45: 48 89 d9 movq %rbx, %rcx + // 48: ff 15 00 00 00 00 callq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4e: 8b 06 movl (%rsi), %eax + // 50: 85 c0 testl %eax, %eax + // 52: 78 06 js 0x5a <_JIT_ENTRY+0x5a> + // 54: ff c8 decl %eax + // 56: 89 06 movl %eax, (%rsi) + // 58: 74 18 je 0x72 <_JIT_ENTRY+0x72> + // 5a: 48 85 ff testq %rdi, %rdi + // 5d: 74 21 je 0x80 <_JIT_ENTRY+0x80> + // 5f: 49 89 7d f0 movq %rdi, -0x10(%r13) + // 63: 49 83 c5 f8 addq $-0x8, %r13 + // 67: 48 83 c4 28 addq $0x28, %rsp + // 6b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 72: 48 89 f1 movq %rsi, %rcx + // 75: ff 15 00 00 00 00 callq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7b: 48 85 ff testq %rdi, %rdi + // 7e: 75 df jne 0x5f <_JIT_ENTRY+0x5f> + // 80: 49 83 c5 f0 addq $-0x10, %r13 + // 84: 48 83 c4 28 addq $0x28, %rsp + // 88: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[143] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xd9, 0x48, 0x89, 0xf2, 0xff, 0x14, 0xc7, + 0x48, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xd9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, + 0x74, 0x18, 0x48, 0x85, 0xff, 0x74, 0x21, 0x49, + 0x89, 0x7d, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xff, 0x75, 0xdf, + 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_BinaryOps+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_BinaryOps); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_ADD_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 49 8d 75 f0 leaq -0x10(%r13), %rsi + // 10: f2 0f 10 51 10 movsd 0x10(%rcx), %xmm2 + // 15: f2 0f 58 52 10 addsd 0x10(%rdx), %xmm2 + // 1a: ff 15 00 00 00 00 callq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__PyFloat_FromDouble_ConsumeInputs + // 20: 48 85 c0 testq %rax, %rax + // 23: 74 12 je 0x37 <_JIT_ENTRY+0x37> + // 25: 49 83 c5 f8 addq $-0x8, %r13 + // 29: 48 89 06 movq %rax, (%rsi) + // 2c: 48 83 c4 28 addq $0x28, %rsp + // 30: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 37: 49 89 f5 movq %rsi, %r13 + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[69] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x49, 0x8d, 0x75, 0xf0, + 0xf2, 0x0f, 0x10, 0x51, 0x10, 0xf2, 0x0f, 0x58, + 0x52, 0x10, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x12, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x89, 0x06, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xf5, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); +} + +void +emit__BINARY_OP_ADD_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 48 89 f9 movq %rdi, %rcx + // f: 48 89 da movq %rbx, %rdx + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__PyLong_Add + // 18: 48 89 c6 movq %rax, %rsi + // 1b: 8b 03 movl (%rbx), %eax + // 1d: 85 c0 testl %eax, %eax + // 1f: 78 33 js 0x54 <_JIT_ENTRY+0x54> + // 21: ff c8 decl %eax + // 23: 89 03 movl %eax, (%rbx) + // 25: 75 2d jne 0x54 <_JIT_ENTRY+0x54> + // 27: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 2e: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 35: 48 85 c0 testq %rax, %rax + // 38: 74 11 je 0x4b <_JIT_ENTRY+0x4b> + // 3a: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 41: 48 89 d9 movq %rbx, %rcx + // 44: ba 01 00 00 00 movl $0x1, %edx + // 49: ff d0 callq *%rax + // 4b: 48 89 d9 movq %rbx, %rcx + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 54: 8b 07 movl (%rdi), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 06 js 0x60 <_JIT_ENTRY+0x60> + // 5a: ff c8 decl %eax + // 5c: 89 07 movl %eax, (%rdi) + // 5e: 74 1b je 0x7b <_JIT_ENTRY+0x7b> + // 60: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 64: 48 85 f6 testq %rsi, %rsi + // 67: 74 48 je 0xb1 <_JIT_ENTRY+0xb1> + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 89 30 movq %rsi, (%rax) + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 82: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 89: 48 85 c0 testq %rax, %rax + // 8c: 74 11 je 0x9f <_JIT_ENTRY+0x9f> + // 8e: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 95: 48 89 f9 movq %rdi, %rcx + // 98: ba 01 00 00 00 movl $0x1, %edx + // 9d: ff d0 callq *%rax + // 9f: 48 89 f9 movq %rdi, %rcx + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // a8: 49 8d 45 f0 leaq -0x10(%r13), %rax + // ac: 48 85 f6 testq %rsi, %rsi + // af: 75 b8 jne 0x69 <_JIT_ENTRY+0x69> + // b1: 49 89 c5 movq %rax, %r13 + // b4: 48 83 c4 28 addq $0x28, %rsp + // b8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[191] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x89, 0xf9, 0x48, + 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, + 0x00, 0x48, 0x89, 0xd9, 0xba, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x1b, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x74, + 0x48, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, 0x30, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, + 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, 0xf9, + 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, + 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x75, + 0xb8, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Add+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Add); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_ADD_UNICODE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 48 89 f9 movq %rdi, %rcx + // f: 48 89 da movq %rbx, %rdx + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Concat + // 18: 48 89 c6 movq %rax, %rsi + // 1b: 8b 03 movl (%rbx), %eax + // 1d: 85 c0 testl %eax, %eax + // 1f: 78 33 js 0x54 <_JIT_ENTRY+0x54> + // 21: ff c8 decl %eax + // 23: 89 03 movl %eax, (%rbx) + // 25: 75 2d jne 0x54 <_JIT_ENTRY+0x54> + // 27: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 2e: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 35: 48 85 c0 testq %rax, %rax + // 38: 74 11 je 0x4b <_JIT_ENTRY+0x4b> + // 3a: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 41: 48 89 d9 movq %rbx, %rcx + // 44: ba 01 00 00 00 movl $0x1, %edx + // 49: ff d0 callq *%rax + // 4b: 48 89 d9 movq %rbx, %rcx + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_ExactDealloc + // 54: 8b 07 movl (%rdi), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 06 js 0x60 <_JIT_ENTRY+0x60> + // 5a: ff c8 decl %eax + // 5c: 89 07 movl %eax, (%rdi) + // 5e: 74 1b je 0x7b <_JIT_ENTRY+0x7b> + // 60: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 64: 48 85 f6 testq %rsi, %rsi + // 67: 74 48 je 0xb1 <_JIT_ENTRY+0xb1> + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 89 30 movq %rsi, (%rax) + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 82: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 89: 48 85 c0 testq %rax, %rax + // 8c: 74 11 je 0x9f <_JIT_ENTRY+0x9f> + // 8e: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 95: 48 89 f9 movq %rdi, %rcx + // 98: ba 01 00 00 00 movl $0x1, %edx + // 9d: ff d0 callq *%rax + // 9f: 48 89 f9 movq %rdi, %rcx + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_ExactDealloc + // a8: 49 8d 45 f0 leaq -0x10(%r13), %rax + // ac: 48 85 f6 testq %rsi, %rsi + // af: 75 b8 jne 0x69 <_JIT_ENTRY+0x69> + // b1: 49 89 c5 movq %rax, %r13 + // b4: 48 83 c4 28 addq $0x28, %rsp + // b8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[191] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x89, 0xf9, 0x48, + 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, + 0x00, 0x48, 0x89, 0xd9, 0xba, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x1b, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x74, + 0x48, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, 0x30, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, + 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, 0xf9, + 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, + 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x75, + 0xb8, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Concat+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Concat); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_EXTEND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 18: 48 89 d9 movq %rbx, %rcx + // 1b: 48 89 f2 movq %rsi, %rdx + // 1e: ff 50 10 callq *0x10(%rax) + // 21: 48 89 c7 movq %rax, %rdi + // 24: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 29: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 32: 8b 03 movl (%rbx), %eax + // 34: 85 c0 testl %eax, %eax + // 36: 78 0f js 0x47 <_JIT_ENTRY+0x47> + // 38: ff c8 decl %eax + // 3a: 89 03 movl %eax, (%rbx) + // 3c: 75 09 jne 0x47 <_JIT_ENTRY+0x47> + // 3e: 48 89 d9 movq %rbx, %rcx + // 41: ff 15 00 00 00 00 callq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 47: 8b 06 movl (%rsi), %eax + // 49: 85 c0 testl %eax, %eax + // 4b: 78 06 js 0x53 <_JIT_ENTRY+0x53> + // 4d: ff c8 decl %eax + // 4f: 89 06 movl %eax, (%rsi) + // 51: 74 13 je 0x66 <_JIT_ENTRY+0x66> + // 53: 49 89 7d f0 movq %rdi, -0x10(%r13) + // 57: 49 83 c5 f8 addq $-0x8, %r13 + // 5b: 48 83 c4 28 addq $0x28, %rsp + // 5f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x66 <_JIT_ENTRY+0x66> + // 0000000000000062: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 66: 48 89 f1 movq %rsi, %rcx + // 69: ff 15 00 00 00 00 callq *(%rip) # 0x6f <_JIT_ENTRY+0x6f> + // 000000000000006b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6f: 49 89 7d f0 movq %rdi, -0x10(%r13) + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 48 83 c4 28 addq $0x28, %rsp + // 7b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[123] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xd9, 0x48, 0x89, 0xf2, 0xff, 0x50, + 0x10, 0x48, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x06, 0x74, 0x13, 0x49, 0x89, 0x7d, 0xf0, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x7d, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x62, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)data + 0x4); +} + +void +emit__BINARY_OP_INPLACE_ADD_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_INPLACE_ADD_UNICODE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 48 63 1d 00 00 00 00 movslq (%rip), %rbx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // f: 49 39 7c dc 50 cmpq %rdi, 0x50(%r12,%rbx,8) + // 14: 74 0b je 0x21 <_JIT_ENTRY+0x21> + // 16: 48 83 c4 28 addq $0x28, %rsp + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 21: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 25: 8b 07 movl (%rdi), %eax + // 27: 85 c0 testl %eax, %eax + // 29: 78 33 js 0x5e <_JIT_ENTRY+0x5e> + // 2b: ff c8 decl %eax + // 2d: 89 07 movl %eax, (%rdi) + // 2f: 75 2d jne 0x5e <_JIT_ENTRY+0x5e> + // 31: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 38: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 3f: 48 85 c0 testq %rax, %rax + // 42: 74 11 je 0x55 <_JIT_ENTRY+0x55> + // 44: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 4b: 48 89 f9 movq %rdi, %rcx + // 4e: ba 01 00 00 00 movl $0x1, %edx + // 53: ff d0 callq *%rax + // 55: 48 89 f9 movq %rdi, %rcx + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_ExactDealloc + // 5e: 49 8b 44 dc 50 movq 0x50(%r12,%rbx,8), %rax + // 63: 48 89 44 24 20 movq %rax, 0x20(%rsp) + // 68: 48 8d 4c 24 20 leaq 0x20(%rsp), %rcx + // 6d: 48 89 f2 movq %rsi, %rdx + // 70: ff 15 00 00 00 00 callq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Append + // 76: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // 7b: 49 89 44 dc 50 movq %rax, 0x50(%r12,%rbx,8) + // 80: 8b 0e movl (%rsi), %ecx + // 82: 85 c9 testl %ecx, %ecx + // 84: 78 38 js 0xbe <_JIT_ENTRY+0xbe> + // 86: ff c9 decl %ecx + // 88: 89 0e movl %ecx, (%rsi) + // 8a: 75 2d jne 0xb9 <_JIT_ENTRY+0xb9> + // 8c: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 93: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 9a: 48 85 c0 testq %rax, %rax + // 9d: 74 11 je 0xb0 <_JIT_ENTRY+0xb0> + // 9f: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // a6: 48 89 f1 movq %rsi, %rcx + // a9: ba 01 00 00 00 movl $0x1, %edx + // ae: ff d0 callq *%rax + // b0: 48 89 f1 movq %rsi, %rcx + // b3: ff 15 00 00 00 00 callq *(%rip) # 0xb9 <_JIT_ENTRY+0xb9> + // 00000000000000b5: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_ExactDealloc + // b9: 49 8b 44 dc 50 movq 0x50(%r12,%rbx,8), %rax + // be: 49 83 c5 f0 addq $-0x10, %r13 + // c2: 48 83 c4 28 addq $0x28, %rsp + // c6: 48 85 c0 testq %rax, %rax + // c9: 74 07 je 0xd2 <_JIT_ENTRY+0xd2> + // cb: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd2 <_JIT_ENTRY+0xd2> + // 00000000000000ce: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // d2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd9 <_JIT_ENTRY+0xd9> + // 00000000000000d5: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[217] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x48, 0x63, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x39, 0x7c, 0xdc, 0x50, 0x74, 0x0b, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x33, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x2d, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, + 0x25, 0x00, 0x00, 0x48, 0x89, 0xf9, 0xba, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, 0x89, 0xf9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x44, 0xdc, 0x50, 0x48, 0x89, 0x44, 0x24, 0x20, + 0x48, 0x8d, 0x4c, 0x24, 0x20, 0x48, 0x89, 0xf2, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x44, 0x24, 0x20, 0x49, 0x89, 0x44, 0xdc, 0x50, + 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x38, 0xff, 0xc9, + 0x89, 0x0e, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, + 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, + 0xf1, 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x44, 0xdc, 0x50, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, 0x85, + 0xc0, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + // 8: JUMP_TARGET + // 10: &_PyRuntime+0x0 + // 18: &_PyUnicode_ExactDealloc+0x0 + // 20: &PyUnicode_Append+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&PyUnicode_Append); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb5, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xce, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_MULTIPLY_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 49 8d 75 f0 leaq -0x10(%r13), %rsi + // 10: f2 0f 10 51 10 movsd 0x10(%rcx), %xmm2 + // 15: f2 0f 59 52 10 mulsd 0x10(%rdx), %xmm2 + // 1a: ff 15 00 00 00 00 callq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__PyFloat_FromDouble_ConsumeInputs + // 20: 48 85 c0 testq %rax, %rax + // 23: 74 12 je 0x37 <_JIT_ENTRY+0x37> + // 25: 49 83 c5 f8 addq $-0x8, %r13 + // 29: 48 89 06 movq %rax, (%rsi) + // 2c: 48 83 c4 28 addq $0x28, %rsp + // 30: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 37: 49 89 f5 movq %rsi, %r13 + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[69] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x49, 0x8d, 0x75, 0xf0, + 0xf2, 0x0f, 0x10, 0x51, 0x10, 0xf2, 0x0f, 0x59, + 0x52, 0x10, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x12, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x89, 0x06, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xf5, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); +} + +void +emit__BINARY_OP_MULTIPLY_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_MULTIPLY_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 48 89 f9 movq %rdi, %rcx + // f: 48 89 da movq %rbx, %rdx + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__PyLong_Multiply + // 18: 48 89 c6 movq %rax, %rsi + // 1b: 8b 03 movl (%rbx), %eax + // 1d: 85 c0 testl %eax, %eax + // 1f: 78 33 js 0x54 <_JIT_ENTRY+0x54> + // 21: ff c8 decl %eax + // 23: 89 03 movl %eax, (%rbx) + // 25: 75 2d jne 0x54 <_JIT_ENTRY+0x54> + // 27: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 2e: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 35: 48 85 c0 testq %rax, %rax + // 38: 74 11 je 0x4b <_JIT_ENTRY+0x4b> + // 3a: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 41: 48 89 d9 movq %rbx, %rcx + // 44: ba 01 00 00 00 movl $0x1, %edx + // 49: ff d0 callq *%rax + // 4b: 48 89 d9 movq %rbx, %rcx + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 54: 8b 07 movl (%rdi), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 06 js 0x60 <_JIT_ENTRY+0x60> + // 5a: ff c8 decl %eax + // 5c: 89 07 movl %eax, (%rdi) + // 5e: 74 1b je 0x7b <_JIT_ENTRY+0x7b> + // 60: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 64: 48 85 f6 testq %rsi, %rsi + // 67: 74 48 je 0xb1 <_JIT_ENTRY+0xb1> + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 89 30 movq %rsi, (%rax) + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 82: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 89: 48 85 c0 testq %rax, %rax + // 8c: 74 11 je 0x9f <_JIT_ENTRY+0x9f> + // 8e: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 95: 48 89 f9 movq %rdi, %rcx + // 98: ba 01 00 00 00 movl $0x1, %edx + // 9d: ff d0 callq *%rax + // 9f: 48 89 f9 movq %rdi, %rcx + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // a8: 49 8d 45 f0 leaq -0x10(%r13), %rax + // ac: 48 85 f6 testq %rsi, %rsi + // af: 75 b8 jne 0x69 <_JIT_ENTRY+0x69> + // b1: 49 89 c5 movq %rax, %r13 + // b4: 48 83 c4 28 addq $0x28, %rsp + // b8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[191] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x89, 0xf9, 0x48, + 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, + 0x00, 0x48, 0x89, 0xd9, 0xba, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x1b, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x74, + 0x48, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, 0x30, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, + 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, 0xf9, + 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, + 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x75, + 0xb8, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Multiply+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Multiply); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_OP_SUBSCR_CHECK_FUNC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_CHECK_FUNC.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: f6 81 a9 00 00 00 02 testb $0x2, 0xa9(%rcx) + // f: 74 5a je 0x6b <_JIT_ENTRY+0x6b> + // 11: 48 8b 81 90 03 00 00 movq 0x390(%rcx), %rax + // 18: 48 85 c0 testq %rax, %rax + // 1b: 74 4e je 0x6b <_JIT_ENTRY+0x6b> + // 1d: 8b 90 90 00 00 00 movl 0x90(%rax), %edx + // 23: 3b 91 98 03 00 00 cmpl 0x398(%rcx), %edx + // 29: 75 40 jne 0x6b <_JIT_ENTRY+0x6b> + // 2b: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 32: 48 85 c9 testq %rcx, %rcx + // 35: 74 34 je 0x6b <_JIT_ENTRY+0x6b> + // 37: 48 8b 50 30 movq 0x30(%rax), %rdx + // 3b: 48 63 52 4c movslq 0x4c(%rdx), %rdx + // 3f: 49 8b b6 f0 00 00 00 movq 0xf0(%r14), %rsi + // 46: 48 29 ce subq %rcx, %rsi + // 49: 48 c1 fe 03 sarq $0x3, %rsi + // 4d: 48 39 d6 cmpq %rdx, %rsi + // 50: 7e 19 jle 0x6b <_JIT_ENTRY+0x6b> + // 52: 8b 08 movl (%rax), %ecx + // 54: 85 c9 testl %ecx, %ecx + // 56: 78 04 js 0x5c <_JIT_ENTRY+0x5c> + // 58: ff c1 incl %ecx + // 5a: 89 08 movl %ecx, (%rax) + // 5c: 49 89 45 00 movq %rax, (%r13) + // 60: 49 83 c5 08 addq $0x8, %r13 + // 64: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 6b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[114] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x48, 0x08, + 0xf6, 0x81, 0xa9, 0x00, 0x00, 0x00, 0x02, 0x74, + 0x5a, 0x48, 0x8b, 0x81, 0x90, 0x03, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x4e, 0x8b, 0x90, 0x90, + 0x00, 0x00, 0x00, 0x3b, 0x91, 0x98, 0x03, 0x00, + 0x00, 0x75, 0x40, 0x49, 0x8b, 0x8e, 0xe8, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x34, 0x48, + 0x8b, 0x50, 0x30, 0x48, 0x63, 0x52, 0x4c, 0x49, + 0x8b, 0xb6, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x29, + 0xce, 0x48, 0xc1, 0xfe, 0x03, 0x48, 0x39, 0xd6, + 0x7e, 0x19, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, + 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0x4); +} + +void +emit__BINARY_OP_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 48 8b 43 08 movq 0x8(%rbx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 13: 74 0b je 0x20 <_JIT_ENTRY+0x20> + // 15: 48 83 c4 28 addq $0x28, %rsp + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 20: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // 2e: 48 89 d9 movq %rbx, %rcx + // 31: 48 89 f2 movq %rsi, %rdx + // 34: ff 15 00 00 00 00 callq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp_PyDict_GetItemRef + // 3a: 89 c7 movl %eax, %edi + // 3c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 41: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4a: 85 c0 testl %eax, %eax + // 4c: 75 1c jne 0x6a <_JIT_ENTRY+0x6a> + // 4e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 53: 48 89 f1 movq %rsi, %rcx + // 56: ff 15 00 00 00 00 callq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: IMAGE_REL_AMD64_REL32 __imp__PyErr_SetKeyError + // 5c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 61: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6a: 8b 03 movl (%rbx), %eax + // 6c: 85 c0 testl %eax, %eax + // 6e: 78 0f js 0x7f <_JIT_ENTRY+0x7f> + // 70: ff c8 decl %eax + // 72: 89 03 movl %eax, (%rbx) + // 74: 75 09 jne 0x7f <_JIT_ENTRY+0x7f> + // 76: 48 89 d9 movq %rbx, %rcx + // 79: ff 15 00 00 00 00 callq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7f: 8b 06 movl (%rsi), %eax + // 81: 85 c0 testl %eax, %eax + // 83: 78 06 js 0x8b <_JIT_ENTRY+0x8b> + // 85: ff c8 decl %eax + // 87: 89 06 movl %eax, (%rsi) + // 89: 74 1c je 0xa7 <_JIT_ENTRY+0xa7> + // 8b: 85 ff testl %edi, %edi + // 8d: 7e 25 jle 0xb4 <_JIT_ENTRY+0xb4> + // 8f: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // 94: 49 89 45 f0 movq %rax, -0x10(%r13) + // 98: 49 83 c5 f8 addq $-0x8, %r13 + // 9c: 48 83 c4 28 addq $0x28, %rsp + // a0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // a7: 48 89 f1 movq %rsi, %rcx + // aa: ff 15 00 00 00 00 callq *(%rip) # 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000ac: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b0: 85 ff testl %edi, %edi + // b2: 7f db jg 0x8f <_JIT_ENTRY+0x8f> + // b4: 49 83 c5 f0 addq $-0x10, %r13 + // b8: 48 83 c4 28 addq $0x28, %rsp + // bc: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[195] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x8d, 0x44, 0x24, 0x20, 0x48, 0x89, + 0xd9, 0x48, 0x89, 0xf2, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x75, 0x1c, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x06, 0x74, 0x1c, 0x85, 0xff, 0x7e, 0x25, 0x48, + 0x8b, 0x44, 0x24, 0x20, 0x49, 0x89, 0x45, 0xf0, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xff, 0x7f, 0xdb, 0x49, 0x83, 0xc5, 0xf0, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: JUMP_TARGET + // 10: &PyDict_GetItemRef+0x0 + // 18: &_PyErr_SetKeyError+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyDict_GetItemRef); + patch_64(data + 0x18, (uintptr_t)&_PyErr_SetKeyError); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xac, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_SUBSCR_INIT_CALL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_INIT_CALL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 4: 41 0f 10 45 e8 movups -0x18(%r13), %xmm0 + // 9: 48 8b 4a 30 movq 0x30(%rdx), %rcx + // d: 49 8b 86 e8 00 00 00 movq 0xe8(%r14), %rax + // 14: 48 63 71 4c movslq 0x4c(%rcx), %rsi + // 18: 48 8d 34 f0 leaq (%rax,%rsi,8), %rsi + // 1c: 49 89 b6 e8 00 00 00 movq %rsi, 0xe8(%r14) + // 23: 4c 89 60 08 movq %r12, 0x8(%rax) + // 27: 48 89 50 10 movq %rdx, 0x10(%rax) + // 2b: 8b 31 movl (%rcx), %esi + // 2d: 85 f6 testl %esi, %esi + // 2f: 78 04 js 0x35 <_JIT_ENTRY+0x35> + // 31: ff c6 incl %esi + // 33: 89 31 movl %esi, (%rcx) + // 35: 48 89 08 movq %rcx, (%rax) + // 38: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 3c: 48 89 70 20 movq %rsi, 0x20(%rax) + // 40: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 44: 48 89 50 18 movq %rdx, 0x18(%rax) + // 48: 48 c7 40 28 00 00 00 00 movq $0x0, 0x28(%rax) + // 50: 48 63 51 48 movslq 0x48(%rcx), %rdx + // 54: 48 8d 54 d0 50 leaq 0x50(%rax,%rdx,8), %rdx + // 59: 48 89 50 40 movq %rdx, 0x40(%rax) + // 5d: 48 c7 40 30 00 00 00 00 movq $0x0, 0x30(%rax) + // 65: 48 8d 91 d0 00 00 00 leaq 0xd0(%rcx), %rdx + // 6c: 48 89 50 38 movq %rdx, 0x38(%rax) + // 70: c7 40 48 00 00 00 00 movl $0x0, 0x48(%rax) + // 77: 83 79 48 03 cmpl $0x3, 0x48(%rcx) + // 7b: 7c 2f jl 0xac <_JIT_ENTRY+0xac> + // 7d: ba 0c 00 00 00 movl $0xc, %edx + // 82: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 90: 48 c7 04 d0 00 00 00 00 movq $0x0, (%rax,%rdx,8) + // 98: 48 63 71 48 movslq 0x48(%rcx), %rsi + // 9c: 48 8d 7a 01 leaq 0x1(%rdx), %rdi + // a0: 48 83 c2 f7 addq $-0x9, %rdx + // a4: 48 39 f2 cmpq %rsi, %rdx + // a7: 48 89 fa movq %rdi, %rdx + // aa: 7c e4 jl 0x90 <_JIT_ENTRY+0x90> + // ac: 0f 11 40 50 movups %xmm0, 0x50(%rax) + // b0: 66 41 c7 44 24 48 06 00 movw $0x6, 0x48(%r12) + // b8: 49 89 45 e8 movq %rax, -0x18(%r13) + // bc: 49 83 c5 f0 addq $-0x10, %r13 + // c0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc7 <_JIT_ENTRY+0xc7> + // 00000000000000c3: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[192] = { + 0x49, 0x8b, 0x55, 0xf8, 0x41, 0x0f, 0x10, 0x45, + 0xe8, 0x48, 0x8b, 0x4a, 0x30, 0x49, 0x8b, 0x86, + 0xe8, 0x00, 0x00, 0x00, 0x48, 0x63, 0x71, 0x4c, + 0x48, 0x8d, 0x34, 0xf0, 0x49, 0x89, 0xb6, 0xe8, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x60, 0x08, 0x48, + 0x89, 0x50, 0x10, 0x8b, 0x31, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x31, 0x48, 0x89, 0x08, + 0x48, 0x8b, 0x72, 0x18, 0x48, 0x89, 0x70, 0x20, + 0x48, 0x8b, 0x52, 0x10, 0x48, 0x89, 0x50, 0x18, + 0x48, 0xc7, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x51, 0x48, 0x48, 0x8d, 0x54, 0xd0, + 0x50, 0x48, 0x89, 0x50, 0x40, 0x48, 0xc7, 0x40, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x91, + 0xd0, 0x00, 0x00, 0x00, 0x48, 0x89, 0x50, 0x38, + 0xc7, 0x40, 0x48, 0x00, 0x00, 0x00, 0x00, 0x83, + 0x79, 0x48, 0x03, 0x7c, 0x2f, 0xba, 0x0c, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xc7, 0x04, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x71, 0x48, 0x48, 0x8d, 0x7a, 0x01, + 0x48, 0x83, 0xc2, 0xf7, 0x48, 0x39, 0xf2, 0x48, + 0x89, 0xfa, 0x7c, 0xe4, 0x0f, 0x11, 0x40, 0x50, + 0x66, 0x41, 0xc7, 0x44, 0x24, 0x48, 0x06, 0x00, + 0x49, 0x89, 0x45, 0xe8, 0x49, 0x83, 0xc5, 0xf0, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__BINARY_OP_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_LIST_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 48 8b 47 08 movq 0x8(%rdi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // 13: 0f 85 be 00 00 00 jne 0xd7 <_JIT_ENTRY+0xd7> + // 19: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 1d: 48 8b 46 08 movq 0x8(%rsi), %rax + // 21: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp_PyList_Type + // 28: 0f 85 a9 00 00 00 jne 0xd7 <_JIT_ENTRY+0xd7> + // 2e: 48 8b 47 10 movq 0x10(%rdi), %rax + // 32: 48 83 e0 fb andq $-0x5, %rax + // 36: 48 83 f8 09 cmpq $0x9, %rax + // 3a: 0f 83 97 00 00 00 jae 0xd7 <_JIT_ENTRY+0xd7> + // 40: 8b 47 18 movl 0x18(%rdi), %eax + // 43: 48 39 46 10 cmpq %rax, 0x10(%rsi) + // 47: 0f 8e 8a 00 00 00 jle 0xd7 <_JIT_ENTRY+0xd7> + // 4d: 48 8b 4e 18 movq 0x18(%rsi), %rcx + // 51: 48 8b 1c c1 movq (%rcx,%rax,8), %rbx + // 55: 8b 03 movl (%rbx), %eax + // 57: 85 c0 testl %eax, %eax + // 59: 78 04 js 0x5f <_JIT_ENTRY+0x5f> + // 5b: ff c0 incl %eax + // 5d: 89 03 movl %eax, (%rbx) + // 5f: 49 83 c5 f0 addq $-0x10, %r13 + // 63: 8b 07 movl (%rdi), %eax + // 65: 85 c0 testl %eax, %eax + // 67: 78 33 js 0x9c <_JIT_ENTRY+0x9c> + // 69: ff c8 decl %eax + // 6b: 89 07 movl %eax, (%rdi) + // 6d: 75 2d jne 0x9c <_JIT_ENTRY+0x9c> + // 6f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 76: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 7d: 48 85 c0 testq %rax, %rax + // 80: 74 11 je 0x93 <_JIT_ENTRY+0x93> + // 82: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 89: 48 89 f9 movq %rdi, %rcx + // 8c: ba 01 00 00 00 movl $0x1, %edx + // 91: ff d0 callq *%rax + // 93: 48 89 f9 movq %rdi, %rcx + // 96: ff 15 00 00 00 00 callq *(%rip) # 0x9c <_JIT_ENTRY+0x9c> + // 0000000000000098: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 9c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a1: 8b 06 movl (%rsi), %eax + // a3: 85 c0 testl %eax, %eax + // a5: 78 0f js 0xb6 <_JIT_ENTRY+0xb6> + // a7: ff c8 decl %eax + // a9: 89 06 movl %eax, (%rsi) + // ab: 75 09 jne 0xb6 <_JIT_ENTRY+0xb6> + // ad: 48 89 f1 movq %rsi, %rcx + // b0: ff 15 00 00 00 00 callq *(%rip) # 0xb6 <_JIT_ENTRY+0xb6> + // 00000000000000b2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // bb: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c4: 49 89 5d 00 movq %rbx, (%r13) + // c8: 49 83 c5 08 addq $0x8, %r13 + // cc: 48 83 c4 28 addq $0x28, %rsp + // d0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd7 <_JIT_ENTRY+0xd7> + // 00000000000000d3: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // d7: 48 83 c4 28 addq $0x28, %rsp + // db: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe2 <_JIT_ENTRY+0xe2> + // 00000000000000de: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[226] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf8, + 0x48, 0x8b, 0x47, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x85, 0xbe, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf0, 0x48, 0x8b, 0x46, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xa9, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x47, 0x10, 0x48, 0x83, 0xe0, 0xfb, 0x48, 0x83, + 0xf8, 0x09, 0x0f, 0x83, 0x97, 0x00, 0x00, 0x00, + 0x8b, 0x47, 0x18, 0x48, 0x39, 0x46, 0x10, 0x0f, + 0x8e, 0x8a, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x4e, + 0x18, 0x48, 0x8b, 0x1c, 0xc1, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x03, 0x49, + 0x83, 0xc5, 0xf0, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, + 0x00, 0x48, 0x89, 0xf9, 0xba, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xf9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x06, 0x75, 0x09, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x5d, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyList_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x98, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_SUBSCR_STR_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_STR_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 48 8b 47 08 movq 0x8(%rdi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // 13: 0f 85 c0 00 00 00 jne 0xd9 <_JIT_ENTRY+0xd9> + // 19: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 1d: 48 8b 46 08 movq 0x8(%rsi), %rax + // 21: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Type + // 28: 0f 85 ab 00 00 00 jne 0xd9 <_JIT_ENTRY+0xd9> + // 2e: 48 8b 47 10 movq 0x10(%rdi), %rax + // 32: 48 83 e0 fb andq $-0x5, %rax + // 36: 48 83 f8 09 cmpq $0x9, %rax + // 3a: 0f 83 99 00 00 00 jae 0xd9 <_JIT_ENTRY+0xd9> + // 40: 8b 47 18 movl 0x18(%rdi), %eax + // 43: 48 39 46 10 cmpq %rax, 0x10(%rsi) + // 47: 0f 8e 8c 00 00 00 jle 0xd9 <_JIT_ENTRY+0xd9> + // 4d: 0f b7 4e 22 movzwl 0x22(%rsi), %ecx + // 51: 89 ca movl %ecx, %edx + // 53: 83 e2 07 andl $0x7, %edx + // 56: 83 fa 02 cmpl $0x2, %edx + // 59: 74 14 je 0x6f <_JIT_ENTRY+0x6f> + // 5b: 83 fa 01 cmpl $0x1, %edx + // 5e: 75 1e jne 0x7e <_JIT_ENTRY+0x7e> + // 60: f6 c1 08 testb $0x8, %cl + // 63: 75 24 jne 0x89 <_JIT_ENTRY+0x89> + // 65: 48 8b 4e 38 movq 0x38(%rsi), %rcx + // 69: 0f b6 1c 01 movzbl (%rcx,%rax), %ebx + // 6d: eb 62 jmp 0xd1 <_JIT_ENTRY+0xd1> + // 6f: f6 c1 08 testb $0x8, %cl + // 72: 75 2e jne 0xa2 <_JIT_ENTRY+0xa2> + // 74: 48 8b 4e 38 movq 0x38(%rsi), %rcx + // 78: 0f b7 1c 41 movzwl (%rcx,%rax,2), %ebx + // 7c: eb 53 jmp 0xd1 <_JIT_ENTRY+0xd1> + // 7e: f6 c1 08 testb $0x8, %cl + // 81: 75 38 jne 0xbb <_JIT_ENTRY+0xbb> + // 83: 48 8b 4e 38 movq 0x38(%rsi), %rcx + // 87: eb 45 jmp 0xce <_JIT_ENTRY+0xce> + // 89: 31 d2 xorl %edx, %edx + // 8b: f6 c1 10 testb $0x10, %cl + // 8e: 0f 94 c2 sete %dl + // 91: c1 e2 04 shll $0x4, %edx + // 94: 48 8d 0c 16 leaq (%rsi,%rdx), %rcx + // 98: 48 83 c1 28 addq $0x28, %rcx + // 9c: 0f b6 1c 01 movzbl (%rcx,%rax), %ebx + // a0: eb 2f jmp 0xd1 <_JIT_ENTRY+0xd1> + // a2: 31 d2 xorl %edx, %edx + // a4: f6 c1 10 testb $0x10, %cl + // a7: 0f 94 c2 sete %dl + // aa: c1 e2 04 shll $0x4, %edx + // ad: 48 8d 0c 16 leaq (%rsi,%rdx), %rcx + // b1: 48 83 c1 28 addq $0x28, %rcx + // b5: 0f b7 1c 41 movzwl (%rcx,%rax,2), %ebx + // b9: eb 16 jmp 0xd1 <_JIT_ENTRY+0xd1> + // bb: 31 d2 xorl %edx, %edx + // bd: f6 c1 10 testb $0x10, %cl + // c0: 0f 94 c2 sete %dl + // c3: c1 e2 04 shll $0x4, %edx + // c6: 48 8d 0c 16 leaq (%rsi,%rdx), %rcx + // ca: 48 83 c1 28 addq $0x28, %rcx + // ce: 8b 1c 81 movl (%rcx,%rax,4), %ebx + // d1: 81 fb 80 00 00 00 cmpl $0x80, %ebx + // d7: 72 0b jb 0xe4 <_JIT_ENTRY+0xe4> + // d9: 48 83 c4 28 addq $0x28, %rsp + // dd: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe4 <_JIT_ENTRY+0xe4> + // 00000000000000e0: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // e4: 49 83 c5 f0 addq $-0x10, %r13 + // e8: 8b 07 movl (%rdi), %eax + // ea: 85 c0 testl %eax, %eax + // ec: 78 33 js 0x121 <_JIT_ENTRY+0x121> + // ee: ff c8 decl %eax + // f0: 89 07 movl %eax, (%rdi) + // f2: 75 2d jne 0x121 <_JIT_ENTRY+0x121> + // f4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xfb <_JIT_ENTRY+0xfb> + // 00000000000000f7: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // fb: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 102: 48 85 c0 testq %rax, %rax + // 105: 74 11 je 0x118 <_JIT_ENTRY+0x118> + // 107: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 10e: 48 89 f9 movq %rdi, %rcx + // 111: ba 01 00 00 00 movl $0x1, %edx + // 116: ff d0 callq *%rax + // 118: 48 89 f9 movq %rdi, %rcx + // 11b: ff 15 00 00 00 00 callq *(%rip) # 0x121 <_JIT_ENTRY+0x121> + // 000000000000011d: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 121: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 126: 8b 06 movl (%rsi), %eax + // 128: 85 c0 testl %eax, %eax + // 12a: 78 0f js 0x13b <_JIT_ENTRY+0x13b> + // 12c: ff c8 decl %eax + // 12e: 89 06 movl %eax, (%rsi) + // 130: 75 09 jne 0x13b <_JIT_ENTRY+0x13b> + // 132: 48 89 f1 movq %rsi, %rcx + // 135: ff 15 00 00 00 00 callq *(%rip) # 0x13b <_JIT_ENTRY+0x13b> + // 0000000000000137: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 13b: 89 d8 movl %ebx, %eax + // 13d: 48 8d 04 40 leaq (%rax,%rax,2), %rax + // 141: 48 c1 e0 04 shlq $0x4, %rax + // 145: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x14c <_JIT_ENTRY+0x14c> + // 0000000000000148: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 14c: 48 01 c8 addq %rcx, %rax + // 14f: 48 05 50 20 01 00 addq $0x12050, %rax # imm = 0x12050 + // 155: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 15a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 163: 49 89 45 00 movq %rax, (%r13) + // 167: 49 83 c5 08 addq $0x8, %r13 + // 16b: 48 83 c4 28 addq $0x28, %rsp + // 16f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x176 <_JIT_ENTRY+0x176> + // 0000000000000172: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[367] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf8, + 0x48, 0x8b, 0x47, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x85, 0xc0, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf0, 0x48, 0x8b, 0x46, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xab, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x47, 0x10, 0x48, 0x83, 0xe0, 0xfb, 0x48, 0x83, + 0xf8, 0x09, 0x0f, 0x83, 0x99, 0x00, 0x00, 0x00, + 0x8b, 0x47, 0x18, 0x48, 0x39, 0x46, 0x10, 0x0f, + 0x8e, 0x8c, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0x4e, + 0x22, 0x89, 0xca, 0x83, 0xe2, 0x07, 0x83, 0xfa, + 0x02, 0x74, 0x14, 0x83, 0xfa, 0x01, 0x75, 0x1e, + 0xf6, 0xc1, 0x08, 0x75, 0x24, 0x48, 0x8b, 0x4e, + 0x38, 0x0f, 0xb6, 0x1c, 0x01, 0xeb, 0x62, 0xf6, + 0xc1, 0x08, 0x75, 0x2e, 0x48, 0x8b, 0x4e, 0x38, + 0x0f, 0xb7, 0x1c, 0x41, 0xeb, 0x53, 0xf6, 0xc1, + 0x08, 0x75, 0x38, 0x48, 0x8b, 0x4e, 0x38, 0xeb, + 0x45, 0x31, 0xd2, 0xf6, 0xc1, 0x10, 0x0f, 0x94, + 0xc2, 0xc1, 0xe2, 0x04, 0x48, 0x8d, 0x0c, 0x16, + 0x48, 0x83, 0xc1, 0x28, 0x0f, 0xb6, 0x1c, 0x01, + 0xeb, 0x2f, 0x31, 0xd2, 0xf6, 0xc1, 0x10, 0x0f, + 0x94, 0xc2, 0xc1, 0xe2, 0x04, 0x48, 0x8d, 0x0c, + 0x16, 0x48, 0x83, 0xc1, 0x28, 0x0f, 0xb7, 0x1c, + 0x41, 0xeb, 0x16, 0x31, 0xd2, 0xf6, 0xc1, 0x10, + 0x0f, 0x94, 0xc2, 0xc1, 0xe2, 0x04, 0x48, 0x8d, + 0x0c, 0x16, 0x48, 0x83, 0xc1, 0x28, 0x8b, 0x1c, + 0x81, 0x81, 0xfb, 0x80, 0x00, 0x00, 0x00, 0x72, + 0x0b, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x33, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, + 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, + 0xf9, 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, + 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x06, + 0x75, 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xd8, 0x48, 0x8d, 0x04, + 0x40, 0x48, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0xc8, 0x48, + 0x05, 0x50, 0x20, 0x01, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyUnicode_Type+0x0 + // 10: JUMP_TARGET + // 18: &_PyRuntime+0x0 + // 20: &_PyLong_ExactDealloc+0x0 + // 28: &_Py_Dealloc+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_PyRuntime); + patch_64(data + 0x20, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xe0, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x11d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x137, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x148, (uintptr_t)data + 0x14); +} + +void +emit__BINARY_OP_SUBSCR_TUPLE_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBSCR_TUPLE_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 48 8b 47 08 movq 0x8(%rdi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // 13: 0f 85 bb 00 00 00 jne 0xd4 <_JIT_ENTRY+0xd4> + // 19: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 1d: 48 8b 46 08 movq 0x8(%rsi), %rax + // 21: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp_PyTuple_Type + // 28: 0f 85 a6 00 00 00 jne 0xd4 <_JIT_ENTRY+0xd4> + // 2e: 48 8b 47 10 movq 0x10(%rdi), %rax + // 32: 48 83 e0 fb andq $-0x5, %rax + // 36: 48 83 f8 09 cmpq $0x9, %rax + // 3a: 0f 83 94 00 00 00 jae 0xd4 <_JIT_ENTRY+0xd4> + // 40: 8b 47 18 movl 0x18(%rdi), %eax + // 43: 48 39 46 10 cmpq %rax, 0x10(%rsi) + // 47: 0f 8e 87 00 00 00 jle 0xd4 <_JIT_ENTRY+0xd4> + // 4d: 48 8b 5c c6 18 movq 0x18(%rsi,%rax,8), %rbx + // 52: 8b 03 movl (%rbx), %eax + // 54: 85 c0 testl %eax, %eax + // 56: 78 04 js 0x5c <_JIT_ENTRY+0x5c> + // 58: ff c0 incl %eax + // 5a: 89 03 movl %eax, (%rbx) + // 5c: 49 83 c5 f0 addq $-0x10, %r13 + // 60: 8b 07 movl (%rdi), %eax + // 62: 85 c0 testl %eax, %eax + // 64: 78 33 js 0x99 <_JIT_ENTRY+0x99> + // 66: ff c8 decl %eax + // 68: 89 07 movl %eax, (%rdi) + // 6a: 75 2d jne 0x99 <_JIT_ENTRY+0x99> + // 6c: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 73: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 7a: 48 85 c0 testq %rax, %rax + // 7d: 74 11 je 0x90 <_JIT_ENTRY+0x90> + // 7f: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 86: 48 89 f9 movq %rdi, %rcx + // 89: ba 01 00 00 00 movl $0x1, %edx + // 8e: ff d0 callq *%rax + // 90: 48 89 f9 movq %rdi, %rcx + // 93: ff 15 00 00 00 00 callq *(%rip) # 0x99 <_JIT_ENTRY+0x99> + // 0000000000000095: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 99: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9e: 8b 06 movl (%rsi), %eax + // a0: 85 c0 testl %eax, %eax + // a2: 78 0f js 0xb3 <_JIT_ENTRY+0xb3> + // a4: ff c8 decl %eax + // a6: 89 06 movl %eax, (%rsi) + // a8: 75 09 jne 0xb3 <_JIT_ENTRY+0xb3> + // aa: 48 89 f1 movq %rsi, %rcx + // ad: ff 15 00 00 00 00 callq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b3: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b8: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c1: 49 89 5d 00 movq %rbx, (%r13) + // c5: 49 83 c5 08 addq $0x8, %r13 + // c9: 48 83 c4 28 addq $0x28, %rsp + // cd: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // d4: 48 83 c4 28 addq $0x28, %rsp + // d8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[223] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf8, + 0x48, 0x8b, 0x47, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x85, 0xbb, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf0, 0x48, 0x8b, 0x46, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xa6, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x47, 0x10, 0x48, 0x83, 0xe0, 0xfb, 0x48, 0x83, + 0xf8, 0x09, 0x0f, 0x83, 0x94, 0x00, 0x00, 0x00, + 0x8b, 0x47, 0x18, 0x48, 0x39, 0x46, 0x10, 0x0f, + 0x8e, 0x87, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5c, + 0xc6, 0x18, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x04, + 0xff, 0xc0, 0x89, 0x03, 0x49, 0x83, 0xc5, 0xf0, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x33, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, + 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, + 0xf9, 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, + 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x06, + 0x75, 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x5d, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyTuple_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x95, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + 0x2c); +} + +void +emit__BINARY_OP_SUBTRACT_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 49 8d 75 f0 leaq -0x10(%r13), %rsi + // 10: f2 0f 10 51 10 movsd 0x10(%rcx), %xmm2 + // 15: f2 0f 5c 52 10 subsd 0x10(%rdx), %xmm2 + // 1a: ff 15 00 00 00 00 callq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__PyFloat_FromDouble_ConsumeInputs + // 20: 48 85 c0 testq %rax, %rax + // 23: 74 12 je 0x37 <_JIT_ENTRY+0x37> + // 25: 49 83 c5 f8 addq $-0x8, %r13 + // 29: 48 89 06 movq %rax, (%rsi) + // 2c: 48 83 c4 28 addq $0x28, %rsp + // 30: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 37: 49 89 f5 movq %rsi, %r13 + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[69] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x49, 0x8d, 0x75, 0xf0, + 0xf2, 0x0f, 0x10, 0x51, 0x10, 0xf2, 0x0f, 0x5c, + 0x52, 0x10, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x12, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x89, 0x06, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xf5, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyFloat_FromDouble_ConsumeInputs+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyFloat_FromDouble_ConsumeInputs); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0xc); +} + +void +emit__BINARY_OP_SUBTRACT_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_OP_SUBTRACT_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 5d f8 movq -0x8(%r13), %rbx + // c: 48 89 f9 movq %rdi, %rcx + // f: 48 89 da movq %rbx, %rdx + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__PyLong_Subtract + // 18: 48 89 c6 movq %rax, %rsi + // 1b: 8b 03 movl (%rbx), %eax + // 1d: 85 c0 testl %eax, %eax + // 1f: 78 33 js 0x54 <_JIT_ENTRY+0x54> + // 21: ff c8 decl %eax + // 23: 89 03 movl %eax, (%rbx) + // 25: 75 2d jne 0x54 <_JIT_ENTRY+0x54> + // 27: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 2e: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 35: 48 85 c0 testq %rax, %rax + // 38: 74 11 je 0x4b <_JIT_ENTRY+0x4b> + // 3a: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 41: 48 89 d9 movq %rbx, %rcx + // 44: ba 01 00 00 00 movl $0x1, %edx + // 49: ff d0 callq *%rax + // 4b: 48 89 d9 movq %rbx, %rcx + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 54: 8b 07 movl (%rdi), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 06 js 0x60 <_JIT_ENTRY+0x60> + // 5a: ff c8 decl %eax + // 5c: 89 07 movl %eax, (%rdi) + // 5e: 74 1b je 0x7b <_JIT_ENTRY+0x7b> + // 60: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 64: 48 85 f6 testq %rsi, %rsi + // 67: 74 48 je 0xb1 <_JIT_ENTRY+0xb1> + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 89 30 movq %rsi, (%rax) + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 82: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 89: 48 85 c0 testq %rax, %rax + // 8c: 74 11 je 0x9f <_JIT_ENTRY+0x9f> + // 8e: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 95: 48 89 f9 movq %rdi, %rcx + // 98: ba 01 00 00 00 movl $0x1, %edx + // 9d: ff d0 callq *%rax + // 9f: 48 89 f9 movq %rdi, %rcx + // a2: ff 15 00 00 00 00 callq *(%rip) # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // a8: 49 8d 45 f0 leaq -0x10(%r13), %rax + // ac: 48 85 f6 testq %rsi, %rsi + // af: 75 b8 jne 0x69 <_JIT_ENTRY+0x69> + // b1: 49 89 c5 movq %rax, %r13 + // b4: 48 83 c4 28 addq $0x28, %rsp + // b8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[191] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x5d, 0xf8, 0x48, 0x89, 0xf9, 0x48, + 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, + 0x00, 0x48, 0x89, 0xd9, 0xba, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x1b, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x74, + 0x48, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x89, 0x30, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, + 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, 0xf9, + 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, + 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x85, 0xf6, 0x75, + 0xb8, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyLong_Subtract+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyLong_Subtract); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x1c); +} + +void +emit__BINARY_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BINARY_SLICE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 8: 49 8b 75 e8 movq -0x18(%r13), %rsi + // c: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: ff 15 00 00 00 00 callq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__PyBuildSlice_ConsumeRefs + // 1b: 48 89 c3 movq %rax, %rbx + // 1e: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 23: 48 85 db testq %rbx, %rbx + // 26: 74 38 je 0x60 <_JIT_ENTRY+0x60> + // 28: 48 83 c0 f0 addq $-0x10, %rax + // 2c: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 31: 48 89 f1 movq %rsi, %rcx + // 34: 48 89 da movq %rbx, %rdx + // 37: ff 15 00 00 00 00 callq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp_PyObject_GetItem + // 3d: 48 89 c7 movq %rax, %rdi + // 40: 8b 03 movl (%rbx), %eax + // 42: 85 c0 testl %eax, %eax + // 44: 78 0f js 0x55 <_JIT_ENTRY+0x55> + // 46: ff c8 decl %eax + // 48: 89 03 movl %eax, (%rbx) + // 4a: 75 09 jne 0x55 <_JIT_ENTRY+0x55> + // 4c: 48 89 d9 movq %rbx, %rcx + // 4f: ff 15 00 00 00 00 callq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 55: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 5a: 48 83 c0 10 addq $0x10, %rax + // 5e: eb 02 jmp 0x62 <_JIT_ENTRY+0x62> + // 60: 31 ff xorl %edi, %edi + // 62: 48 83 c0 e8 addq $-0x18, %rax + // 66: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 6b: 8b 06 movl (%rsi), %eax + // 6d: 85 c0 testl %eax, %eax + // 6f: 78 06 js 0x77 <_JIT_ENTRY+0x77> + // 71: ff c8 decl %eax + // 73: 89 06 movl %eax, (%rsi) + // 75: 74 26 je 0x9d <_JIT_ENTRY+0x9d> + // 77: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 85: 48 85 ff testq %rdi, %rdi + // 88: 74 2f je 0xb9 <_JIT_ENTRY+0xb9> + // 8a: 49 89 7d 00 movq %rdi, (%r13) + // 8e: 49 83 c5 08 addq $0x8, %r13 + // 92: 48 83 c4 28 addq $0x28, %rsp + // 96: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9d <_JIT_ENTRY+0x9d> + // 0000000000000099: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 9d: 48 89 f1 movq %rsi, %rcx + // a0: ff 15 00 00 00 00 callq *(%rip) # 0xa6 <_JIT_ENTRY+0xa6> + // 00000000000000a2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // a6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ab: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b4: 48 85 ff testq %rdi, %rdi + // b7: 75 d1 jne 0x8a <_JIT_ENTRY+0x8a> + // b9: 48 83 c4 28 addq $0x28, %rsp + // bd: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc4 <_JIT_ENTRY+0xc4> + // 00000000000000c0: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[196] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x55, 0xf8, + 0x49, 0x8b, 0x75, 0xe8, 0x49, 0x8b, 0x4d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xc3, 0x49, 0x8b, + 0x44, 0x24, 0x40, 0x48, 0x85, 0xdb, 0x74, 0x38, + 0x48, 0x83, 0xc0, 0xf0, 0x49, 0x89, 0x44, 0x24, + 0x40, 0x48, 0x89, 0xf1, 0x48, 0x89, 0xda, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc7, + 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, + 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xd9, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x44, + 0x24, 0x40, 0x48, 0x83, 0xc0, 0x10, 0xeb, 0x02, + 0x31, 0xff, 0x48, 0x83, 0xc0, 0xe8, 0x49, 0x89, + 0x44, 0x24, 0x40, 0x8b, 0x06, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x26, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xff, + 0x74, 0x2f, 0x49, 0x89, 0x7d, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xff, 0x75, + 0xd1, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyBuildSlice_ConsumeRefs+0x0 + // 8: &PyObject_GetItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc0, (uintptr_t)data + 0x1c); +} + +void +emit__BUILD_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_LIST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 0f b7 d7 movzwl %di, %edx + // e: 8d 04 d5 00 00 00 00 leal (,%rdx,8), %eax + // 15: 4c 89 ee movq %r13, %rsi + // 18: 48 29 c6 subq %rax, %rsi + // 1b: 48 89 f1 movq %rsi, %rcx + // 1e: ff 15 00 00 00 00 callq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp__PyList_FromStackRefStealOnSuccess + // 24: 48 85 c0 testq %rax, %rax + // 27: 74 1f je 0x48 <_JIT_ENTRY+0x48> + // 29: 0f b7 cf movzwl %di, %ecx + // 2c: 48 89 06 movq %rax, (%rsi) + // 2f: b8 01 00 00 00 movl $0x1, %eax + // 34: 29 c8 subl %ecx, %eax + // 36: 48 98 cltq + // 38: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 3d: 48 83 c4 28 addq $0x28, %rsp + // 41: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 48: 48 83 c4 28 addq $0x28, %rsp + // 4c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[83] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd7, 0x8d, 0x04, + 0xd5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, + 0x48, 0x29, 0xc6, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x1f, 0x0f, 0xb7, 0xcf, 0x48, 0x89, 0x06, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x29, 0xc8, 0x48, 0x98, + 0x4d, 0x8d, 0x6c, 0xc5, 0x00, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyList_FromStackRefStealOnSuccess+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyList_FromStackRefStealOnSuccess); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); +} + +void +emit__BUILD_MAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_MAP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 4c 89 74 24 28 movq %r14, 0x28(%rsp) + // a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 11: 0f b7 d8 movzwl %ax, %ebx + // 14: 01 db addl %ebx, %ebx + // 16: 89 d9 movl %ebx, %ecx + // 18: f7 d9 negl %ecx + // 1a: 4c 63 f9 movslq %ecx, %r15 + // 1d: 4a 8d 34 fd 00 00 00 00 leaq (,%r15,8), %rsi + // 25: 4c 01 ee addq %r13, %rsi + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 0f b7 e8 movzwl %ax, %ebp + // 30: 4f 8d 44 fd 08 leaq 0x8(%r13,%r15,8), %r8 + // 35: 48 89 6c 24 20 movq %rbp, 0x20(%rsp) + // 3a: ba 02 00 00 00 movl $0x2, %edx + // 3f: 41 b9 02 00 00 00 movl $0x2, %r9d + // 45: 48 89 f1 movq %rsi, %rcx + // 48: ff 15 00 00 00 00 callq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp__PyDict_FromItems + // 4e: 48 89 c7 movq %rax, %rdi + // 51: 4d 8b 74 24 40 movq 0x40(%r12), %r14 + // 56: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5f: 66 85 ed testw %bp, %bp + // 62: 74 3b je 0x9f <_JIT_ENTRY+0x9f> + // 64: 48 8d 2c 6d 01 00 00 00 leaq 0x1(,%rbp,2), %rbp + // 6c: 4c 8b 2d 00 00 00 00 movq (%rip), %r13 # 0x73 <_JIT_ENTRY+0x73> + // 000000000000006f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 73: eb 14 jmp 0x89 <_JIT_ENTRY+0x89> + // 75: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 80: 48 ff cd decq %rbp + // 83: 48 83 fd 01 cmpq $0x1, %rbp + // 87: 76 16 jbe 0x9f <_JIT_ENTRY+0x9f> + // 89: 48 8b 4c ee f0 movq -0x10(%rsi,%rbp,8), %rcx + // 8e: 8b 01 movl (%rcx), %eax + // 90: 85 c0 testl %eax, %eax + // 92: 78 ec js 0x80 <_JIT_ENTRY+0x80> + // 94: ff c8 decl %eax + // 96: 89 01 movl %eax, (%rcx) + // 98: 75 e6 jne 0x80 <_JIT_ENTRY+0x80> + // 9a: 41 ff d5 callq *%r13 + // 9d: eb e1 jmp 0x80 <_JIT_ENTRY+0x80> + // 9f: 48 85 ff testq %rdi, %rdi + // a2: 74 22 je 0xc6 <_JIT_ENTRY+0xc6> + // a4: 4b 89 3c fe movq %rdi, (%r14,%r15,8) + // a8: b8 01 00 00 00 movl $0x1, %eax + // ad: 29 d8 subl %ebx, %eax + // af: 48 98 cltq + // b1: 4d 8d 2c c6 leaq (%r14,%rax,8), %r13 + // b5: 4c 8b 74 24 28 movq 0x28(%rsp), %r14 + // ba: 48 83 c4 30 addq $0x30, %rsp + // be: 5d popq %rbp + // bf: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // c6: 4f 8d 2c fe leaq (%r14,%r15,8), %r13 + // ca: 4c 8b 74 24 28 movq 0x28(%rsp), %r14 + // cf: 48 83 c4 30 addq $0x30, %rsp + // d3: 5d popq %rbp + // d4: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xdb <_JIT_ENTRY+0xdb> + // 00000000000000d7: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[219] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x4c, 0x89, 0x74, + 0x24, 0x28, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0xd8, 0x01, 0xdb, 0x89, 0xd9, + 0xf7, 0xd9, 0x4c, 0x63, 0xf9, 0x4a, 0x8d, 0x34, + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x01, 0xee, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, 0xe8, + 0x4f, 0x8d, 0x44, 0xfd, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x20, 0xba, 0x02, 0x00, 0x00, 0x00, 0x41, + 0xb9, 0x02, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xc7, 0x4d, 0x8b, 0x74, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xed, 0x74, 0x3b, 0x48, 0x8d, 0x2c, 0x6d, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x2d, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x14, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x48, 0x83, 0xfd, 0x01, 0x76, + 0x16, 0x48, 0x8b, 0x4c, 0xee, 0xf0, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0xec, 0xff, 0xc8, 0x89, 0x01, + 0x75, 0xe6, 0x41, 0xff, 0xd5, 0xeb, 0xe1, 0x48, + 0x85, 0xff, 0x74, 0x22, 0x4b, 0x89, 0x3c, 0xfe, + 0xb8, 0x01, 0x00, 0x00, 0x00, 0x29, 0xd8, 0x48, + 0x98, 0x4d, 0x8d, 0x2c, 0xc6, 0x4c, 0x8b, 0x74, + 0x24, 0x28, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x8d, + 0x2c, 0xfe, 0x4c, 0x8b, 0x74, 0x24, 0x28, 0x48, + 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyDict_FromItems+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_FromItems); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + 0x1c); +} + +void +emit__BUILD_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SET.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 0f b7 df movzwl %di, %ebx + // f: 48 f7 db negq %rbx + // 12: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 17: 31 c9 xorl %ecx, %ecx + // 19: ff 15 00 00 00 00 callq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp_PySet_New + // 1f: 4d 8b 7c 24 40 movq 0x40(%r12), %r15 + // 24: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2d: 48 85 c0 testq %rax, %rax + // 30: 0f 84 e0 00 00 00 je 0x116 <_JIT_ENTRY+0x116> + // 36: 48 89 c6 movq %rax, %rsi + // 39: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 40: 66 85 c0 testw %ax, %ax + // 43: 0f 84 34 01 00 00 je 0x17d <_JIT_ENTRY+0x17d> + // 49: 31 ff xorl %edi, %edi + // 4b: 48 8b 2d 00 00 00 00 movq (%rip), %rbp # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp_PySet_Add + // 52: 48 89 5c 24 28 movq %rbx, 0x28(%rsp) + // 57: eb 0c jmp 0x65 <_JIT_ENTRY+0x65> + // 59: 0f 1f 80 00 00 00 00 nopl (%rax) + // 60: 48 ff c3 incq %rbx + // 63: 74 25 je 0x8a <_JIT_ENTRY+0x8a> + // 65: 85 ff testl %edi, %edi + // 67: 75 f7 jne 0x60 <_JIT_ENTRY+0x60> + // 69: 4d 89 7c 24 40 movq %r15, 0x40(%r12) + // 6e: 49 8b 54 dd 00 movq (%r13,%rbx,8), %rdx + // 73: 48 89 f1 movq %rsi, %rcx + // 76: ff d5 callq *%rbp + // 78: 89 c7 movl %eax, %edi + // 7a: 4d 8b 7c 24 40 movq 0x40(%r12), %r15 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: eb d6 jmp 0x60 <_JIT_ENTRY+0x60> + // 8a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x91 <_JIT_ENTRY+0x91> + // 000000000000008d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 91: 66 85 c0 testw %ax, %ax + // 94: 74 3b je 0xd1 <_JIT_ENTRY+0xd1> + // 96: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0x9d <_JIT_ENTRY+0x9d> + // 0000000000000099: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 9d: 48 ff c5 incq %rbp + // a0: 49 83 c5 f8 addq $-0x8, %r13 + // a4: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0xab <_JIT_ENTRY+0xab> + // 00000000000000a7: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ab: eb 10 jmp 0xbd <_JIT_ENTRY+0xbd> + // ad: 0f 1f 00 nopl (%rax) + // b0: 48 ff cd decq %rbp + // b3: 49 83 c5 f8 addq $-0x8, %r13 + // b7: 48 83 fd 01 cmpq $0x1, %rbp + // bb: 76 14 jbe 0xd1 <_JIT_ENTRY+0xd1> + // bd: 49 8b 4d 00 movq (%r13), %rcx + // c1: 8b 01 movl (%rcx), %eax + // c3: 85 c0 testl %eax, %eax + // c5: 78 e9 js 0xb0 <_JIT_ENTRY+0xb0> + // c7: ff c8 decl %eax + // c9: 89 01 movl %eax, (%rcx) + // cb: 75 e3 jne 0xb0 <_JIT_ENTRY+0xb0> + // cd: ff d3 callq *%rbx + // cf: eb df jmp 0xb0 <_JIT_ENTRY+0xb0> + // d1: 85 ff testl %edi, %edi + // d3: 0f 84 98 00 00 00 je 0x171 <_JIT_ENTRY+0x171> + // d9: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // de: 49 8d 04 c7 leaq (%r15,%rax,8), %rax + // e2: 49 89 44 24 40 movq %rax, 0x40(%r12) + // e7: 8b 06 movl (%rsi), %eax + // e9: 85 c0 testl %eax, %eax + // eb: 78 0f js 0xfc <_JIT_ENTRY+0xfc> + // ed: ff c8 decl %eax + // ef: 89 06 movl %eax, (%rsi) + // f1: 75 09 jne 0xfc <_JIT_ENTRY+0xfc> + // f3: 48 89 f1 movq %rsi, %rcx + // f6: ff 15 00 00 00 00 callq *(%rip) # 0xfc <_JIT_ENTRY+0xfc> + // 00000000000000f8: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // fc: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 101: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 10a: 48 83 c4 30 addq $0x30, %rsp + // 10e: 5d popq %rbp + // 10f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x116 <_JIT_ENTRY+0x116> + // 0000000000000112: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 116: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x11d <_JIT_ENTRY+0x11d> + // 0000000000000119: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 11d: 66 85 c0 testw %ax, %ax + // 120: 74 3f je 0x161 <_JIT_ENTRY+0x161> + // 122: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x129 <_JIT_ENTRY+0x129> + // 0000000000000125: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 129: 48 ff c6 incq %rsi + // 12c: 49 83 c5 f8 addq $-0x8, %r13 + // 130: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x137 <_JIT_ENTRY+0x137> + // 0000000000000133: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 137: eb 14 jmp 0x14d <_JIT_ENTRY+0x14d> + // 139: 0f 1f 80 00 00 00 00 nopl (%rax) + // 140: 48 ff ce decq %rsi + // 143: 49 83 c5 f8 addq $-0x8, %r13 + // 147: 48 83 fe 01 cmpq $0x1, %rsi + // 14b: 76 14 jbe 0x161 <_JIT_ENTRY+0x161> + // 14d: 49 8b 4d 00 movq (%r13), %rcx + // 151: 8b 01 movl (%rcx), %eax + // 153: 85 c0 testl %eax, %eax + // 155: 78 e9 js 0x140 <_JIT_ENTRY+0x140> + // 157: ff c8 decl %eax + // 159: 89 01 movl %eax, (%rcx) + // 15b: 75 e3 jne 0x140 <_JIT_ENTRY+0x140> + // 15d: ff d7 callq *%rdi + // 15f: eb df jmp 0x140 <_JIT_ENTRY+0x140> + // 161: 4d 8d 2c df leaq (%r15,%rbx,8), %r13 + // 165: 48 83 c4 30 addq $0x30, %rsp + // 169: 5d popq %rbp + // 16a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x171 <_JIT_ENTRY+0x171> + // 000000000000016d: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 171: 48 8b 5c 24 28 movq 0x28(%rsp), %rbx + // 176: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x17d <_JIT_ENTRY+0x17d> + // 0000000000000179: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 17d: 0f b7 c7 movzwl %di, %eax + // 180: 49 89 34 df movq %rsi, (%r15,%rbx,8) + // 184: b9 01 00 00 00 movl $0x1, %ecx + // 189: 29 c1 subl %eax, %ecx + // 18b: 48 63 c1 movslq %ecx, %rax + // 18e: 4d 8d 2c c7 leaq (%r15,%rax,8), %r13 + // 192: 48 83 c4 30 addq $0x30, %rsp + // 196: 5d popq %rbp + // 197: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x19e <_JIT_ENTRY+0x19e> + // 000000000000019a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[407] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x48, 0x8b, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xdf, 0x48, + 0xf7, 0xdb, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x31, + 0xc9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x7c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x0f, 0x84, 0xe0, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xc6, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x85, 0xc0, 0x0f, 0x84, 0x34, 0x01, 0x00, + 0x00, 0x31, 0xff, 0x48, 0x8b, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0x5c, 0x24, 0x28, 0xeb, + 0x0c, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc3, 0x74, 0x25, 0x85, 0xff, 0x75, + 0xf7, 0x4d, 0x89, 0x7c, 0x24, 0x40, 0x49, 0x8b, + 0x54, 0xdd, 0x00, 0x48, 0x89, 0xf1, 0xff, 0xd5, + 0x89, 0xc7, 0x4d, 0x8b, 0x7c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0xd6, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3b, 0x0f, 0xb7, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc5, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x8b, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x10, 0x0f, 0x1f, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0xff, 0xd3, 0xeb, + 0xdf, 0x85, 0xff, 0x0f, 0x84, 0x98, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x44, 0x24, 0x28, 0x49, 0x8d, + 0x04, 0xc7, 0x49, 0x89, 0x44, 0x24, 0x40, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, + 0x06, 0x75, 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, + 0x74, 0x3f, 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0xc6, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x14, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xce, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfe, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0xff, 0xd7, 0xeb, + 0xdf, 0x4d, 0x8d, 0x2c, 0xdf, 0x48, 0x83, 0xc4, + 0x30, 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x5c, 0x24, 0x28, 0x48, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc7, + 0x49, 0x89, 0x34, 0xdf, 0xb9, 0x01, 0x00, 0x00, + 0x00, 0x29, 0xc1, 0x48, 0x63, 0xc1, 0x4d, 0x8d, + 0x2c, 0xc7, 0x48, 0x83, 0xc4, 0x30, 0x5d, + }; + // 0: OPARG + // 8: &PySet_New+0x0 + // 10: &PySet_Add+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySet_New); + patch_64(data + 0x10, (uintptr_t)&PySet_Add); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xa7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xf8, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x112, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x119, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x125, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x133, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x16d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x179, (uintptr_t)data + -0x4); +} + +void +emit__BUILD_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_SLICE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 40 subq $0x40, %rsp + // 5: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 0f b7 f8 movzwl %ax, %edi + // f: 8d 0c fd 00 00 00 00 leal (,%rdi,8), %ecx + // 16: 4c 89 ee movq %r13, %rsi + // 19: 48 29 ce subq %rcx, %rsi + // 1c: 48 8b 0e movq (%rsi), %rcx + // 1f: 48 8b 56 08 movq 0x8(%rsi), %rdx + // 23: 66 83 f8 03 cmpw $0x3, %ax + // 27: 4c 89 74 24 30 movq %r14, 0x30(%rsp) + // 2c: 4c 89 64 24 28 movq %r12, 0x28(%rsp) + // 31: 48 89 7c 24 38 movq %rdi, 0x38(%rsp) + // 36: 75 06 jne 0x3e <_JIT_ENTRY+0x3e> + // 38: 4c 8b 46 10 movq 0x10(%rsi), %r8 + // 3c: eb 03 jmp 0x41 <_JIT_ENTRY+0x41> + // 3e: 45 31 c0 xorl %r8d, %r8d + // 41: ff 15 00 00 00 00 callq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: IMAGE_REL_AMD64_REL32 __imp_PySlice_New + // 47: 48 89 c7 movq %rax, %rdi + // 4a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 51: 66 85 c0 testw %ax, %ax + // 54: 74 3b je 0x91 <_JIT_ENTRY+0x91> + // 56: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 5e: 49 ff c7 incq %r15 + // 61: 49 8d 6d f8 leaq -0x8(%r13), %rbp + // 65: 48 8b 1d 00 00 00 00 movq (%rip), %rbx # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6c: eb 0f jmp 0x7d <_JIT_ENTRY+0x7d> + // 6e: 66 90 nop + // 70: 49 ff cf decq %r15 + // 73: 48 83 c5 f8 addq $-0x8, %rbp + // 77: 49 83 ff 01 cmpq $0x1, %r15 + // 7b: 76 14 jbe 0x91 <_JIT_ENTRY+0x91> + // 7d: 48 8b 4d 00 movq (%rbp), %rcx + // 81: 8b 01 movl (%rcx), %eax + // 83: 85 c0 testl %eax, %eax + // 85: 78 e9 js 0x70 <_JIT_ENTRY+0x70> + // 87: ff c8 decl %eax + // 89: 89 01 movl %eax, (%rcx) + // 8b: 75 e3 jne 0x70 <_JIT_ENTRY+0x70> + // 8d: ff d3 callq *%rbx + // 8f: eb df jmp 0x70 <_JIT_ENTRY+0x70> + // 91: 48 85 ff testq %rdi, %rdi + // 94: 74 29 je 0xbf <_JIT_ENTRY+0xbf> + // 96: 48 89 3e movq %rdi, (%rsi) + // 99: b8 01 00 00 00 movl $0x1, %eax + // 9e: 2b 44 24 38 subl 0x38(%rsp), %eax + // a2: 48 98 cltq + // a4: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // a9: 4c 8b 64 24 28 movq 0x28(%rsp), %r12 + // ae: 4c 8b 74 24 30 movq 0x30(%rsp), %r14 + // b3: 48 83 c4 40 addq $0x40, %rsp + // b7: 5d popq %rbp + // b8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // bf: 4c 8b 64 24 28 movq 0x28(%rsp), %r12 + // c4: 49 89 f5 movq %rsi, %r13 + // c7: 4c 8b 74 24 30 movq 0x30(%rsp), %r14 + // cc: 48 83 c4 40 addq $0x40, %rsp + // d0: 5d popq %rbp + // d1: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d4: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[216] = { + 0x55, 0x48, 0x83, 0xec, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xf8, 0x8d, + 0x0c, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xee, 0x48, 0x29, 0xce, 0x48, 0x8b, 0x0e, 0x48, + 0x8b, 0x56, 0x08, 0x66, 0x83, 0xf8, 0x03, 0x4c, + 0x89, 0x74, 0x24, 0x30, 0x4c, 0x89, 0x64, 0x24, + 0x28, 0x48, 0x89, 0x7c, 0x24, 0x38, 0x75, 0x06, + 0x4c, 0x8b, 0x46, 0x10, 0xeb, 0x03, 0x45, 0x31, + 0xc0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xc7, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3b, 0x44, 0x0f, + 0xb7, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, + 0xc7, 0x49, 0x8d, 0x6d, 0xf8, 0x48, 0x8b, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0x0f, 0x66, 0x90, + 0x49, 0xff, 0xcf, 0x48, 0x83, 0xc5, 0xf8, 0x49, + 0x83, 0xff, 0x01, 0x76, 0x14, 0x48, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0xff, 0xd3, 0xeb, + 0xdf, 0x48, 0x85, 0xff, 0x74, 0x29, 0x48, 0x89, + 0x3e, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x44, + 0x24, 0x38, 0x48, 0x98, 0x4d, 0x8d, 0x6c, 0xc5, + 0x00, 0x4c, 0x8b, 0x64, 0x24, 0x28, 0x4c, 0x8b, + 0x74, 0x24, 0x30, 0x48, 0x83, 0xc4, 0x40, 0x5d, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x64, 0x24, 0x28, 0x49, 0x89, 0xf5, 0x4c, + 0x8b, 0x74, 0x24, 0x30, 0x48, 0x83, 0xc4, 0x40, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PySlice_New+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySlice_New); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd4, (uintptr_t)data + 0x1c); +} + +void +emit__BUILD_STRING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_STRING.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 20 subq $0x20, %rsp + // 5: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 0f b7 d8 movzwl %ax, %ebx + // f: 8d 04 dd 00 00 00 00 leal (,%rbx,8), %eax + // 16: 4c 89 ee movq %r13, %rsi + // 19: 48 29 c6 subq %rax, %rsi + // 1c: b9 08 87 00 00 movl $0x8708, %ecx # imm = 0x8708 + // 21: 48 03 0d 00 00 00 00 addq (%rip), %rcx # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 28: 48 89 f2 movq %rsi, %rdx + // 2b: 49 89 d8 movq %rbx, %r8 + // 2e: ff 15 00 00 00 00 callq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_JoinArray + // 34: 48 89 c7 movq %rax, %rdi + // 37: 66 85 db testw %bx, %bx + // 3a: 74 36 je 0x72 <_JIT_ENTRY+0x72> + // 3c: 48 ff c3 incq %rbx + // 3f: 49 8d 6d f8 leaq -0x8(%r13), %rbp + // 43: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4a: eb 11 jmp 0x5d <_JIT_ENTRY+0x5d> + // 4c: 0f 1f 40 00 nopl (%rax) + // 50: 48 ff cb decq %rbx + // 53: 48 83 c5 f8 addq $-0x8, %rbp + // 57: 48 83 fb 01 cmpq $0x1, %rbx + // 5b: 76 15 jbe 0x72 <_JIT_ENTRY+0x72> + // 5d: 48 8b 4d 00 movq (%rbp), %rcx + // 61: 8b 01 movl (%rcx), %eax + // 63: 85 c0 testl %eax, %eax + // 65: 78 e9 js 0x50 <_JIT_ENTRY+0x50> + // 67: ff c8 decl %eax + // 69: 89 01 movl %eax, (%rcx) + // 6b: 75 e3 jne 0x50 <_JIT_ENTRY+0x50> + // 6d: 41 ff d7 callq *%r15 + // 70: eb de jmp 0x50 <_JIT_ENTRY+0x50> + // 72: 48 85 ff testq %rdi, %rdi + // 75: 74 28 je 0x9f <_JIT_ENTRY+0x9f> + // 77: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7e: 0f b7 c0 movzwl %ax, %eax + // 81: 48 89 3e movq %rdi, (%rsi) + // 84: b9 01 00 00 00 movl $0x1, %ecx + // 89: 29 c1 subl %eax, %ecx + // 8b: 48 63 c1 movslq %ecx, %rax + // 8e: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 93: 48 83 c4 20 addq $0x20, %rsp + // 97: 5d popq %rbp + // 98: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9f <_JIT_ENTRY+0x9f> + // 000000000000009b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 9f: 49 89 f5 movq %rsi, %r13 + // a2: 48 83 c4 20 addq $0x20, %rsp + // a6: 5d popq %rbp + // a7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[174] = { + 0x55, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd8, 0x8d, + 0x04, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xee, 0x48, 0x29, 0xc6, 0xb9, 0x08, 0x87, 0x00, + 0x00, 0x48, 0x03, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf2, 0x49, 0x89, 0xd8, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc7, 0x66, + 0x85, 0xdb, 0x74, 0x36, 0x48, 0xff, 0xc3, 0x49, + 0x8d, 0x6d, 0xf8, 0x4c, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x11, 0x0f, 0x1f, 0x40, 0x00, + 0x48, 0xff, 0xcb, 0x48, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfb, 0x01, 0x76, 0x15, 0x48, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xff, 0x74, 0x28, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, + 0xc0, 0x48, 0x89, 0x3e, 0xb9, 0x01, 0x00, 0x00, + 0x00, 0x29, 0xc1, 0x48, 0x63, 0xc1, 0x4d, 0x8d, + 0x6c, 0xc5, 0x00, 0x48, 0x83, 0xc4, 0x20, 0x5d, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0xf5, 0x48, 0x83, 0xc4, 0x20, 0x5d, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_JoinArray+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_JoinArray); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x24); +} + +void +emit__BUILD_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _BUILD_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 0f b7 d7 movzwl %di, %edx + // e: 8d 04 d5 00 00 00 00 leal (,%rdx,8), %eax + // 15: 4c 89 ee movq %r13, %rsi + // 18: 48 29 c6 subq %rax, %rsi + // 1b: 48 89 f1 movq %rsi, %rcx + // 1e: ff 15 00 00 00 00 callq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp__PyTuple_FromStackRefStealOnSuccess + // 24: 48 85 c0 testq %rax, %rax + // 27: 74 1f je 0x48 <_JIT_ENTRY+0x48> + // 29: 0f b7 cf movzwl %di, %ecx + // 2c: 48 89 06 movq %rax, (%rsi) + // 2f: b8 01 00 00 00 movl $0x1, %eax + // 34: 29 c8 subl %ecx, %eax + // 36: 48 98 cltq + // 38: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 3d: 48 83 c4 28 addq $0x28, %rsp + // 41: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 48: 48 83 c4 28 addq $0x28, %rsp + // 4c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[83] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd7, 0x8d, 0x04, + 0xd5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, + 0x48, 0x29, 0xc6, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x1f, 0x0f, 0xb7, 0xcf, 0x48, 0x89, 0x06, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x29, 0xc8, 0x48, 0x98, + 0x4d, 0x8d, 0x6c, 0xc5, 0x00, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyTuple_FromStackRefStealOnSuccess+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyTuple_FromStackRefStealOnSuccess); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); +} + +void +emit__CALL_BUILTIN_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_CLASS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 11: 29 c1 subl %eax, %ecx + // 13: 48 63 f9 movslq %ecx, %rdi + // 16: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // 1b: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1f: 83 ba a8 00 00 00 00 cmpl $0x0, 0xa8(%rdx) + // 26: 78 0c js 0x34 <_JIT_ENTRY+0x34> + // 28: 48 83 c4 30 addq $0x30, %rsp + // 2c: 5d popq %rbp + // 2d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 34: 48 83 b9 90 01 00 00 00 cmpq $0x0, 0x190(%rcx) + // 3c: 74 ea je 0x28 <_JIT_ENTRY+0x28> + // 3e: 8d 14 c5 00 00 00 00 leal (,%rax,8), %edx + // 45: 4c 89 ee movq %r13, %rsi + // 48: 48 29 d6 subq %rdx, %rsi + // 4b: 89 c2 movl %eax, %edx + // 4d: f7 d2 notl %edx + // 4f: 48 63 da movslq %edx, %rbx + // 52: 31 d2 xorl %edx, %edx + // 54: 45 31 c0 xorl %r8d, %r8d + // 57: 49 83 7c dd 00 00 cmpq $0x0, (%r13,%rbx,8) + // 5d: 0f 94 c2 sete %dl + // 60: 41 0f 95 c0 setne %r8b + // 64: 41 01 c0 addl %eax, %r8d + // 67: 48 8d 14 d6 leaq (%rsi,%rdx,8), %rdx + // 6b: 48 83 c2 f8 addq $-0x8, %rdx + // 6f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 74: 45 31 c9 xorl %r9d, %r9d + // 77: ff 91 90 01 00 00 callq *0x190(%rcx) + // 7d: 48 89 c6 movq %rax, %rsi + // 80: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 85: 48 89 44 24 28 movq %rax, 0x28(%rsp) + // 8a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 93: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // 98: 8b 01 movl (%rcx), %eax + // 9a: 85 c0 testl %eax, %eax + // 9c: 78 0c js 0xaa <_JIT_ENTRY+0xaa> + // 9e: ff c8 decl %eax + // a0: 89 01 movl %eax, (%rcx) + // a2: 75 06 jne 0xaa <_JIT_ENTRY+0xaa> + // a4: ff 15 00 00 00 00 callq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // aa: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // af: 48 85 c9 testq %rcx, %rcx + // b2: 74 12 je 0xc6 <_JIT_ENTRY+0xc6> + // b4: 8b 01 movl (%rcx), %eax + // b6: 85 c0 testl %eax, %eax + // b8: 78 0c js 0xc6 <_JIT_ENTRY+0xc6> + // ba: ff c8 decl %eax + // bc: 89 01 movl %eax, (%rcx) + // be: 75 06 jne 0xc6 <_JIT_ENTRY+0xc6> + // c0: ff 15 00 00 00 00 callq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c6: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xcd <_JIT_ENTRY+0xcd> + // 00000000000000c9: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // cd: 66 85 c0 testw %ax, %ax + // d0: 74 40 je 0x112 <_JIT_ENTRY+0x112> + // d2: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xd9 <_JIT_ENTRY+0xd9> + // 00000000000000d5: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // d9: 48 ff c5 incq %rbp + // dc: 49 83 c5 f8 addq $-0x8, %r13 + // e0: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0xe7 <_JIT_ENTRY+0xe7> + // 00000000000000e3: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // e7: eb 14 jmp 0xfd <_JIT_ENTRY+0xfd> + // e9: 0f 1f 80 00 00 00 00 nopl (%rax) + // f0: 48 ff cd decq %rbp + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 48 83 fd 01 cmpq $0x1, %rbp + // fb: 76 15 jbe 0x112 <_JIT_ENTRY+0x112> + // fd: 49 8b 4d 00 movq (%r13), %rcx + // 101: 8b 01 movl (%rcx), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <_JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 01 movl %eax, (%rcx) + // 10b: 75 e3 jne 0xf0 <_JIT_ENTRY+0xf0> + // 10d: 41 ff d7 callq *%r15 + // 110: eb de jmp 0xf0 <_JIT_ENTRY+0xf0> + // 112: 48 85 f6 testq %rsi, %rsi + // 115: 74 19 je 0x130 <_JIT_ENTRY+0x130> + // 117: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 11c: 48 89 34 f8 movq %rsi, (%rax,%rdi,8) + // 120: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 124: 48 83 c4 30 addq $0x30, %rsp + // 128: 5d popq %rbp + // 129: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x130 <_JIT_ENTRY+0x130> + // 000000000000012c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 130: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 135: 4c 8d 2c f8 leaq (%rax,%rdi,8), %r13 + // 139: 48 83 c4 30 addq $0x30, %rsp + // 13d: 5d popq %rbp + // 13e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x145 <_JIT_ENTRY+0x145> + // 0000000000000141: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[325] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0xb9, 0xfe, 0xff, 0xff, + 0xff, 0x29, 0xc1, 0x48, 0x63, 0xf9, 0x49, 0x8b, + 0x4c, 0xfd, 0x00, 0x48, 0x8b, 0x51, 0x08, 0x83, + 0xba, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, + 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xb9, 0x90, + 0x01, 0x00, 0x00, 0x00, 0x74, 0xea, 0x8d, 0x14, + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, + 0x48, 0x29, 0xd6, 0x89, 0xc2, 0xf7, 0xd2, 0x48, + 0x63, 0xda, 0x31, 0xd2, 0x45, 0x31, 0xc0, 0x49, + 0x83, 0x7c, 0xdd, 0x00, 0x00, 0x0f, 0x94, 0xc2, + 0x41, 0x0f, 0x95, 0xc0, 0x41, 0x01, 0xc0, 0x48, + 0x8d, 0x14, 0xd6, 0x48, 0x83, 0xc2, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x45, 0x31, 0xc9, 0xff, + 0x91, 0x90, 0x01, 0x00, 0x00, 0x48, 0x89, 0xc6, + 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, 0x44, + 0x24, 0x28, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xfd, 0x00, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x48, + 0x85, 0xc9, 0x74, 0x12, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, + 0x74, 0x40, 0x0f, 0xb7, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0xc5, 0x49, 0x83, 0xc5, 0xf8, + 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x14, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x48, + 0x8b, 0x44, 0x24, 0x28, 0x48, 0x89, 0x34, 0xf8, + 0x4c, 0x8d, 0x2c, 0xd8, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x4c, 0x8d, 0x2c, + 0xf8, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: JUMP_TARGET + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd5, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe3, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x12c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x141, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_BUILTIN_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 89 c8 movl %ecx, %eax + // e: f7 d0 notl %eax + // 10: 48 63 f8 movslq %eax, %rdi + // 13: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 18: 29 c8 subl %ecx, %eax + // 1a: 48 63 d8 movslq %eax, %rbx + // 1d: 49 8b 44 dd 00 movq (%r13,%rbx,8), %rax + // 22: 31 f6 xorl %esi, %esi + // 24: 31 d2 xorl %edx, %edx + // 26: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 2c: 41 0f 95 c0 setne %r8b + // 30: 41 0f 94 c2 sete %r10b + // 34: 4c 8b 48 08 movq 0x8(%rax), %r9 + // 38: 4c 3b 0d 00 00 00 00 cmpq (%rip), %r9 # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp_PyCFunction_Type + // 3f: 75 48 jne 0x89 <_JIT_ENTRY+0x89> + // 41: 4c 8b 48 10 movq 0x10(%rax), %r9 + // 45: 41 81 79 10 80 00 00 00 cmpl $0x80, 0x10(%r9) + // 4d: 75 3a jne 0x89 <_JIT_ENTRY+0x89> + // 4f: 44 8d 1c cd 00 00 00 00 leal (,%rcx,8), %r11d + // 57: 4d 89 ef movq %r13, %r15 + // 5a: 4d 29 df subq %r11, %r15 + // 5d: 44 88 d2 movb %r10b, %dl + // 60: 49 8d 14 d7 leaq (%r15,%rdx,8), %rdx + // 64: 48 83 c2 f8 addq $-0x8, %rdx + // 68: 44 88 c6 movb %r8b, %sil + // 6b: 01 ce addl %ecx, %esi + // 6d: 4d 8b 49 08 movq 0x8(%r9), %r9 + // 71: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 76: 41 89 f0 movl %esi, %r8d + // 79: 48 8b 48 10 movq 0x10(%rax), %rcx + // 7d: f6 41 10 20 testb $0x20, 0x10(%rcx) + // 81: 75 12 jne 0x95 <_JIT_ENTRY+0x95> + // 83: 48 8b 48 18 movq 0x18(%rax), %rcx + // 87: eb 0e jmp 0x97 <_JIT_ENTRY+0x97> + // 89: 48 83 c4 30 addq $0x30, %rsp + // 8d: 5d popq %rbp + // 8e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 95: 31 c9 xorl %ecx, %ecx + // 97: 41 ff d1 callq *%r9 + // 9a: 48 89 c6 movq %rax, %rsi + // 9d: 49 8b 44 24 40 movq 0x40(%r12), %rax + // a2: 48 89 44 24 28 movq %rax, 0x28(%rsp) + // a7: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b0: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // b5: 8b 01 movl (%rcx), %eax + // b7: 85 c0 testl %eax, %eax + // b9: 78 0c js 0xc7 <_JIT_ENTRY+0xc7> + // bb: ff c8 decl %eax + // bd: 89 01 movl %eax, (%rcx) + // bf: 75 06 jne 0xc7 <_JIT_ENTRY+0xc7> + // c1: ff 15 00 00 00 00 callq *(%rip) # 0xc7 <_JIT_ENTRY+0xc7> + // 00000000000000c3: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c7: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // cc: 48 85 c9 testq %rcx, %rcx + // cf: 74 12 je 0xe3 <_JIT_ENTRY+0xe3> + // d1: 8b 01 movl (%rcx), %eax + // d3: 85 c0 testl %eax, %eax + // d5: 78 0c js 0xe3 <_JIT_ENTRY+0xe3> + // d7: ff c8 decl %eax + // d9: 89 01 movl %eax, (%rcx) + // db: 75 06 jne 0xe3 <_JIT_ENTRY+0xe3> + // dd: ff 15 00 00 00 00 callq *(%rip) # 0xe3 <_JIT_ENTRY+0xe3> + // 00000000000000df: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // e3: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xea <_JIT_ENTRY+0xea> + // 00000000000000e6: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // ea: 66 85 c0 testw %ax, %ax + // ed: 74 43 je 0x132 <_JIT_ENTRY+0x132> + // ef: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xf6 <_JIT_ENTRY+0xf6> + // 00000000000000f2: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f6: 48 ff c5 incq %rbp + // f9: 49 83 c5 f8 addq $-0x8, %r13 + // fd: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x104 <_JIT_ENTRY+0x104> + // 0000000000000100: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 104: eb 17 jmp 0x11d <_JIT_ENTRY+0x11d> + // 106: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 48 ff cd decq %rbp + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fd 01 cmpq $0x1, %rbp + // 11b: 76 15 jbe 0x132 <_JIT_ENTRY+0x132> + // 11d: 49 8b 4d 00 movq (%r13), %rcx + // 121: 8b 01 movl (%rcx), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <_JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 01 movl %eax, (%rcx) + // 12b: 75 e3 jne 0x110 <_JIT_ENTRY+0x110> + // 12d: 41 ff d7 callq *%r15 + // 130: eb de jmp 0x110 <_JIT_ENTRY+0x110> + // 132: 48 85 f6 testq %rsi, %rsi + // 135: 74 19 je 0x150 <_JIT_ENTRY+0x150> + // 137: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 13c: 48 89 34 d8 movq %rsi, (%rax,%rbx,8) + // 140: 4c 8d 2c f8 leaq (%rax,%rdi,8), %r13 + // 144: 48 83 c4 30 addq $0x30, %rsp + // 148: 5d popq %rbp + // 149: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x150 <_JIT_ENTRY+0x150> + // 000000000000014c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 150: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 155: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 159: 48 83 c4 30 addq $0x30, %rsp + // 15d: 5d popq %rbp + // 15e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x165 <_JIT_ENTRY+0x165> + // 0000000000000161: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[357] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc8, 0xf7, 0xd0, + 0x48, 0x63, 0xf8, 0xb8, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc8, 0x48, 0x63, 0xd8, 0x49, 0x8b, 0x44, + 0xdd, 0x00, 0x31, 0xf6, 0x31, 0xd2, 0x49, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x41, 0x0f, 0x95, 0xc0, + 0x41, 0x0f, 0x94, 0xc2, 0x4c, 0x8b, 0x48, 0x08, + 0x4c, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x48, 0x4c, 0x8b, 0x48, 0x10, 0x41, 0x81, 0x79, + 0x10, 0x80, 0x00, 0x00, 0x00, 0x75, 0x3a, 0x44, + 0x8d, 0x1c, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0xef, 0x4d, 0x29, 0xdf, 0x44, 0x88, 0xd2, + 0x49, 0x8d, 0x14, 0xd7, 0x48, 0x83, 0xc2, 0xf8, + 0x44, 0x88, 0xc6, 0x01, 0xce, 0x4d, 0x8b, 0x49, + 0x08, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x41, 0x89, + 0xf0, 0x48, 0x8b, 0x48, 0x10, 0xf6, 0x41, 0x10, + 0x20, 0x75, 0x12, 0x48, 0x8b, 0x48, 0x18, 0xeb, + 0x0e, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x31, 0xc9, 0x41, + 0xff, 0xd1, 0x48, 0x89, 0xc6, 0x49, 0x8b, 0x44, + 0x24, 0x40, 0x48, 0x89, 0x44, 0x24, 0x28, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x8b, 0x01, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x4c, 0xfd, 0x00, 0x48, 0x85, 0xc9, 0x74, + 0x12, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x43, 0x0f, + 0xb7, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0xc5, 0x49, 0x83, 0xc5, 0xf8, 0x4c, 0x8b, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0x17, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x48, + 0x8b, 0x44, 0x24, 0x28, 0x48, 0x89, 0x34, 0xd8, + 0x4c, 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x4c, 0x8d, 0x2c, + 0xd8, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc3, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xdf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x100, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x161, (uintptr_t)data + 0x24); +} + +void +emit__CALL_BUILTIN_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_FAST_WITH_KEYWORDS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 89 c8 movl %ecx, %eax + // e: f7 d0 notl %eax + // 10: 48 63 f8 movslq %eax, %rdi + // 13: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 18: 29 c8 subl %ecx, %eax + // 1a: 48 63 d8 movslq %eax, %rbx + // 1d: 49 8b 44 dd 00 movq (%r13,%rbx,8), %rax + // 22: 31 f6 xorl %esi, %esi + // 24: 31 d2 xorl %edx, %edx + // 26: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 2c: 41 0f 95 c0 setne %r8b + // 30: 41 0f 94 c1 sete %r9b + // 34: 4c 8b 50 08 movq 0x8(%rax), %r10 + // 38: 4c 3b 15 00 00 00 00 cmpq (%rip), %r10 # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp_PyCFunction_Type + // 3f: 75 48 jne 0x89 <_JIT_ENTRY+0x89> + // 41: 4c 8b 50 10 movq 0x10(%rax), %r10 + // 45: 41 81 7a 10 82 00 00 00 cmpl $0x82, 0x10(%r10) + // 4d: 75 3a jne 0x89 <_JIT_ENTRY+0x89> + // 4f: 44 8d 14 cd 00 00 00 00 leal (,%rcx,8), %r10d + // 57: 4d 89 eb movq %r13, %r11 + // 5a: 4d 29 d3 subq %r10, %r11 + // 5d: 44 88 ca movb %r9b, %dl + // 60: 49 8d 14 d3 leaq (%r11,%rdx,8), %rdx + // 64: 48 83 c2 f8 addq $-0x8, %rdx + // 68: 44 88 c6 movb %r8b, %sil + // 6b: 01 ce addl %ecx, %esi + // 6d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 72: 48 8b 48 10 movq 0x10(%rax), %rcx + // 76: 4c 8b 51 08 movq 0x8(%rcx), %r10 + // 7a: 41 89 f0 movl %esi, %r8d + // 7d: f6 41 10 20 testb $0x20, 0x10(%rcx) + // 81: 75 12 jne 0x95 <_JIT_ENTRY+0x95> + // 83: 48 8b 48 18 movq 0x18(%rax), %rcx + // 87: eb 0e jmp 0x97 <_JIT_ENTRY+0x97> + // 89: 48 83 c4 30 addq $0x30, %rsp + // 8d: 5d popq %rbp + // 8e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 95: 31 c9 xorl %ecx, %ecx + // 97: 45 31 c9 xorl %r9d, %r9d + // 9a: 41 ff d2 callq *%r10 + // 9d: 48 89 c6 movq %rax, %rsi + // a0: 49 8b 44 24 40 movq 0x40(%r12), %rax + // a5: 48 89 44 24 28 movq %rax, 0x28(%rsp) + // aa: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b3: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // b8: 8b 01 movl (%rcx), %eax + // ba: 85 c0 testl %eax, %eax + // bc: 78 0c js 0xca <_JIT_ENTRY+0xca> + // be: ff c8 decl %eax + // c0: 89 01 movl %eax, (%rcx) + // c2: 75 06 jne 0xca <_JIT_ENTRY+0xca> + // c4: ff 15 00 00 00 00 callq *(%rip) # 0xca <_JIT_ENTRY+0xca> + // 00000000000000c6: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ca: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // cf: 48 85 c9 testq %rcx, %rcx + // d2: 74 12 je 0xe6 <_JIT_ENTRY+0xe6> + // d4: 8b 01 movl (%rcx), %eax + // d6: 85 c0 testl %eax, %eax + // d8: 78 0c js 0xe6 <_JIT_ENTRY+0xe6> + // da: ff c8 decl %eax + // dc: 89 01 movl %eax, (%rcx) + // de: 75 06 jne 0xe6 <_JIT_ENTRY+0xe6> + // e0: ff 15 00 00 00 00 callq *(%rip) # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // e6: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xed <_JIT_ENTRY+0xed> + // 00000000000000e9: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // ed: 66 85 c0 testw %ax, %ax + // f0: 74 40 je 0x132 <_JIT_ENTRY+0x132> + // f2: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xf9 <_JIT_ENTRY+0xf9> + // 00000000000000f5: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f9: 48 ff c5 incq %rbp + // fc: 49 83 c5 f8 addq $-0x8, %r13 + // 100: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x107 <_JIT_ENTRY+0x107> + // 0000000000000103: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 107: eb 14 jmp 0x11d <_JIT_ENTRY+0x11d> + // 109: 0f 1f 80 00 00 00 00 nopl (%rax) + // 110: 48 ff cd decq %rbp + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fd 01 cmpq $0x1, %rbp + // 11b: 76 15 jbe 0x132 <_JIT_ENTRY+0x132> + // 11d: 49 8b 4d 00 movq (%r13), %rcx + // 121: 8b 01 movl (%rcx), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <_JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 01 movl %eax, (%rcx) + // 12b: 75 e3 jne 0x110 <_JIT_ENTRY+0x110> + // 12d: 41 ff d7 callq *%r15 + // 130: eb de jmp 0x110 <_JIT_ENTRY+0x110> + // 132: 48 85 f6 testq %rsi, %rsi + // 135: 74 19 je 0x150 <_JIT_ENTRY+0x150> + // 137: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 13c: 48 89 34 d8 movq %rsi, (%rax,%rbx,8) + // 140: 4c 8d 2c f8 leaq (%rax,%rdi,8), %r13 + // 144: 48 83 c4 30 addq $0x30, %rsp + // 148: 5d popq %rbp + // 149: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x150 <_JIT_ENTRY+0x150> + // 000000000000014c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 150: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 155: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 159: 48 83 c4 30 addq $0x30, %rsp + // 15d: 5d popq %rbp + // 15e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x165 <_JIT_ENTRY+0x165> + // 0000000000000161: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[357] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc8, 0xf7, 0xd0, + 0x48, 0x63, 0xf8, 0xb8, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc8, 0x48, 0x63, 0xd8, 0x49, 0x8b, 0x44, + 0xdd, 0x00, 0x31, 0xf6, 0x31, 0xd2, 0x49, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x41, 0x0f, 0x95, 0xc0, + 0x41, 0x0f, 0x94, 0xc1, 0x4c, 0x8b, 0x50, 0x08, + 0x4c, 0x3b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x48, 0x4c, 0x8b, 0x50, 0x10, 0x41, 0x81, 0x7a, + 0x10, 0x82, 0x00, 0x00, 0x00, 0x75, 0x3a, 0x44, + 0x8d, 0x14, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0xeb, 0x4d, 0x29, 0xd3, 0x44, 0x88, 0xca, + 0x49, 0x8d, 0x14, 0xd3, 0x48, 0x83, 0xc2, 0xf8, + 0x44, 0x88, 0xc6, 0x01, 0xce, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x48, 0x10, 0x4c, 0x8b, + 0x51, 0x08, 0x41, 0x89, 0xf0, 0xf6, 0x41, 0x10, + 0x20, 0x75, 0x12, 0x48, 0x8b, 0x48, 0x18, 0xeb, + 0x0e, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x31, 0xc9, 0x45, + 0x31, 0xc9, 0x41, 0xff, 0xd2, 0x48, 0x89, 0xc6, + 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, 0x44, + 0x24, 0x28, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xdd, 0x00, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xfd, 0x00, 0x48, + 0x85, 0xc9, 0x74, 0x12, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, + 0x74, 0x40, 0x0f, 0xb7, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0xc5, 0x49, 0x83, 0xc5, 0xf8, + 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x14, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x48, + 0x8b, 0x44, 0x24, 0x28, 0x48, 0x89, 0x34, 0xd8, + 0x4c, 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x4c, 0x8d, 0x2c, + 0xd8, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc6, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf5, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x103, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x161, (uintptr_t)data + 0x24); +} + +void +emit__CALL_BUILTIN_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_BUILTIN_O.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 d1 movslq %ecx, %rdx + // 12: 31 c9 xorl %ecx, %ecx + // 14: 31 f6 xorl %esi, %esi + // 16: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 1c: 0f 94 c2 sete %dl + // 1f: 40 0f 95 c6 setne %sil + // 23: 01 c6 addl %eax, %esi + // 25: 83 fe 01 cmpl $0x1, %esi + // 28: 75 66 jne 0x90 <_JIT_ENTRY+0x90> + // 2a: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 2f: 29 c6 subl %eax, %esi + // 31: 48 63 de movslq %esi, %rbx + // 34: 49 8b 74 dd 00 movq (%r13,%rbx,8), %rsi + // 39: 48 8b 7e 08 movq 0x8(%rsi), %rdi + // 3d: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: IMAGE_REL_AMD64_REL32 __imp_PyCFunction_Type + // 44: 75 4a jne 0x90 <_JIT_ENTRY+0x90> + // 46: 48 8b 7e 10 movq 0x10(%rsi), %rdi + // 4a: 83 7f 10 08 cmpl $0x8, 0x10(%rdi) + // 4e: 75 40 jne 0x90 <_JIT_ENTRY+0x90> + // 50: 45 8b 46 34 movl 0x34(%r14), %r8d + // 54: 45 85 c0 testl %r8d, %r8d + // 57: 7e 37 jle 0x90 <_JIT_ENTRY+0x90> + // 59: c1 e0 03 shll $0x3, %eax + // 5c: 4d 89 e9 movq %r13, %r9 + // 5f: 49 29 c1 subq %rax, %r9 + // 62: 88 d1 movb %dl, %cl + // 64: 48 8d 0c cd f8 ff ff ff leaq -0x8(,%rcx,8), %rcx + // 6c: 48 8b 47 08 movq 0x8(%rdi), %rax + // 70: 49 8b 3c 09 movq (%r9,%rcx), %rdi + // 74: 41 ff c8 decl %r8d + // 77: 45 89 46 34 movl %r8d, 0x34(%r14) + // 7b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 80: 48 8b 4e 10 movq 0x10(%rsi), %rcx + // 84: f6 41 10 20 testb $0x20, 0x10(%rcx) + // 88: 75 11 jne 0x9b <_JIT_ENTRY+0x9b> + // 8a: 48 8b 4e 18 movq 0x18(%rsi), %rcx + // 8e: eb 0d jmp 0x9d <_JIT_ENTRY+0x9d> + // 90: 48 83 c4 28 addq $0x28, %rsp + // 94: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9b <_JIT_ENTRY+0x9b> + // 0000000000000097: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 9b: 31 c9 xorl %ecx, %ecx + // 9d: 48 89 fa movq %rdi, %rdx + // a0: ff d0 callq *%rax + // a2: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // a7: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b0: 41 ff 46 34 incl 0x34(%r14) + // b4: 48 89 c6 movq %rax, %rsi + // b7: 49 89 4c 24 40 movq %rcx, 0x40(%r12) + // bc: 8b 07 movl (%rdi), %eax + // be: 85 c0 testl %eax, %eax + // c0: 78 0f js 0xd1 <_JIT_ENTRY+0xd1> + // c2: ff c8 decl %eax + // c4: 89 07 movl %eax, (%rdi) + // c6: 75 09 jne 0xd1 <_JIT_ENTRY+0xd1> + // c8: 48 89 f9 movq %rdi, %rcx + // cb: ff 15 00 00 00 00 callq *(%rip) # 0xd1 <_JIT_ENTRY+0xd1> + // 00000000000000cd: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // d1: 48 8d 04 dd 00 00 00 00 leaq (,%rbx,8), %rax + // d9: 49 01 44 24 40 addq %rax, 0x40(%r12) + // de: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // e3: 8b 01 movl (%rcx), %eax + // e5: 85 c0 testl %eax, %eax + // e7: 78 0c js 0xf5 <_JIT_ENTRY+0xf5> + // e9: ff c8 decl %eax + // eb: 89 01 movl %eax, (%rcx) + // ed: 75 06 jne 0xf5 <_JIT_ENTRY+0xf5> + // ef: ff 15 00 00 00 00 callq *(%rip) # 0xf5 <_JIT_ENTRY+0xf5> + // 00000000000000f1: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // f5: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // fa: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 103: 48 85 f6 testq %rsi, %rsi + // 106: 74 13 je 0x11b <_JIT_ENTRY+0x11b> + // 108: 49 89 75 00 movq %rsi, (%r13) + // 10c: 49 83 c5 08 addq $0x8, %r13 + // 110: 48 83 c4 28 addq $0x28, %rsp + // 114: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x11b <_JIT_ENTRY+0x11b> + // 0000000000000117: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 11b: 48 83 c4 28 addq $0x28, %rsp + // 11f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x126 <_JIT_ENTRY+0x126> + // 0000000000000122: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[294] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xd1, 0x31, 0xc9, 0x31, 0xf6, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x0f, 0x94, 0xc2, 0x40, + 0x0f, 0x95, 0xc6, 0x01, 0xc6, 0x83, 0xfe, 0x01, + 0x75, 0x66, 0xbe, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc6, 0x48, 0x63, 0xde, 0x49, 0x8b, 0x74, 0xdd, + 0x00, 0x48, 0x8b, 0x7e, 0x08, 0x48, 0x3b, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x4a, 0x48, 0x8b, + 0x7e, 0x10, 0x83, 0x7f, 0x10, 0x08, 0x75, 0x40, + 0x45, 0x8b, 0x46, 0x34, 0x45, 0x85, 0xc0, 0x7e, + 0x37, 0xc1, 0xe0, 0x03, 0x4d, 0x89, 0xe9, 0x49, + 0x29, 0xc1, 0x88, 0xd1, 0x48, 0x8d, 0x0c, 0xcd, + 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, 0x47, 0x08, + 0x49, 0x8b, 0x3c, 0x09, 0x41, 0xff, 0xc8, 0x45, + 0x89, 0x46, 0x34, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x8b, 0x4e, 0x10, 0xf6, 0x41, 0x10, 0x20, + 0x75, 0x11, 0x48, 0x8b, 0x4e, 0x18, 0xeb, 0x0d, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x31, 0xc9, 0x48, 0x89, 0xfa, + 0xff, 0xd0, 0x49, 0x8b, 0x4c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x41, 0xff, 0x46, 0x34, 0x48, 0x89, 0xc6, 0x49, + 0x89, 0x4c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x09, + 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8d, 0x04, 0xdd, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x01, 0x44, 0x24, 0x40, 0x49, 0x8b, + 0x4c, 0xdd, 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xf6, 0x74, 0x13, + 0x49, 0x89, 0x75, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyCFunction_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCFunction_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcd, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xf1, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x117, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x122, (uintptr_t)data + 0x24); +} + +void +emit__CALL_INTRINSIC_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 14: c1 e0 04 shll $0x4, %eax + // 17: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__PyIntrinsics_UnaryFunctions + // 1e: 4c 89 f1 movq %r14, %rcx + // 21: 48 89 f2 movq %rsi, %rdx + // 24: ff 14 07 callq *(%rdi,%rax) + // 27: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 35: 8b 0e movl (%rsi), %ecx + // 37: 85 c9 testl %ecx, %ecx + // 39: 78 06 js 0x41 <_JIT_ENTRY+0x41> + // 3b: ff c9 decl %ecx + // 3d: 89 0e movl %ecx, (%rsi) + // 3f: 74 14 je 0x55 <_JIT_ENTRY+0x55> + // 41: 48 85 c0 testq %rax, %rax + // 44: 74 23 je 0x69 <_JIT_ENTRY+0x69> + // 46: 49 89 45 f8 movq %rax, -0x8(%r13) + // 4a: 48 83 c4 28 addq $0x28, %rsp + // 4e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 55: 48 89 f1 movq %rsi, %rcx + // 58: 48 89 c6 movq %rax, %rsi + // 5b: ff 15 00 00 00 00 callq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 61: 48 89 f0 movq %rsi, %rax + // 64: 48 85 c0 testq %rax, %rax + // 67: 75 dd jne 0x46 <_JIT_ENTRY+0x46> + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 83 c4 28 addq $0x28, %rsp + // 71: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[120] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, + 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf1, 0x48, 0x89, 0xf2, 0xff, 0x14, 0x07, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, + 0x14, 0x48, 0x85, 0xc0, 0x74, 0x23, 0x49, 0x89, + 0x45, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf0, 0x48, 0x85, 0xc0, 0x75, + 0xdd, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyIntrinsics_UnaryFunctions+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_UnaryFunctions); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_INTRINSIC_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_INTRINSIC_2.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 18: c1 e0 04 shll $0x4, %eax + // 1b: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x22 <_JIT_ENTRY+0x22> + // 000000000000001e: IMAGE_REL_AMD64_REL32 __imp__PyIntrinsics_BinaryFunctions + // 22: 4c 89 f1 movq %r14, %rcx + // 25: 48 89 da movq %rbx, %rdx + // 28: 49 89 f0 movq %rsi, %r8 + // 2b: ff 14 07 callq *(%rdi,%rax) + // 2e: 48 89 c7 movq %rax, %rdi + // 31: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 36: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3f: 8b 03 movl (%rbx), %eax + // 41: 85 c0 testl %eax, %eax + // 43: 78 0f js 0x54 <_JIT_ENTRY+0x54> + // 45: ff c8 decl %eax + // 47: 89 03 movl %eax, (%rbx) + // 49: 75 09 jne 0x54 <_JIT_ENTRY+0x54> + // 4b: 48 89 d9 movq %rbx, %rcx + // 4e: ff 15 00 00 00 00 callq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 54: 8b 06 movl (%rsi), %eax + // 56: 85 c0 testl %eax, %eax + // 58: 78 06 js 0x60 <_JIT_ENTRY+0x60> + // 5a: ff c8 decl %eax + // 5c: 89 06 movl %eax, (%rsi) + // 5e: 74 18 je 0x78 <_JIT_ENTRY+0x78> + // 60: 48 85 ff testq %rdi, %rdi + // 63: 74 21 je 0x86 <_JIT_ENTRY+0x86> + // 65: 49 89 7d f0 movq %rdi, -0x10(%r13) + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 83 c4 28 addq $0x28, %rsp + // 71: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x78 <_JIT_ENTRY+0x78> + // 0000000000000074: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 78: 48 89 f1 movq %rsi, %rcx + // 7b: ff 15 00 00 00 00 callq *(%rip) # 0x81 <_JIT_ENTRY+0x81> + // 000000000000007d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 81: 48 85 ff testq %rdi, %rdi + // 84: 75 df jne 0x65 <_JIT_ENTRY+0x65> + // 86: 49 83 c5 f0 addq $-0x10, %r13 + // 8a: 48 83 c4 28 addq $0x28, %rsp + // 8e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[149] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xf1, 0x48, 0x89, 0xda, + 0x49, 0x89, 0xf0, 0xff, 0x14, 0x07, 0x48, 0x89, + 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, + 0x03, 0x75, 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x18, + 0x48, 0x85, 0xff, 0x74, 0x21, 0x49, 0x89, 0x7d, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xff, 0x75, 0xdf, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyIntrinsics_BinaryFunctions+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyIntrinsics_BinaryFunctions); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x74, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_ISINSTANCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_ISINSTANCE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 48 63 d9 movslq %ecx, %rbx + // 13: 31 f6 xorl %esi, %esi + // 15: 31 c9 xorl %ecx, %ecx + // 17: 49 83 7c dd 00 00 cmpq $0x0, (%r13,%rbx,8) + // 1d: 40 0f 95 c6 setne %sil + // 21: 0f 94 c2 sete %dl + // 24: 01 c6 addl %eax, %esi + // 26: 83 fe 02 cmpl $0x2, %esi + // 29: 75 1c jne 0x47 <_JIT_ENTRY+0x47> + // 2b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 30: 29 c6 subl %eax, %esi + // 32: 4c 63 fe movslq %esi, %r15 + // 35: 49 8b 76 10 movq 0x10(%r14), %rsi + // 39: 48 8b b6 30 66 03 00 movq 0x36630(%rsi), %rsi + // 40: 4b 3b 74 fd 00 cmpq (%r13,%r15,8), %rsi + // 45: 74 0c je 0x53 <_JIT_ENTRY+0x53> + // 47: 48 83 c4 30 addq $0x30, %rsp + // 4b: 5d popq %rbp + // 4c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 53: c1 e0 03 shll $0x3, %eax + // 56: 4c 89 ee movq %r13, %rsi + // 59: 48 29 c6 subq %rax, %rsi + // 5c: 88 d1 movb %dl, %cl + // 5e: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 66: 48 8b 0c 06 movq (%rsi,%rax), %rcx + // 6a: 48 8b 54 06 08 movq 0x8(%rsi,%rax), %rdx + // 6f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp_PyObject_IsInstance + // 7a: 89 c7 movl %eax, %edi + // 7c: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 81: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8a: 85 ff testl %edi, %edi + // 8c: 0f 88 8c 00 00 00 js 0x11e <_JIT_ENTRY+0x11e> + // 92: 48 89 44 24 28 movq %rax, 0x28(%rsp) + // 97: 4b 8b 4c fd 00 movq (%r13,%r15,8), %rcx + // 9c: 8b 01 movl (%rcx), %eax + // 9e: 85 c0 testl %eax, %eax + // a0: 78 0c js 0xae <_JIT_ENTRY+0xae> + // a2: ff c8 decl %eax + // a4: 89 01 movl %eax, (%rcx) + // a6: 75 06 jne 0xae <_JIT_ENTRY+0xae> + // a8: ff 15 00 00 00 00 callq *(%rip) # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ae: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // b3: 48 85 c9 testq %rcx, %rcx + // b6: 74 12 je 0xca <_JIT_ENTRY+0xca> + // b8: 8b 01 movl (%rcx), %eax + // ba: 85 c0 testl %eax, %eax + // bc: 78 0c js 0xca <_JIT_ENTRY+0xca> + // be: ff c8 decl %eax + // c0: 89 01 movl %eax, (%rcx) + // c2: 75 06 jne 0xca <_JIT_ENTRY+0xca> + // c4: ff 15 00 00 00 00 callq *(%rip) # 0xca <_JIT_ENTRY+0xca> + // 00000000000000c6: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ca: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xd1 <_JIT_ENTRY+0xd1> + // 00000000000000cd: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // d1: 66 85 c0 testw %ax, %ax + // d4: 74 3b je 0x111 <_JIT_ENTRY+0x111> + // d6: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xdd <_JIT_ENTRY+0xdd> + // 00000000000000d9: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // dd: 48 ff c5 incq %rbp + // e0: 49 83 c5 f8 addq $-0x8, %r13 + // e4: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0xeb <_JIT_ENTRY+0xeb> + // 00000000000000e7: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // eb: eb 10 jmp 0xfd <_JIT_ENTRY+0xfd> + // ed: 0f 1f 00 nopl (%rax) + // f0: 48 ff cd decq %rbp + // f3: 49 83 c5 f8 addq $-0x8, %r13 + // f7: 48 83 fd 01 cmpq $0x1, %rbp + // fb: 76 14 jbe 0x111 <_JIT_ENTRY+0x111> + // fd: 49 8b 4d 00 movq (%r13), %rcx + // 101: 8b 01 movl (%rcx), %eax + // 103: 85 c0 testl %eax, %eax + // 105: 78 e9 js 0xf0 <_JIT_ENTRY+0xf0> + // 107: ff c8 decl %eax + // 109: 89 01 movl %eax, (%rcx) + // 10b: 75 e3 jne 0xf0 <_JIT_ENTRY+0xf0> + // 10d: ff d6 callq *%rsi + // 10f: eb df jmp 0xf0 <_JIT_ENTRY+0xf0> + // 111: 85 ff testl %edi, %edi + // 113: 75 18 jne 0x12d <_JIT_ENTRY+0x12d> + // 115: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x11c <_JIT_ENTRY+0x11c> + // 0000000000000118: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 11c: eb 16 jmp 0x134 <_JIT_ENTRY+0x134> + // 11e: 49 89 c5 movq %rax, %r13 + // 121: 48 83 c4 30 addq $0x30, %rsp + // 125: 5d popq %rbp + // 126: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x12d <_JIT_ENTRY+0x12d> + // 0000000000000129: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 12d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x134 <_JIT_ENTRY+0x134> + // 0000000000000130: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 134: 48 8b 4c 24 28 movq 0x28(%rsp), %rcx + // 139: 4a 89 04 f9 movq %rax, (%rcx,%r15,8) + // 13d: 4c 8d 2c d9 leaq (%rcx,%rbx,8), %r13 + // 141: 48 83 c4 30 addq $0x30, %rsp + // 145: 5d popq %rbp + // 146: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x14d <_JIT_ENTRY+0x14d> + // 0000000000000149: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[326] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x48, 0x63, 0xd9, 0x31, 0xf6, 0x31, 0xc9, 0x49, + 0x83, 0x7c, 0xdd, 0x00, 0x00, 0x40, 0x0f, 0x95, + 0xc6, 0x0f, 0x94, 0xc2, 0x01, 0xc6, 0x83, 0xfe, + 0x02, 0x75, 0x1c, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc6, 0x4c, 0x63, 0xfe, 0x49, 0x8b, 0x76, + 0x10, 0x48, 0x8b, 0xb6, 0x30, 0x66, 0x03, 0x00, + 0x4b, 0x3b, 0x74, 0xfd, 0x00, 0x74, 0x0c, 0x48, + 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, + 0xee, 0x48, 0x29, 0xc6, 0x88, 0xd1, 0x48, 0x8d, + 0x04, 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, + 0x0c, 0x06, 0x48, 0x8b, 0x54, 0x06, 0x08, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xc7, 0x49, 0x8b, 0x44, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xff, 0x0f, 0x88, 0x8c, 0x00, + 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x28, 0x4b, + 0x8b, 0x4c, 0xfd, 0x00, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x4c, 0xdd, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x12, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3b, 0x0f, 0xb7, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc5, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x8b, 0x35, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x10, 0x0f, 0x1f, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x14, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0xff, 0xd6, 0xeb, + 0xdf, 0x85, 0xff, 0x75, 0x18, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0x16, 0x49, 0x89, + 0xc5, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x4c, 0x24, + 0x28, 0x4a, 0x89, 0x04, 0xf9, 0x4c, 0x8d, 0x2c, + 0xd9, 0x48, 0x83, 0xc4, 0x30, 0x5d, + }; + // 0: OPARG + // 8: JUMP_TARGET + // 10: &PyObject_IsInstance+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: &_Py_FalseStruct+0x0 + // 28: ERROR_TARGET + // 30: &_Py_TrueStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyObject_IsInstance); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc6, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xcd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd9, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x118, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x129, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x130, (uintptr_t)data + 0x2c); +} + +void +emit__CALL_KW_NON_PY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_KW_NON_PY.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 4c 89 74 24 28 movq %r14, 0x28(%rsp) + // a: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 11: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 15: 89 e8 movl %ebp, %eax + // 17: f7 d0 notl %eax + // 19: 4c 63 f0 movslq %eax, %r14 + // 1c: 4a 8d 04 f5 00 00 00 00 leaq (,%r14,8), %rax + // 24: 4c 01 e8 addq %r13, %rax + // 27: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 2c: 29 e9 subl %ebp, %ecx + // 2e: 4c 63 f9 movslq %ecx, %r15 + // 31: b9 fd ff ff ff movl $0xfffffffd, %ecx # imm = 0xFFFFFFFD + // 36: 29 e9 subl %ebp, %ecx + // 38: 48 63 d9 movslq %ecx, %rbx + // 3b: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // 40: 31 f6 xorl %esi, %esi + // 42: 31 d2 xorl %edx, %edx + // 44: 4b 83 7c fd 00 00 cmpq $0x0, (%r13,%r15,8) + // 4a: 40 0f 95 c6 setne %sil + // 4e: 0f 94 c2 sete %dl + // 51: 48 8d 14 d0 leaq (%rax,%rdx,8), %rdx + // 55: 48 83 c2 f8 addq $-0x8, %rdx + // 59: 01 ee addl %ebp, %esi + // 5b: 2b 77 10 subl 0x10(%rdi), %esi + // 5e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 63: 48 63 c6 movslq %esi, %rax + // 66: 49 b8 00 00 00 00 00 00 00 80 movabsq $-0x8000000000000000, %r8 # imm = 0x8000000000000000 + // 70: 49 09 c0 orq %rax, %r8 + // 73: 49 89 f9 movq %rdi, %r9 + // 76: ff 15 00 00 00 00 callq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: IMAGE_REL_AMD64_REL32 __imp_PyObject_Vectorcall + // 7c: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 82: 48 89 c6 movq %rax, %rsi + // 85: 8b 07 movl (%rdi), %eax + // 87: 85 c0 testl %eax, %eax + // 89: 78 0f js 0x9a <_JIT_ENTRY+0x9a> + // 8b: ff c8 decl %eax + // 8d: 89 07 movl %eax, (%rdi) + // 8f: 75 09 jne 0x9a <_JIT_ENTRY+0x9a> + // 91: 48 89 f9 movq %rdi, %rcx + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 9a: 49 8b 7c 24 40 movq 0x40(%r12), %rdi + // 9f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a8: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // ad: 8b 01 movl (%rcx), %eax + // af: 85 c0 testl %eax, %eax + // b1: 78 0c js 0xbf <_JIT_ENTRY+0xbf> + // b3: ff c8 decl %eax + // b5: 89 01 movl %eax, (%rcx) + // b7: 75 06 jne 0xbf <_JIT_ENTRY+0xbf> + // b9: ff 15 00 00 00 00 callq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // bf: 4b 8b 4c fd 00 movq (%r13,%r15,8), %rcx + // c4: 48 85 c9 testq %rcx, %rcx + // c7: 74 12 je 0xdb <_JIT_ENTRY+0xdb> + // c9: 8b 01 movl (%rcx), %eax + // cb: 85 c0 testl %eax, %eax + // cd: 78 0c js 0xdb <_JIT_ENTRY+0xdb> + // cf: ff c8 decl %eax + // d1: 89 01 movl %eax, (%rcx) + // d3: 75 06 jne 0xdb <_JIT_ENTRY+0xdb> + // d5: ff 15 00 00 00 00 callq *(%rip) # 0xdb <_JIT_ENTRY+0xdb> + // 00000000000000d7: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // db: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xe2 <_JIT_ENTRY+0xe2> + // 00000000000000de: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // e2: 66 85 c0 testw %ax, %ax + // e5: 74 47 je 0x12e <_JIT_ENTRY+0x12e> + // e7: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0xee <_JIT_ENTRY+0xee> + // 00000000000000ea: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // ee: 48 ff c3 incq %rbx + // f1: f7 dd negl %ebp + // f3: 48 63 c5 movslq %ebp, %rax + // f6: 4d 8d 6c c5 f0 leaq -0x10(%r13,%rax,8), %r13 + // fb: 48 8b 2d 00 00 00 00 movq (%rip), %rbp # 0x102 <_JIT_ENTRY+0x102> + // 00000000000000fe: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 102: eb 15 jmp 0x119 <_JIT_ENTRY+0x119> + // 104: 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 48 ff cb decq %rbx + // 113: 48 83 fb 01 cmpq $0x1, %rbx + // 117: 76 15 jbe 0x12e <_JIT_ENTRY+0x12e> + // 119: 49 8b 4c dd f8 movq -0x8(%r13,%rbx,8), %rcx + // 11e: 8b 01 movl (%rcx), %eax + // 120: 85 c0 testl %eax, %eax + // 122: 78 ec js 0x110 <_JIT_ENTRY+0x110> + // 124: ff c8 decl %eax + // 126: 89 01 movl %eax, (%rcx) + // 128: 75 e6 jne 0x110 <_JIT_ENTRY+0x110> + // 12a: ff d5 callq *%rbp + // 12c: eb e2 jmp 0x110 <_JIT_ENTRY+0x110> + // 12e: 48 85 f6 testq %rsi, %rsi + // 131: 74 19 je 0x14c <_JIT_ENTRY+0x14c> + // 133: 4a 89 34 ff movq %rsi, (%rdi,%r15,8) + // 137: 4e 8d 2c f7 leaq (%rdi,%r14,8), %r13 + // 13b: 4c 8b 74 24 28 movq 0x28(%rsp), %r14 + // 140: 48 83 c4 30 addq $0x30, %rsp + // 144: 5d popq %rbp + // 145: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x14c <_JIT_ENTRY+0x14c> + // 0000000000000148: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 14c: 4e 8d 2c ff leaq (%rdi,%r15,8), %r13 + // 150: 4c 8b 74 24 28 movq 0x28(%rsp), %r14 + // 155: 48 83 c4 30 addq $0x30, %rsp + // 159: 5d popq %rbp + // 15a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x161 <_JIT_ENTRY+0x161> + // 000000000000015d: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[353] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x4c, 0x89, 0x74, + 0x24, 0x28, 0x0f, 0xb7, 0x2d, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x7d, 0xf8, 0x89, 0xe8, 0xf7, + 0xd0, 0x4c, 0x63, 0xf0, 0x4a, 0x8d, 0x04, 0xf5, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x01, 0xe8, 0xb9, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xe9, 0x4c, 0x63, + 0xf9, 0xb9, 0xfd, 0xff, 0xff, 0xff, 0x29, 0xe9, + 0x48, 0x63, 0xd9, 0x49, 0x8b, 0x4c, 0xdd, 0x00, + 0x31, 0xf6, 0x31, 0xd2, 0x4b, 0x83, 0x7c, 0xfd, + 0x00, 0x00, 0x40, 0x0f, 0x95, 0xc6, 0x0f, 0x94, + 0xc2, 0x48, 0x8d, 0x14, 0xd0, 0x48, 0x83, 0xc2, + 0xf8, 0x01, 0xee, 0x2b, 0x77, 0x10, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x63, 0xc6, 0x49, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x49, 0x09, 0xc0, 0x49, 0x89, 0xf9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, 0x24, + 0x40, 0xf8, 0x48, 0x89, 0xc6, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x09, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x7c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x8b, 0x01, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4b, + 0x8b, 0x4c, 0xfd, 0x00, 0x48, 0x85, 0xc9, 0x74, + 0x12, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x47, 0x0f, + 0xb7, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0xc3, 0xf7, 0xdd, 0x48, 0x63, 0xc5, 0x4d, 0x8d, + 0x6c, 0xc5, 0xf0, 0x48, 0x8b, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0xeb, 0x15, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcb, 0x48, 0x83, 0xfb, 0x01, 0x76, + 0x15, 0x49, 0x8b, 0x4c, 0xdd, 0xf8, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0xec, 0xff, 0xc8, 0x89, 0x01, + 0x75, 0xe6, 0xff, 0xd5, 0xeb, 0xe2, 0x48, 0x85, + 0xf6, 0x74, 0x19, 0x4a, 0x89, 0x34, 0xff, 0x4e, + 0x8d, 0x2c, 0xf7, 0x4c, 0x8b, 0x74, 0x24, 0x28, + 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x8d, 0x2c, 0xff, + 0x4c, 0x8b, 0x74, 0x24, 0x28, 0x48, 0x83, 0xc4, + 0x30, 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyObject_Vectorcall+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xea, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xfe, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x148, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x15d, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LEN.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 d1 movslq %ecx, %rdx + // 12: 31 c9 xorl %ecx, %ecx + // 14: 31 f6 xorl %esi, %esi + // 16: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 1c: 0f 94 c2 sete %dl + // 1f: 40 0f 95 c6 setne %sil + // 23: 01 c6 addl %eax, %esi + // 25: 83 fe 01 cmpl $0x1, %esi + // 28: 75 1c jne 0x46 <_JIT_ENTRY+0x46> + // 2a: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 2f: 29 c6 subl %eax, %esi + // 31: 48 63 de movslq %esi, %rbx + // 34: 49 8b 76 10 movq 0x10(%r14), %rsi + // 38: 48 8b b6 38 66 03 00 movq 0x36638(%rsi), %rsi + // 3f: 49 3b 74 dd 00 cmpq (%r13,%rbx,8), %rsi + // 44: 74 0b je 0x51 <_JIT_ENTRY+0x51> + // 46: 48 83 c4 28 addq $0x28, %rsp + // 4a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 51: c1 e0 03 shll $0x3, %eax + // 54: 4c 89 ee movq %r13, %rsi + // 57: 48 29 c6 subq %rax, %rsi + // 5a: 88 d1 movb %dl, %cl + // 5c: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 64: 48 8b 34 06 movq (%rsi,%rax), %rsi + // 68: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6d: 48 89 f1 movq %rsi, %rcx + // 70: ff 15 00 00 00 00 callq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp_PyObject_Size + // 76: 49 8b 7c 24 40 movq 0x40(%r12), %rdi + // 7b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 84: 48 85 c0 testq %rax, %rax + // 87: 78 79 js 0x102 <_JIT_ENTRY+0x102> + // 89: 48 89 c1 movq %rax, %rcx + // 8c: ff 15 00 00 00 00 callq *(%rip) # 0x92 <_JIT_ENTRY+0x92> + // 000000000000008e: IMAGE_REL_AMD64_REL32 __imp_PyLong_FromSsize_t + // 92: 48 85 c0 testq %rax, %rax + // 95: 74 6b je 0x102 <_JIT_ENTRY+0x102> + // 97: 49 89 7c 24 40 movq %rdi, 0x40(%r12) + // 9c: 8b 0e movl (%rsi), %ecx + // 9e: 85 c9 testl %ecx, %ecx + // a0: 78 15 js 0xb7 <_JIT_ENTRY+0xb7> + // a2: ff c9 decl %ecx + // a4: 89 0e movl %ecx, (%rsi) + // a6: 75 0f jne 0xb7 <_JIT_ENTRY+0xb7> + // a8: 48 89 f1 movq %rsi, %rcx + // ab: 48 89 c6 movq %rax, %rsi + // ae: ff 15 00 00 00 00 callq *(%rip) # 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b0: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b4: 48 89 f0 movq %rsi, %rax + // b7: 48 8d 0c dd 00 00 00 00 leaq (,%rbx,8), %rcx + // bf: 49 01 4c 24 40 addq %rcx, 0x40(%r12) + // c4: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // c9: 8b 11 movl (%rcx), %edx + // cb: 85 d2 testl %edx, %edx + // cd: 78 12 js 0xe1 <_JIT_ENTRY+0xe1> + // cf: ff ca decl %edx + // d1: 89 11 movl %edx, (%rcx) + // d3: 75 0c jne 0xe1 <_JIT_ENTRY+0xe1> + // d5: 48 89 c6 movq %rax, %rsi + // d8: ff 15 00 00 00 00 callq *(%rip) # 0xde <_JIT_ENTRY+0xde> + // 00000000000000da: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // de: 48 89 f0 movq %rsi, %rax + // e1: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e6: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ef: 49 89 45 00 movq %rax, (%r13) + // f3: 49 83 c5 08 addq $0x8, %r13 + // f7: 48 83 c4 28 addq $0x28, %rsp + // fb: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x102 <_JIT_ENTRY+0x102> + // 00000000000000fe: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 102: 49 89 fd movq %rdi, %r13 + // 105: 48 83 c4 28 addq $0x28, %rsp + // 109: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x110 <_JIT_ENTRY+0x110> + // 000000000000010c: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[272] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xd1, 0x31, 0xc9, 0x31, 0xf6, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x0f, 0x94, 0xc2, 0x40, + 0x0f, 0x95, 0xc6, 0x01, 0xc6, 0x83, 0xfe, 0x01, + 0x75, 0x1c, 0xbe, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc6, 0x48, 0x63, 0xde, 0x49, 0x8b, 0x76, 0x10, + 0x48, 0x8b, 0xb6, 0x38, 0x66, 0x03, 0x00, 0x49, + 0x3b, 0x74, 0xdd, 0x00, 0x74, 0x0b, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xc1, 0xe0, 0x03, 0x4c, 0x89, 0xee, 0x48, + 0x29, 0xc6, 0x88, 0xd1, 0x48, 0x8d, 0x04, 0xcd, + 0xf8, 0xff, 0xff, 0xff, 0x48, 0x8b, 0x34, 0x06, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x7c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x78, + 0x79, 0x48, 0x89, 0xc1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x6b, 0x49, + 0x89, 0x7c, 0x24, 0x40, 0x8b, 0x0e, 0x85, 0xc9, + 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0e, 0x75, 0x0f, + 0x48, 0x89, 0xf1, 0x48, 0x89, 0xc6, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf0, 0x48, + 0x8d, 0x0c, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x01, 0x4c, 0x24, 0x40, 0x49, 0x8b, 0x4c, 0xdd, + 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x12, 0xff, + 0xca, 0x89, 0x11, 0x75, 0x0c, 0x48, 0x89, 0xc6, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xf0, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0xfd, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: JUMP_TARGET + // 10: &PyObject_Size+0x0 + // 18: &PyLong_FromSsize_t+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyObject_Size); + patch_64(data + 0x18, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb0, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xda, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xfe, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x10c, (uintptr_t)data + 0x2c); +} + +void +emit__CALL_LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_LIST_APPEND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 e8 movq -0x18(%r13), %rsi + // 8: 49 8b 46 10 movq 0x10(%r14), %rax + // c: 48 39 b0 40 66 03 00 cmpq %rsi, 0x36640(%rax) + // 13: 75 11 jne 0x26 <_JIT_ENTRY+0x26> + // 15: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 19: 48 8b 47 08 movq 0x8(%rdi), %rax + // 1d: f6 80 ab 00 00 00 02 testb $0x2, 0xab(%rax) + // 24: 75 0b jne 0x31 <_JIT_ENTRY+0x31> + // 26: 48 83 c4 28 addq $0x28, %rsp + // 2a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 31: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 35: 49 83 c5 f0 addq $-0x10, %r13 + // 39: 48 8b 47 10 movq 0x10(%rdi), %rax + // 3d: 48 39 47 20 cmpq %rax, 0x20(%rdi) + // 41: 7e 1e jle 0x61 <_JIT_ENTRY+0x61> + // 43: 48 8b 4f 18 movq 0x18(%rdi), %rcx + // 47: 48 89 14 c1 movq %rdx, (%rcx,%rax,8) + // 4b: 48 ff c0 incq %rax + // 4e: 48 89 47 10 movq %rax, 0x10(%rdi) + // 52: b3 01 movb $0x1, %bl + // 54: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 59: 8b 07 movl (%rdi), %eax + // 5b: 85 c0 testl %eax, %eax + // 5d: 79 1b jns 0x7a <_JIT_ENTRY+0x7a> + // 5f: eb 28 jmp 0x89 <_JIT_ENTRY+0x89> + // 61: 48 89 f9 movq %rdi, %rcx + // 64: ff 15 00 00 00 00 callq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: IMAGE_REL_AMD64_REL32 __imp__PyList_AppendTakeRefListResize + // 6a: 85 c0 testl %eax, %eax + // 6c: 0f 94 c3 sete %bl + // 6f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 74: 8b 07 movl (%rdi), %eax + // 76: 85 c0 testl %eax, %eax + // 78: 78 0f js 0x89 <_JIT_ENTRY+0x89> + // 7a: ff c8 decl %eax + // 7c: 89 07 movl %eax, (%rdi) + // 7e: 75 09 jne 0x89 <_JIT_ENTRY+0x89> + // 80: 48 89 f9 movq %rdi, %rcx + // 83: ff 15 00 00 00 00 callq *(%rip) # 0x89 <_JIT_ENTRY+0x89> + // 0000000000000085: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 89: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 8f: 8b 06 movl (%rsi), %eax + // 91: 85 c0 testl %eax, %eax + // 93: 78 0f js 0xa4 <_JIT_ENTRY+0xa4> + // 95: ff c8 decl %eax + // 97: 89 06 movl %eax, (%rsi) + // 99: 75 09 jne 0xa4 <_JIT_ENTRY+0xa4> + // 9b: 48 89 f1 movq %rsi, %rcx + // 9e: ff 15 00 00 00 00 callq *(%rip) # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // a4: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b2: 48 83 c4 28 addq $0x28, %rsp + // b6: 84 db testb %bl, %bl + // b8: 74 07 je 0xc1 <_JIT_ENTRY+0xc1> + // ba: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc1 <_JIT_ENTRY+0xc1> + // 00000000000000bd: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // c1: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc8 <_JIT_ENTRY+0xc8> + // 00000000000000c4: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[200] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xe8, + 0x49, 0x8b, 0x46, 0x10, 0x48, 0x39, 0xb0, 0x40, + 0x66, 0x03, 0x00, 0x75, 0x11, 0x49, 0x8b, 0x7d, + 0xf0, 0x48, 0x8b, 0x47, 0x08, 0xf6, 0x80, 0xab, + 0x00, 0x00, 0x00, 0x02, 0x75, 0x0b, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x55, 0xf8, 0x49, 0x83, 0xc5, + 0xf0, 0x48, 0x8b, 0x47, 0x10, 0x48, 0x39, 0x47, + 0x20, 0x7e, 0x1e, 0x48, 0x8b, 0x4f, 0x18, 0x48, + 0x89, 0x14, 0xc1, 0x48, 0xff, 0xc0, 0x48, 0x89, + 0x47, 0x10, 0xb3, 0x01, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x07, 0x85, 0xc0, 0x79, 0x1b, 0xeb, + 0x28, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x94, 0xc3, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x09, + 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0x44, 0x24, 0x40, 0xf8, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, + 0x06, 0x75, 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x84, 0xdb, + 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + // 8: &_PyList_AppendTakeRefListResize+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x8, (uintptr_t)&_PyList_AppendTakeRefListResize); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x85, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc4, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 48 63 f9 movslq %ecx, %rdi + // 13: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 18: 29 c1 subl %eax, %ecx + // 1a: 48 63 d9 movslq %ecx, %rbx + // 1d: 4d 8b 54 dd 00 movq (%r13,%rbx,8), %r10 + // 22: 31 f6 xorl %esi, %esi + // 24: 31 c9 xorl %ecx, %ecx + // 26: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 2c: 41 0f 95 c0 setne %r8b + // 30: 0f 94 c2 sete %dl + // 33: 4d 8b 4a 08 movq 0x8(%r10), %r9 + // 37: 4c 3b 0d 00 00 00 00 cmpq (%rip), %r9 # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: IMAGE_REL_AMD64_REL32 __imp_PyMethodDescr_Type + // 3e: 75 33 jne 0x73 <_JIT_ENTRY+0x73> + // 40: 4d 8b 4a 28 movq 0x28(%r10), %r9 + // 44: 41 81 79 10 80 00 00 00 cmpl $0x80, 0x10(%r9) + // 4c: 75 25 jne 0x73 <_JIT_ENTRY+0x73> + // 4e: 44 8d 1c c5 00 00 00 00 leal (,%rax,8), %r11d + // 56: 4d 89 ef movq %r13, %r15 + // 59: 4d 29 df subq %r11, %r15 + // 5c: 88 d1 movb %dl, %cl + // 5e: 49 8d 14 cf leaq (%r15,%rcx,8), %rdx + // 62: 48 83 c2 f8 addq $-0x8, %rdx + // 66: 48 8b 0a movq (%rdx), %rcx + // 69: 4c 8b 59 08 movq 0x8(%rcx), %r11 + // 6d: 4d 3b 5a 10 cmpq 0x10(%r10), %r11 + // 71: 74 0c je 0x7f <_JIT_ENTRY+0x7f> + // 73: 48 83 c4 30 addq $0x30, %rsp + // 77: 5d popq %rbp + // 78: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 7f: 44 88 c6 movb %r8b, %sil + // 82: 01 f0 addl %esi, %eax + // 84: ff c8 decl %eax + // 86: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8b: 4c 63 c0 movslq %eax, %r8 + // 8e: 48 83 c2 08 addq $0x8, %rdx + // 92: 41 ff 51 08 callq *0x8(%r9) + // 96: 48 89 c6 movq %rax, %rsi + // 99: 49 8b 44 24 40 movq 0x40(%r12), %rax + // 9e: 48 89 44 24 28 movq %rax, 0x28(%rsp) + // a3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ac: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // b1: 8b 01 movl (%rcx), %eax + // b3: 85 c0 testl %eax, %eax + // b5: 78 0c js 0xc3 <_JIT_ENTRY+0xc3> + // b7: ff c8 decl %eax + // b9: 89 01 movl %eax, (%rcx) + // bb: 75 06 jne 0xc3 <_JIT_ENTRY+0xc3> + // bd: ff 15 00 00 00 00 callq *(%rip) # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c3: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // c8: 48 85 c9 testq %rcx, %rcx + // cb: 74 12 je 0xdf <_JIT_ENTRY+0xdf> + // cd: 8b 01 movl (%rcx), %eax + // cf: 85 c0 testl %eax, %eax + // d1: 78 0c js 0xdf <_JIT_ENTRY+0xdf> + // d3: ff c8 decl %eax + // d5: 89 01 movl %eax, (%rcx) + // d7: 75 06 jne 0xdf <_JIT_ENTRY+0xdf> + // d9: ff 15 00 00 00 00 callq *(%rip) # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // df: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // e6: 66 85 c0 testw %ax, %ax + // e9: 74 47 je 0x132 <_JIT_ENTRY+0x132> + // eb: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xf2 <_JIT_ENTRY+0xf2> + // 00000000000000ee: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f2: 48 ff c5 incq %rbp + // f5: 49 83 c5 f8 addq $-0x8, %r13 + // f9: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x100 <_JIT_ENTRY+0x100> + // 00000000000000fc: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 100: eb 1b jmp 0x11d <_JIT_ENTRY+0x11d> + // 102: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 48 ff cd decq %rbp + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fd 01 cmpq $0x1, %rbp + // 11b: 76 15 jbe 0x132 <_JIT_ENTRY+0x132> + // 11d: 49 8b 4d 00 movq (%r13), %rcx + // 121: 8b 01 movl (%rcx), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <_JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 01 movl %eax, (%rcx) + // 12b: 75 e3 jne 0x110 <_JIT_ENTRY+0x110> + // 12d: 41 ff d7 callq *%r15 + // 130: eb de jmp 0x110 <_JIT_ENTRY+0x110> + // 132: 48 85 f6 testq %rsi, %rsi + // 135: 74 19 je 0x150 <_JIT_ENTRY+0x150> + // 137: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 13c: 48 89 34 d8 movq %rsi, (%rax,%rbx,8) + // 140: 4c 8d 2c f8 leaq (%rax,%rdi,8), %r13 + // 144: 48 83 c4 30 addq $0x30, %rsp + // 148: 5d popq %rbp + // 149: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x150 <_JIT_ENTRY+0x150> + // 000000000000014c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 150: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 155: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 159: 48 83 c4 30 addq $0x30, %rsp + // 15d: 5d popq %rbp + // 15e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x165 <_JIT_ENTRY+0x165> + // 0000000000000161: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[357] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x48, 0x63, 0xf9, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xd9, 0x4d, 0x8b, 0x54, + 0xdd, 0x00, 0x31, 0xf6, 0x31, 0xc9, 0x49, 0x83, + 0x7c, 0xfd, 0x00, 0x00, 0x41, 0x0f, 0x95, 0xc0, + 0x0f, 0x94, 0xc2, 0x4d, 0x8b, 0x4a, 0x08, 0x4c, + 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x75, 0x33, + 0x4d, 0x8b, 0x4a, 0x28, 0x41, 0x81, 0x79, 0x10, + 0x80, 0x00, 0x00, 0x00, 0x75, 0x25, 0x44, 0x8d, + 0x1c, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0xef, 0x4d, 0x29, 0xdf, 0x88, 0xd1, 0x49, 0x8d, + 0x14, 0xcf, 0x48, 0x83, 0xc2, 0xf8, 0x48, 0x8b, + 0x0a, 0x4c, 0x8b, 0x59, 0x08, 0x4d, 0x3b, 0x5a, + 0x10, 0x74, 0x0c, 0x48, 0x83, 0xc4, 0x30, 0x5d, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x88, 0xc6, 0x01, 0xf0, 0xff, 0xc8, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x4c, 0x63, 0xc0, 0x48, 0x83, + 0xc2, 0x08, 0x41, 0xff, 0x51, 0x08, 0x48, 0x89, + 0xc6, 0x49, 0x8b, 0x44, 0x24, 0x40, 0x48, 0x89, + 0x44, 0x24, 0x28, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xdd, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xfd, 0x00, + 0x48, 0x85, 0xc9, 0x74, 0x12, 0x8b, 0x01, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, + 0xc0, 0x74, 0x47, 0x0f, 0xb7, 0x2d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0xc5, 0x49, 0x83, 0xc5, + 0xf8, 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0x1b, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x48, + 0x8b, 0x44, 0x24, 0x28, 0x48, 0x89, 0x34, 0xd8, + 0x4c, 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x4c, 0x8d, 0x2c, + 0xd8, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xee, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xfc, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x161, (uintptr_t)data + 0x24); +} + +void +emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 48 63 f9 movslq %ecx, %rdi + // 13: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 18: 29 c1 subl %eax, %ecx + // 1a: 48 63 d9 movslq %ecx, %rbx + // 1d: 4d 8b 54 dd 00 movq (%r13,%rbx,8), %r10 + // 22: 45 31 c0 xorl %r8d, %r8d + // 25: 31 c9 xorl %ecx, %ecx + // 27: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 2d: 41 0f 95 c1 setne %r9b + // 31: 0f 94 c2 sete %dl + // 34: 49 8b 72 08 movq 0x8(%r10), %rsi + // 38: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp_PyMethodDescr_Type + // 3f: 75 32 jne 0x73 <_JIT_ENTRY+0x73> + // 41: 49 8b 72 28 movq 0x28(%r10), %rsi + // 45: 81 7e 10 82 00 00 00 cmpl $0x82, 0x10(%rsi) + // 4c: 75 25 jne 0x73 <_JIT_ENTRY+0x73> + // 4e: 44 8d 1c c5 00 00 00 00 leal (,%rax,8), %r11d + // 56: 4d 89 ef movq %r13, %r15 + // 59: 4d 29 df subq %r11, %r15 + // 5c: 88 d1 movb %dl, %cl + // 5e: 49 8d 14 cf leaq (%r15,%rcx,8), %rdx + // 62: 48 83 c2 f8 addq $-0x8, %rdx + // 66: 48 8b 0a movq (%rdx), %rcx + // 69: 4c 8b 59 08 movq 0x8(%rcx), %r11 + // 6d: 4d 3b 5a 10 cmpq 0x10(%r10), %r11 + // 71: 74 0c je 0x7f <_JIT_ENTRY+0x7f> + // 73: 48 83 c4 30 addq $0x30, %rsp + // 77: 5d popq %rbp + // 78: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 7f: 45 88 c8 movb %r9b, %r8b + // 82: 44 01 c0 addl %r8d, %eax + // 85: ff c8 decl %eax + // 87: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8c: 4c 63 c0 movslq %eax, %r8 + // 8f: 48 83 c2 08 addq $0x8, %rdx + // 93: 45 31 c9 xorl %r9d, %r9d + // 96: ff 56 08 callq *0x8(%rsi) + // 99: 48 89 c6 movq %rax, %rsi + // 9c: 49 8b 44 24 40 movq 0x40(%r12), %rax + // a1: 48 89 44 24 28 movq %rax, 0x28(%rsp) + // a6: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // af: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // b4: 8b 01 movl (%rcx), %eax + // b6: 85 c0 testl %eax, %eax + // b8: 78 0c js 0xc6 <_JIT_ENTRY+0xc6> + // ba: ff c8 decl %eax + // bc: 89 01 movl %eax, (%rcx) + // be: 75 06 jne 0xc6 <_JIT_ENTRY+0xc6> + // c0: ff 15 00 00 00 00 callq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c6: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // cb: 48 85 c9 testq %rcx, %rcx + // ce: 74 12 je 0xe2 <_JIT_ENTRY+0xe2> + // d0: 8b 01 movl (%rcx), %eax + // d2: 85 c0 testl %eax, %eax + // d4: 78 0c js 0xe2 <_JIT_ENTRY+0xe2> + // d6: ff c8 decl %eax + // d8: 89 01 movl %eax, (%rcx) + // da: 75 06 jne 0xe2 <_JIT_ENTRY+0xe2> + // dc: ff 15 00 00 00 00 callq *(%rip) # 0xe2 <_JIT_ENTRY+0xe2> + // 00000000000000de: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // e2: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xe9 <_JIT_ENTRY+0xe9> + // 00000000000000e5: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // e9: 66 85 c0 testw %ax, %ax + // ec: 74 44 je 0x132 <_JIT_ENTRY+0x132> + // ee: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xf5 <_JIT_ENTRY+0xf5> + // 00000000000000f1: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f5: 48 ff c5 incq %rbp + // f8: 49 83 c5 f8 addq $-0x8, %r13 + // fc: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x103 <_JIT_ENTRY+0x103> + // 00000000000000ff: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 103: eb 18 jmp 0x11d <_JIT_ENTRY+0x11d> + // 105: 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // 110: 48 ff cd decq %rbp + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fd 01 cmpq $0x1, %rbp + // 11b: 76 15 jbe 0x132 <_JIT_ENTRY+0x132> + // 11d: 49 8b 4d 00 movq (%r13), %rcx + // 121: 8b 01 movl (%rcx), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <_JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 01 movl %eax, (%rcx) + // 12b: 75 e3 jne 0x110 <_JIT_ENTRY+0x110> + // 12d: 41 ff d7 callq *%r15 + // 130: eb de jmp 0x110 <_JIT_ENTRY+0x110> + // 132: 48 85 f6 testq %rsi, %rsi + // 135: 74 19 je 0x150 <_JIT_ENTRY+0x150> + // 137: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 13c: 48 89 34 d8 movq %rsi, (%rax,%rbx,8) + // 140: 4c 8d 2c f8 leaq (%rax,%rdi,8), %r13 + // 144: 48 83 c4 30 addq $0x30, %rsp + // 148: 5d popq %rbp + // 149: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x150 <_JIT_ENTRY+0x150> + // 000000000000014c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 150: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 155: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 159: 48 83 c4 30 addq $0x30, %rsp + // 15d: 5d popq %rbp + // 15e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x165 <_JIT_ENTRY+0x165> + // 0000000000000161: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[357] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x48, 0x63, 0xf9, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xd9, 0x4d, 0x8b, 0x54, + 0xdd, 0x00, 0x45, 0x31, 0xc0, 0x31, 0xc9, 0x49, + 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x41, 0x0f, 0x95, + 0xc1, 0x0f, 0x94, 0xc2, 0x49, 0x8b, 0x72, 0x08, + 0x48, 0x3b, 0x35, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x32, 0x49, 0x8b, 0x72, 0x28, 0x81, 0x7e, 0x10, + 0x82, 0x00, 0x00, 0x00, 0x75, 0x25, 0x44, 0x8d, + 0x1c, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0xef, 0x4d, 0x29, 0xdf, 0x88, 0xd1, 0x49, 0x8d, + 0x14, 0xcf, 0x48, 0x83, 0xc2, 0xf8, 0x48, 0x8b, + 0x0a, 0x4c, 0x8b, 0x59, 0x08, 0x4d, 0x3b, 0x5a, + 0x10, 0x74, 0x0c, 0x48, 0x83, 0xc4, 0x30, 0x5d, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x88, 0xc8, 0x44, 0x01, 0xc0, 0xff, 0xc8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x63, 0xc0, 0x48, + 0x83, 0xc2, 0x08, 0x45, 0x31, 0xc9, 0xff, 0x56, + 0x08, 0x48, 0x89, 0xc6, 0x49, 0x8b, 0x44, 0x24, + 0x40, 0x48, 0x89, 0x44, 0x24, 0x28, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x4c, 0xdd, 0x00, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x4c, 0xfd, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x12, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x85, 0xc0, 0x74, 0x44, 0x0f, 0xb7, + 0x2d, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xc5, + 0x49, 0x83, 0xc5, 0xf8, 0x4c, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0xeb, 0x18, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x48, + 0x8b, 0x44, 0x24, 0x28, 0x48, 0x89, 0x34, 0xd8, + 0x4c, 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x4c, 0x8d, 0x2c, + 0xd8, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe5, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf1, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xff, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x161, (uintptr_t)data + 0x24); +} + +void +emit__CALL_METHOD_DESCRIPTOR_NOARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_NOARGS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 d1 movslq %ecx, %rdx + // 12: 31 c9 xorl %ecx, %ecx + // 14: 31 f6 xorl %esi, %esi + // 16: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 1c: 0f 94 c2 sete %dl + // 1f: 40 0f 95 c6 setne %sil + // 23: 01 c6 addl %eax, %esi + // 25: 83 fe 01 cmpl $0x1, %esi + // 28: 0f 85 ee 00 00 00 jne 0x11c <_JIT_ENTRY+0x11c> + // 2e: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 33: 29 c6 subl %eax, %esi + // 35: 48 63 de movslq %esi, %rbx + // 38: 49 8b 7c dd 00 movq (%r13,%rbx,8), %rdi + // 3d: 48 8b 77 08 movq 0x8(%rdi), %rsi + // 41: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: IMAGE_REL_AMD64_REL32 __imp_PyMethodDescr_Type + // 48: 0f 85 ce 00 00 00 jne 0x11c <_JIT_ENTRY+0x11c> + // 4e: c1 e0 03 shll $0x3, %eax + // 51: 4c 89 ee movq %r13, %rsi + // 54: 48 29 c6 subq %rax, %rsi + // 57: 88 d1 movb %dl, %cl + // 59: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 61: 48 8b 34 06 movq (%rsi,%rax), %rsi + // 65: 48 8b 46 08 movq 0x8(%rsi), %rax + // 69: 48 3b 47 10 cmpq 0x10(%rdi), %rax + // 6d: 0f 85 a9 00 00 00 jne 0x11c <_JIT_ENTRY+0x11c> + // 73: 48 8b 47 28 movq 0x28(%rdi), %rax + // 77: 83 78 10 04 cmpl $0x4, 0x10(%rax) + // 7b: 0f 85 9b 00 00 00 jne 0x11c <_JIT_ENTRY+0x11c> + // 81: 41 8b 4e 34 movl 0x34(%r14), %ecx + // 85: 85 c9 testl %ecx, %ecx + // 87: 0f 8e 8f 00 00 00 jle 0x11c <_JIT_ENTRY+0x11c> + // 8d: 48 8b 40 08 movq 0x8(%rax), %rax + // 91: ff c9 decl %ecx + // 93: 41 89 4e 34 movl %ecx, 0x34(%r14) + // 97: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9c: 48 89 f1 movq %rsi, %rcx + // 9f: 31 d2 xorl %edx, %edx + // a1: ff d0 callq *%rax + // a3: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // a8: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b1: 41 ff 46 34 incl 0x34(%r14) + // b5: 48 89 c7 movq %rax, %rdi + // b8: 49 89 4c 24 40 movq %rcx, 0x40(%r12) + // bd: 8b 06 movl (%rsi), %eax + // bf: 85 c0 testl %eax, %eax + // c1: 78 0f js 0xd2 <_JIT_ENTRY+0xd2> + // c3: ff c8 decl %eax + // c5: 89 06 movl %eax, (%rsi) + // c7: 75 09 jne 0xd2 <_JIT_ENTRY+0xd2> + // c9: 48 89 f1 movq %rsi, %rcx + // cc: ff 15 00 00 00 00 callq *(%rip) # 0xd2 <_JIT_ENTRY+0xd2> + // 00000000000000ce: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // d2: 48 8d 04 dd 00 00 00 00 leaq (,%rbx,8), %rax + // da: 49 01 44 24 40 addq %rax, 0x40(%r12) + // df: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // e4: 8b 01 movl (%rcx), %eax + // e6: 85 c0 testl %eax, %eax + // e8: 78 0c js 0xf6 <_JIT_ENTRY+0xf6> + // ea: ff c8 decl %eax + // ec: 89 01 movl %eax, (%rcx) + // ee: 75 06 jne 0xf6 <_JIT_ENTRY+0xf6> + // f0: ff 15 00 00 00 00 callq *(%rip) # 0xf6 <_JIT_ENTRY+0xf6> + // 00000000000000f2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // f6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // fb: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 104: 48 85 ff testq %rdi, %rdi + // 107: 74 1e je 0x127 <_JIT_ENTRY+0x127> + // 109: 49 89 7d 00 movq %rdi, (%r13) + // 10d: 49 83 c5 08 addq $0x8, %r13 + // 111: 48 83 c4 28 addq $0x28, %rsp + // 115: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x11c <_JIT_ENTRY+0x11c> + // 0000000000000118: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 11c: 48 83 c4 28 addq $0x28, %rsp + // 120: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x127 <_JIT_ENTRY+0x127> + // 0000000000000123: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 127: 48 83 c4 28 addq $0x28, %rsp + // 12b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x132 <_JIT_ENTRY+0x132> + // 000000000000012e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[306] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xd1, 0x31, 0xc9, 0x31, 0xf6, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x0f, 0x94, 0xc2, 0x40, + 0x0f, 0x95, 0xc6, 0x01, 0xc6, 0x83, 0xfe, 0x01, + 0x0f, 0x85, 0xee, 0x00, 0x00, 0x00, 0xbe, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc6, 0x48, 0x63, 0xde, + 0x49, 0x8b, 0x7c, 0xdd, 0x00, 0x48, 0x8b, 0x77, + 0x08, 0x48, 0x3b, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xce, 0x00, 0x00, 0x00, 0xc1, 0xe0, + 0x03, 0x4c, 0x89, 0xee, 0x48, 0x29, 0xc6, 0x88, + 0xd1, 0x48, 0x8d, 0x04, 0xcd, 0xf8, 0xff, 0xff, + 0xff, 0x48, 0x8b, 0x34, 0x06, 0x48, 0x8b, 0x46, + 0x08, 0x48, 0x3b, 0x47, 0x10, 0x0f, 0x85, 0xa9, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x47, 0x28, 0x83, + 0x78, 0x10, 0x04, 0x0f, 0x85, 0x9b, 0x00, 0x00, + 0x00, 0x41, 0x8b, 0x4e, 0x34, 0x85, 0xc9, 0x0f, + 0x8e, 0x8f, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x40, + 0x08, 0xff, 0xc9, 0x41, 0x89, 0x4e, 0x34, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0x31, + 0xd2, 0xff, 0xd0, 0x49, 0x8b, 0x4c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x41, 0xff, 0x46, 0x34, 0x48, 0x89, 0xc7, + 0x49, 0x89, 0x4c, 0x24, 0x40, 0x8b, 0x06, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x06, 0x75, + 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x04, 0xdd, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x01, 0x44, 0x24, 0x40, 0x49, + 0x8b, 0x4c, 0xdd, 0x00, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xff, 0x74, + 0x1e, 0x49, 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xce, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xf2, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x118, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x123, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x12e, (uintptr_t)data + 0x24); +} + +void +emit__CALL_METHOD_DESCRIPTOR_O( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_METHOD_DESCRIPTOR_O.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 89 c1 movl %eax, %ecx + // e: f7 d1 notl %ecx + // 10: 48 63 f9 movslq %ecx, %rdi + // 13: 31 f6 xorl %esi, %esi + // 15: 31 c9 xorl %ecx, %ecx + // 17: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 1d: 40 0f 95 c6 setne %sil + // 21: 0f 94 c2 sete %dl + // 24: 01 c6 addl %eax, %esi + // 26: 83 fe 02 cmpl $0x2, %esi + // 29: 75 51 jne 0x7c <_JIT_ENTRY+0x7c> + // 2b: be fe ff ff ff movl $0xfffffffe, %esi # imm = 0xFFFFFFFE + // 30: 29 c6 subl %eax, %esi + // 32: 48 63 de movslq %esi, %rbx + // 35: 49 8b 74 dd 00 movq (%r13,%rbx,8), %rsi + // 3a: 4c 8b 46 08 movq 0x8(%rsi), %r8 + // 3e: 4c 3b 05 00 00 00 00 cmpq (%rip), %r8 # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp_PyMethodDescr_Type + // 45: 75 35 jne 0x7c <_JIT_ENTRY+0x7c> + // 47: 4c 8b 46 28 movq 0x28(%rsi), %r8 + // 4b: 41 83 78 10 08 cmpl $0x8, 0x10(%r8) + // 50: 75 2a jne 0x7c <_JIT_ENTRY+0x7c> + // 52: 45 8b 4e 34 movl 0x34(%r14), %r9d + // 56: 45 85 c9 testl %r9d, %r9d + // 59: 7e 21 jle 0x7c <_JIT_ENTRY+0x7c> + // 5b: c1 e0 03 shll $0x3, %eax + // 5e: 4d 89 ea movq %r13, %r10 + // 61: 49 29 c2 subq %rax, %r10 + // 64: 88 d1 movb %dl, %cl + // 66: 48 8d 04 cd f8 ff ff ff leaq -0x8(,%rcx,8), %rax + // 6e: 49 8b 0c 02 movq (%r10,%rax), %rcx + // 72: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 76: 48 3b 56 10 cmpq 0x10(%rsi), %rdx + // 7a: 74 0c je 0x88 <_JIT_ENTRY+0x88> + // 7c: 48 83 c4 30 addq $0x30, %rsp + // 80: 5d popq %rbp + // 81: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 88: 49 8b 54 02 08 movq 0x8(%r10,%rax), %rdx + // 8d: 49 8b 40 08 movq 0x8(%r8), %rax + // 91: 41 ff c9 decl %r9d + // 94: 45 89 4e 34 movl %r9d, 0x34(%r14) + // 98: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9d: ff d0 callq *%rax + // 9f: 49 8b 4c 24 40 movq 0x40(%r12), %rcx + // a4: 48 89 4c 24 28 movq %rcx, 0x28(%rsp) + // a9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b2: 41 ff 46 34 incl 0x34(%r14) + // b6: 48 89 c6 movq %rax, %rsi + // b9: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // be: 8b 01 movl (%rcx), %eax + // c0: 85 c0 testl %eax, %eax + // c2: 78 0c js 0xd0 <_JIT_ENTRY+0xd0> + // c4: ff c8 decl %eax + // c6: 89 01 movl %eax, (%rcx) + // c8: 75 06 jne 0xd0 <_JIT_ENTRY+0xd0> + // ca: ff 15 00 00 00 00 callq *(%rip) # 0xd0 <_JIT_ENTRY+0xd0> + // 00000000000000cc: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // d0: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // d5: 48 85 c9 testq %rcx, %rcx + // d8: 74 12 je 0xec <_JIT_ENTRY+0xec> + // da: 8b 01 movl (%rcx), %eax + // dc: 85 c0 testl %eax, %eax + // de: 78 0c js 0xec <_JIT_ENTRY+0xec> + // e0: ff c8 decl %eax + // e2: 89 01 movl %eax, (%rcx) + // e4: 75 06 jne 0xec <_JIT_ENTRY+0xec> + // e6: ff 15 00 00 00 00 callq *(%rip) # 0xec <_JIT_ENTRY+0xec> + // 00000000000000e8: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ec: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xf3 <_JIT_ENTRY+0xf3> + // 00000000000000ef: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f3: 66 85 c0 testw %ax, %ax + // f6: 74 3a je 0x132 <_JIT_ENTRY+0x132> + // f8: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xff <_JIT_ENTRY+0xff> + // 00000000000000fb: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // ff: 48 ff c5 incq %rbp + // 102: 49 83 c5 f8 addq $-0x8, %r13 + // 106: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0x10d <_JIT_ENTRY+0x10d> + // 0000000000000109: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 10d: eb 0e jmp 0x11d <_JIT_ENTRY+0x11d> + // 10f: 90 nop + // 110: 48 ff cd decq %rbp + // 113: 49 83 c5 f8 addq $-0x8, %r13 + // 117: 48 83 fd 01 cmpq $0x1, %rbp + // 11b: 76 15 jbe 0x132 <_JIT_ENTRY+0x132> + // 11d: 49 8b 4d 00 movq (%r13), %rcx + // 121: 8b 01 movl (%rcx), %eax + // 123: 85 c0 testl %eax, %eax + // 125: 78 e9 js 0x110 <_JIT_ENTRY+0x110> + // 127: ff c8 decl %eax + // 129: 89 01 movl %eax, (%rcx) + // 12b: 75 e3 jne 0x110 <_JIT_ENTRY+0x110> + // 12d: 41 ff d7 callq *%r15 + // 130: eb de jmp 0x110 <_JIT_ENTRY+0x110> + // 132: 48 85 f6 testq %rsi, %rsi + // 135: 74 19 je 0x150 <_JIT_ENTRY+0x150> + // 137: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 13c: 48 89 34 d8 movq %rsi, (%rax,%rbx,8) + // 140: 4c 8d 2c f8 leaq (%rax,%rdi,8), %r13 + // 144: 48 83 c4 30 addq $0x30, %rsp + // 148: 5d popq %rbp + // 149: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x150 <_JIT_ENTRY+0x150> + // 000000000000014c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 150: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // 155: 4c 8d 2c d8 leaq (%rax,%rbx,8), %r13 + // 159: 48 83 c4 30 addq $0x30, %rsp + // 15d: 5d popq %rbp + // 15e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x165 <_JIT_ENTRY+0x165> + // 0000000000000161: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[357] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x0f, 0xb7, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, + 0x48, 0x63, 0xf9, 0x31, 0xf6, 0x31, 0xc9, 0x49, + 0x83, 0x7c, 0xfd, 0x00, 0x00, 0x40, 0x0f, 0x95, + 0xc6, 0x0f, 0x94, 0xc2, 0x01, 0xc6, 0x83, 0xfe, + 0x02, 0x75, 0x51, 0xbe, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc6, 0x48, 0x63, 0xde, 0x49, 0x8b, 0x74, + 0xdd, 0x00, 0x4c, 0x8b, 0x46, 0x08, 0x4c, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, 0x35, 0x4c, + 0x8b, 0x46, 0x28, 0x41, 0x83, 0x78, 0x10, 0x08, + 0x75, 0x2a, 0x45, 0x8b, 0x4e, 0x34, 0x45, 0x85, + 0xc9, 0x7e, 0x21, 0xc1, 0xe0, 0x03, 0x4d, 0x89, + 0xea, 0x49, 0x29, 0xc2, 0x88, 0xd1, 0x48, 0x8d, + 0x04, 0xcd, 0xf8, 0xff, 0xff, 0xff, 0x49, 0x8b, + 0x0c, 0x02, 0x48, 0x8b, 0x51, 0x08, 0x48, 0x3b, + 0x56, 0x10, 0x74, 0x0c, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x54, 0x02, 0x08, 0x49, 0x8b, 0x40, + 0x08, 0x41, 0xff, 0xc9, 0x45, 0x89, 0x4e, 0x34, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0xd0, 0x49, + 0x8b, 0x4c, 0x24, 0x40, 0x48, 0x89, 0x4c, 0x24, + 0x28, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x41, 0xff, 0x46, 0x34, 0x48, 0x89, + 0xc6, 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x4c, 0xfd, 0x00, 0x48, 0x85, 0xc9, + 0x74, 0x12, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, 0x3a, + 0x0f, 0xb7, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xff, 0xc5, 0x49, 0x83, 0xc5, 0xf8, 0x4c, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x0e, 0x90, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x48, + 0x8b, 0x44, 0x24, 0x28, 0x48, 0x89, 0x34, 0xd8, + 0x4c, 0x8d, 0x2c, 0xf8, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x4c, 0x8d, 0x2c, + 0xd8, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethodDescr_Type+0x0 + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethodDescr_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xcc, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe8, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xef, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x109, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x161, (uintptr_t)data + 0x24); +} + +void +emit__CALL_NON_PY_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_NON_PY_GENERAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 4c 89 74 24 28 movq %r14, 0x28(%rsp) + // a: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 11: 8d 0c c5 00 00 00 00 leal (,%rax,8), %ecx + // 18: 4c 89 ea movq %r13, %rdx + // 1b: 48 29 ca subq %rcx, %rdx + // 1e: 89 c1 movl %eax, %ecx + // 20: f7 d1 notl %ecx + // 22: 48 63 f9 movslq %ecx, %rdi + // 25: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 2a: 29 c1 subl %eax, %ecx + // 2c: 48 63 d9 movslq %ecx, %rbx + // 2f: 31 f6 xorl %esi, %esi + // 31: 45 31 c0 xorl %r8d, %r8d + // 34: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 3a: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // 3f: 40 0f 95 c6 setne %sil + // 43: 41 0f 94 c0 sete %r8b + // 47: 4a 8d 14 c2 leaq (%rdx,%r8,8), %rdx + // 4b: 48 83 c2 f8 addq $-0x8, %rdx + // 4f: 01 c6 addl %eax, %esi + // 51: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 56: 49 b8 00 00 00 00 00 00 00 80 movabsq $-0x8000000000000000, %r8 # imm = 0x8000000000000000 + // 60: 49 09 f0 orq %rsi, %r8 + // 63: 45 31 c9 xorl %r9d, %r9d + // 66: ff 15 00 00 00 00 callq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: IMAGE_REL_AMD64_REL32 __imp_PyObject_Vectorcall + // 6c: 48 89 c6 movq %rax, %rsi + // 6f: 4d 8b 74 24 40 movq 0x40(%r12), %r14 + // 74: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7d: 49 8b 4c dd 00 movq (%r13,%rbx,8), %rcx + // 82: 8b 01 movl (%rcx), %eax + // 84: 85 c0 testl %eax, %eax + // 86: 78 0c js 0x94 <_JIT_ENTRY+0x94> + // 88: ff c8 decl %eax + // 8a: 89 01 movl %eax, (%rcx) + // 8c: 75 06 jne 0x94 <_JIT_ENTRY+0x94> + // 8e: ff 15 00 00 00 00 callq *(%rip) # 0x94 <_JIT_ENTRY+0x94> + // 0000000000000090: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 94: 49 8b 4c fd 00 movq (%r13,%rdi,8), %rcx + // 99: 48 85 c9 testq %rcx, %rcx + // 9c: 74 12 je 0xb0 <_JIT_ENTRY+0xb0> + // 9e: 8b 01 movl (%rcx), %eax + // a0: 85 c0 testl %eax, %eax + // a2: 78 0c js 0xb0 <_JIT_ENTRY+0xb0> + // a4: ff c8 decl %eax + // a6: 89 01 movl %eax, (%rcx) + // a8: 75 06 jne 0xb0 <_JIT_ENTRY+0xb0> + // aa: ff 15 00 00 00 00 callq *(%rip) # 0xb0 <_JIT_ENTRY+0xb0> + // 00000000000000ac: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xb7 <_JIT_ENTRY+0xb7> + // 00000000000000b3: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b7: 66 85 c0 testw %ax, %ax + // ba: 74 46 je 0x102 <_JIT_ENTRY+0x102> + // bc: 0f b7 2d 00 00 00 00 movzwl (%rip), %ebp # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c3: 48 ff c5 incq %rbp + // c6: 49 83 c5 f8 addq $-0x8, %r13 + // ca: 4c 8b 3d 00 00 00 00 movq (%rip), %r15 # 0xd1 <_JIT_ENTRY+0xd1> + // 00000000000000cd: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // d1: eb 1a jmp 0xed <_JIT_ENTRY+0xed> + // d3: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // e0: 48 ff cd decq %rbp + // e3: 49 83 c5 f8 addq $-0x8, %r13 + // e7: 48 83 fd 01 cmpq $0x1, %rbp + // eb: 76 15 jbe 0x102 <_JIT_ENTRY+0x102> + // ed: 49 8b 4d 00 movq (%r13), %rcx + // f1: 8b 01 movl (%rcx), %eax + // f3: 85 c0 testl %eax, %eax + // f5: 78 e9 js 0xe0 <_JIT_ENTRY+0xe0> + // f7: ff c8 decl %eax + // f9: 89 01 movl %eax, (%rcx) + // fb: 75 e3 jne 0xe0 <_JIT_ENTRY+0xe0> + // fd: 41 ff d7 callq *%r15 + // 100: eb de jmp 0xe0 <_JIT_ENTRY+0xe0> + // 102: 48 85 f6 testq %rsi, %rsi + // 105: 74 19 je 0x120 <_JIT_ENTRY+0x120> + // 107: 49 89 34 de movq %rsi, (%r14,%rbx,8) + // 10b: 4d 8d 2c fe leaq (%r14,%rdi,8), %r13 + // 10f: 4c 8b 74 24 28 movq 0x28(%rsp), %r14 + // 114: 48 83 c4 30 addq $0x30, %rsp + // 118: 5d popq %rbp + // 119: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x120 <_JIT_ENTRY+0x120> + // 000000000000011c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 120: 4d 8d 2c de leaq (%r14,%rbx,8), %r13 + // 124: 4c 8b 74 24 28 movq 0x28(%rsp), %r14 + // 129: 48 83 c4 30 addq $0x30, %rsp + // 12d: 5d popq %rbp + // 12e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x135 <_JIT_ENTRY+0x135> + // 0000000000000131: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[309] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x4c, 0x89, 0x74, + 0x24, 0x28, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x8d, 0x0c, 0xc5, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xea, 0x48, 0x29, 0xca, 0x89, 0xc1, + 0xf7, 0xd1, 0x48, 0x63, 0xf9, 0xb9, 0xfe, 0xff, + 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xd9, 0x31, + 0xf6, 0x45, 0x31, 0xc0, 0x49, 0x83, 0x7c, 0xfd, + 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xdd, 0x00, 0x40, + 0x0f, 0x95, 0xc6, 0x41, 0x0f, 0x94, 0xc0, 0x4a, + 0x8d, 0x14, 0xc2, 0x48, 0x83, 0xc2, 0xf8, 0x01, + 0xc6, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0xb8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x49, 0x09, 0xf0, 0x45, 0x31, 0xc9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc6, 0x4d, + 0x8b, 0x74, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, + 0xdd, 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, + 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xfd, + 0x00, 0x48, 0x85, 0xc9, 0x74, 0x12, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x46, 0x0f, 0xb7, 0x2d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xff, 0xc5, 0x49, 0x83, + 0xc5, 0xf8, 0x4c, 0x8b, 0x3d, 0x00, 0x00, 0x00, + 0x00, 0xeb, 0x1a, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xcd, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xfd, 0x01, 0x76, 0x15, 0x49, 0x8b, 0x4d, + 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0xe9, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0xe3, 0x41, 0xff, 0xd7, + 0xeb, 0xde, 0x48, 0x85, 0xf6, 0x74, 0x19, 0x49, + 0x89, 0x34, 0xde, 0x4d, 0x8d, 0x2c, 0xfe, 0x4c, + 0x8b, 0x74, 0x24, 0x28, 0x48, 0x83, 0xc4, 0x30, + 0x5d, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8d, 0x2c, 0xde, 0x4c, 0x8b, 0x74, 0x24, + 0x28, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_Vectorcall+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x90, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xac, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xcd, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x11c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x131, (uintptr_t)data + 0x1c); +} + +void +emit__CALL_STR_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_STR_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 9: 75 0d jne 0x18 <_JIT_ENTRY+0x18> + // b: 49 8b 45 e8 movq -0x18(%r13), %rax + // f: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Type + // 16: 74 0b je 0x23 <_JIT_ENTRY+0x23> + // 18: 48 83 c4 28 addq $0x28, %rsp + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 23: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 48 89 f1 movq %rsi, %rcx + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: IMAGE_REL_AMD64_REL32 __imp_PyObject_Str + // 35: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 3b: 8b 0e movl (%rsi), %ecx + // 3d: 85 c9 testl %ecx, %ecx + // 3f: 78 15 js 0x56 <_JIT_ENTRY+0x56> + // 41: ff c9 decl %ecx + // 43: 89 0e movl %ecx, (%rsi) + // 45: 75 0f jne 0x56 <_JIT_ENTRY+0x56> + // 47: 48 89 f1 movq %rsi, %rcx + // 4a: 48 89 c6 movq %rax, %rsi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 53: 48 89 f0 movq %rsi, %rax + // 56: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 64: 48 85 c0 testq %rax, %rax + // 67: 74 13 je 0x7c <_JIT_ENTRY+0x7c> + // 69: 49 89 45 00 movq %rax, (%r13) + // 6d: 49 83 c5 08 addq $0x8, %r13 + // 71: 48 83 c4 28 addq $0x28, %rsp + // 75: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7c: 48 83 c4 28 addq $0x28, %rsp + // 80: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[135] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x83, 0x7d, 0xf0, + 0x00, 0x75, 0x0d, 0x49, 0x8b, 0x45, 0xe8, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0b, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xe8, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x15, 0xff, 0xc9, 0x89, 0x0e, 0x75, 0x0f, 0x48, + 0x89, 0xf1, 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf0, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x13, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: JUMP_TARGET + // 10: &PyObject_Str+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyObject_Str); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + 0x24); +} + +void +emit__CALL_TUPLE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TUPLE_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 9: 75 0d jne 0x18 <_JIT_ENTRY+0x18> + // b: 49 8b 45 e8 movq -0x18(%r13), %rax + // f: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyTuple_Type + // 16: 74 0b je 0x23 <_JIT_ENTRY+0x23> + // 18: 48 83 c4 28 addq $0x28, %rsp + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 23: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 48 89 f1 movq %rsi, %rcx + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: IMAGE_REL_AMD64_REL32 __imp_PySequence_Tuple + // 35: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 3b: 8b 0e movl (%rsi), %ecx + // 3d: 85 c9 testl %ecx, %ecx + // 3f: 78 15 js 0x56 <_JIT_ENTRY+0x56> + // 41: ff c9 decl %ecx + // 43: 89 0e movl %ecx, (%rsi) + // 45: 75 0f jne 0x56 <_JIT_ENTRY+0x56> + // 47: 48 89 f1 movq %rsi, %rcx + // 4a: 48 89 c6 movq %rax, %rsi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 53: 48 89 f0 movq %rsi, %rax + // 56: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 64: 48 85 c0 testq %rax, %rax + // 67: 74 13 je 0x7c <_JIT_ENTRY+0x7c> + // 69: 49 89 45 00 movq %rax, (%r13) + // 6d: 49 83 c5 08 addq $0x8, %r13 + // 71: 48 83 c4 28 addq $0x28, %rsp + // 75: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7c: 48 83 c4 28 addq $0x28, %rsp + // 80: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[135] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x83, 0x7d, 0xf0, + 0x00, 0x75, 0x0d, 0x49, 0x8b, 0x45, 0xe8, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0b, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xe8, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x15, 0xff, 0xc9, 0x89, 0x0e, 0x75, 0x0f, 0x48, + 0x89, 0xf1, 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf0, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x13, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: JUMP_TARGET + // 10: &PySequence_Tuple+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + 0x24); +} + +void +emit__CALL_TYPE_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CALL_TYPE_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 83 7d f0 00 cmpq $0x0, -0x10(%r13) + // 9: 75 0d jne 0x18 <_JIT_ENTRY+0x18> + // b: 49 8b 45 e8 movq -0x18(%r13), %rax + // f: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyType_Type + // 16: 74 0b je 0x23 <_JIT_ENTRY+0x23> + // 18: 48 83 c4 28 addq $0x28, %rsp + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 23: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 27: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 2b: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2f: 8b 32 movl (%rdx), %esi + // 31: 85 f6 testl %esi, %esi + // 33: 78 04 js 0x39 <_JIT_ENTRY+0x39> + // 35: ff c6 incl %esi + // 37: 89 32 movl %esi, (%rdx) + // 39: 49 89 55 e8 movq %rdx, -0x18(%r13) + // 3d: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 42: 8b 01 movl (%rcx), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 06 js 0x4e <_JIT_ENTRY+0x4e> + // 48: ff c8 decl %eax + // 4a: 89 01 movl %eax, (%rcx) + // 4c: 74 19 je 0x67 <_JIT_ENTRY+0x67> + // 4e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 53: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5c: 48 83 c4 28 addq $0x28, %rsp + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 67: ff 15 00 00 00 00 callq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 72: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 7b: 48 83 c4 28 addq $0x28, %rsp + // 7f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[127] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x83, 0x7d, 0xf0, + 0x00, 0x75, 0x0d, 0x49, 0x8b, 0x45, 0xe8, 0x48, + 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0b, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4d, 0xf8, 0x49, + 0x8d, 0x45, 0xf0, 0x48, 0x8b, 0x51, 0x08, 0x8b, + 0x32, 0x85, 0xf6, 0x78, 0x04, 0xff, 0xc6, 0x89, + 0x32, 0x49, 0x89, 0x55, 0xe8, 0x49, 0x89, 0x44, + 0x24, 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &PyType_Type+0x0 + // 8: JUMP_TARGET + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyType_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x14); +} + +void +emit__CHECK_AND_ALLOCATE_OBJECT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_AND_ALLOCATE_OBJECT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 89 c1 movl %eax, %ecx + // d: f7 d1 notl %ecx + // f: 48 63 f9 movslq %ecx, %rdi + // 12: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 18: 0f 85 db 00 00 00 jne 0xf9 <_JIT_ENTRY+0xf9> + // 1e: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 23: 29 c1 subl %eax, %ecx + // 25: 48 63 f1 movslq %ecx, %rsi + // 28: 49 8b 4c f5 00 movq (%r13,%rsi,8), %rcx + // 2d: 48 8b 41 08 movq 0x8(%rcx), %rax + // 31: 83 b8 a8 00 00 00 00 cmpl $0x0, 0xa8(%rax) + // 38: 0f 89 bb 00 00 00 jns 0xf9 <_JIT_ENTRY+0xf9> + // 3e: 8b 81 80 01 00 00 movl 0x180(%rcx), %eax + // 44: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 4a: 0f 85 a9 00 00 00 jne 0xf9 <_JIT_ENTRY+0xf9> + // 50: 49 8b 86 e8 00 00 00 movq 0xe8(%r14), %rax + // 57: 48 85 c0 testq %rax, %rax + // 5a: 0f 84 99 00 00 00 je 0xf9 <_JIT_ENTRY+0xf9> + // 60: 48 8b 99 a0 03 00 00 movq 0x3a0(%rcx), %rbx + // 67: 48 8b 53 30 movq 0x30(%rbx), %rdx + // 6b: 48 63 52 4c movslq 0x4c(%rdx), %rdx + // 6f: 4c 8b 05 00 00 00 00 movq (%rip), %r8 # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp__Py_InitCleanup + // 76: 4d 63 40 4c movslq 0x4c(%r8), %r8 + // 7a: 49 01 d0 addq %rdx, %r8 + // 7d: 49 8b 96 f0 00 00 00 movq 0xf0(%r14), %rdx + // 84: 48 29 c2 subq %rax, %rdx + // 87: 48 c1 fa 03 sarq $0x3, %rdx + // 8b: 4c 39 c2 cmpq %r8, %rdx + // 8e: 7e 69 jle 0xf9 <_JIT_ENTRY+0xf9> + // 90: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 95: 31 d2 xorl %edx, %edx + // 97: ff 15 00 00 00 00 callq *(%rip) # 0x9d <_JIT_ENTRY+0x9d> + // 0000000000000099: IMAGE_REL_AMD64_REL32 __imp_PyType_GenericAlloc + // 9d: 49 8b 54 24 40 movq 0x40(%r12), %rdx + // a2: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ab: 48 85 c0 testq %rax, %rax + // ae: 74 54 je 0x104 <_JIT_ENTRY+0x104> + // b0: 49 89 44 fd 00 movq %rax, (%r13,%rdi,8) + // b5: 49 8b 4c f5 00 movq (%r13,%rsi,8), %rcx + // ba: 8b 03 movl (%rbx), %eax + // bc: 85 c0 testl %eax, %eax + // be: 78 04 js 0xc4 <_JIT_ENTRY+0xc4> + // c0: ff c0 incl %eax + // c2: 89 03 movl %eax, (%rbx) + // c4: 49 89 5c f5 00 movq %rbx, (%r13,%rsi,8) + // c9: 49 89 54 24 40 movq %rdx, 0x40(%r12) + // ce: 8b 01 movl (%rcx), %eax + // d0: 85 c0 testl %eax, %eax + // d2: 78 0c js 0xe0 <_JIT_ENTRY+0xe0> + // d4: ff c8 decl %eax + // d6: 89 01 movl %eax, (%rcx) + // d8: 75 06 jne 0xe0 <_JIT_ENTRY+0xe0> + // da: ff 15 00 00 00 00 callq *(%rip) # 0xe0 <_JIT_ENTRY+0xe0> + // 00000000000000dc: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // e0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ee: 48 83 c4 28 addq $0x28, %rsp + // f2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf9 <_JIT_ENTRY+0xf9> + // 00000000000000f5: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // f9: 48 83 c4 28 addq $0x28, %rsp + // fd: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x104 <_JIT_ENTRY+0x104> + // 0000000000000100: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 104: 49 89 d5 movq %rdx, %r13 + // 107: 48 83 c4 28 addq $0x28, %rsp + // 10b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x112 <_JIT_ENTRY+0x112> + // 000000000000010e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[274] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xc1, 0xf7, 0xd1, 0x48, + 0x63, 0xf9, 0x49, 0x83, 0x7c, 0xfd, 0x00, 0x00, + 0x0f, 0x85, 0xdb, 0x00, 0x00, 0x00, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xf1, + 0x49, 0x8b, 0x4c, 0xf5, 0x00, 0x48, 0x8b, 0x41, + 0x08, 0x83, 0xb8, 0xa8, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x89, 0xbb, 0x00, 0x00, 0x00, 0x8b, 0x81, + 0x80, 0x01, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x85, 0xa9, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x0f, 0x84, 0x99, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x99, 0xa0, 0x03, 0x00, 0x00, 0x48, + 0x8b, 0x53, 0x30, 0x48, 0x63, 0x52, 0x4c, 0x4c, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x63, + 0x40, 0x4c, 0x49, 0x01, 0xd0, 0x49, 0x8b, 0x96, + 0xf0, 0x00, 0x00, 0x00, 0x48, 0x29, 0xc2, 0x48, + 0xc1, 0xfa, 0x03, 0x4c, 0x39, 0xc2, 0x7e, 0x69, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x31, 0xd2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x54, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x54, + 0x49, 0x89, 0x44, 0xfd, 0x00, 0x49, 0x8b, 0x4c, + 0xf5, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x04, + 0xff, 0xc0, 0x89, 0x03, 0x49, 0x89, 0x5c, 0xf5, + 0x00, 0x49, 0x89, 0x54, 0x24, 0x40, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xd5, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: OPERAND0 + // 10: &_Py_InitCleanup+0x0 + // 18: &PyType_GenericAlloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + // 38: ERROR_TARGET + const unsigned char data_body[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x18, (uintptr_t)&PyType_GenericAlloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xdc, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xf5, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x100, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x10e, (uintptr_t)data + 0x34); +} + +void +emit__CHECK_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_CLASS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 83 b9 a8 00 00 00 00 cmpl $0x0, 0xa8(%rcx) + // f: 79 15 jns 0x26 <_JIT_ENTRY+0x26> + // 11: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // 17: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1d: 75 07 jne 0x26 <_JIT_ENTRY+0x26> + // 1f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 26: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[45] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x83, 0xb9, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x79, + 0x15, 0x8b, 0x80, 0x80, 0x01, 0x00, 0x00, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, 0x07, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_METHOD_LAZY_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // b: 48 83 7c 08 e8 00 cmpq $0x0, -0x18(%rax,%rcx) + // 11: 74 07 je 0x1a <_JIT_ENTRY+0x1a> + // 13: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[26] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0x7c, 0x08, 0xe8, + 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_ATTR_MODULE_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_MODULE_PUSH_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 8b 89 90 00 00 00 movq 0x90(%rcx), %rcx + // f: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyModule_Type + // 16: 48 3b 8a 90 00 00 00 cmpq 0x90(%rdx), %rcx + // 1d: 75 22 jne 0x41 <_JIT_ENTRY+0x41> + // 1f: 48 8b 40 10 movq 0x10(%rax), %rax + // 23: 48 8b 40 20 movq 0x20(%rax), %rax + // 27: 8b 48 0c movl 0xc(%rax), %ecx + // 2a: 3b 0d 00 00 00 00 cmpl (%rip), %ecx # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 30: 75 0f jne 0x41 <_JIT_ENTRY+0x41> + // 32: 49 89 45 00 movq %rax, (%r13) + // 36: 49 83 c5 08 addq $0x8, %r13 + // 3a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 41: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[72] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x8b, 0x89, 0x90, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x3b, + 0x8a, 0x90, 0x00, 0x00, 0x00, 0x75, 0x22, 0x48, + 0x8b, 0x40, 0x10, 0x48, 0x8b, 0x40, 0x20, 0x8b, + 0x48, 0x0c, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyModule_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyModule_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0x14); +} + +void +emit__CHECK_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_ATTR_WITH_HINT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 e8 movq -0x18(%rax), %rax + // 8: 48 85 c0 testq %rax, %rax + // b: 74 0f je 0x1c <_JIT_ENTRY+0x1c> + // d: 49 89 45 00 movq %rax, (%r13) + // 11: 49 83 c5 08 addq $0x8, %r13 + // 15: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[35] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0xe8, + 0x48, 0x85, 0xc0, 0x74, 0x0f, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_CALL_BOUND_METHOD_EXACT_ARGS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 89 c1 movl %eax, %ecx + // 9: f7 d1 notl %ecx + // b: 48 63 c9 movslq %ecx, %rcx + // e: 49 83 7c cd 00 00 cmpq $0x0, (%r13,%rcx,8) + // 14: 75 1c jne 0x32 <_JIT_ENTRY+0x32> + // 16: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 1b: 29 c1 subl %eax, %ecx + // 1d: 48 63 c1 movslq %ecx, %rax + // 20: 49 8b 44 c5 00 movq (%r13,%rax,8), %rax + // 25: 48 8b 40 08 movq 0x8(%rax), %rax + // 29: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 30: 74 07 je 0x39 <_JIT_ENTRY+0x39> + // 32: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 39: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[57] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xc9, 0x49, 0x83, + 0x7c, 0xcd, 0x00, 0x00, 0x75, 0x1c, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xc1, + 0x49, 0x8b, 0x44, 0xc5, 0x00, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_EG_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EG_MATCH.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 38 subq $0x38, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 4c 89 f1 movq %r14, %rcx + // 14: 48 89 f2 movq %rsi, %rdx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__PyEval_CheckExceptStarTypeValid + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 85 c0 testl %eax, %eax + // 2d: 0f 88 c2 00 00 00 js 0xf5 <_JIT_ENTRY+0xf5> + // 33: 48 c7 44 24 28 00 00 00 00 movq $0x0, 0x28(%rsp) + // 3c: 48 c7 44 24 30 00 00 00 00 movq $0x0, 0x30(%rsp) + // 45: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4a: 48 8d 44 24 30 leaq 0x30(%rsp), %rax + // 4f: 48 89 44 24 20 movq %rax, 0x20(%rsp) + // 54: 4c 8d 4c 24 28 leaq 0x28(%rsp), %r9 + // 59: 4c 89 e1 movq %r12, %rcx + // 5c: 48 89 fa movq %rdi, %rdx + // 5f: 49 89 f0 movq %rsi, %r8 + // 62: ff 15 00 00 00 00 callq *(%rip) # 0x68 <_JIT_ENTRY+0x68> + // 0000000000000064: IMAGE_REL_AMD64_REL32 __imp__PyEval_ExceptionGroupMatch + // 68: 89 c3 movl %eax, %ebx + // 6a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 78: 8b 07 movl (%rdi), %eax + // 7a: 85 c0 testl %eax, %eax + // 7c: 78 0f js 0x8d <_JIT_ENTRY+0x8d> + // 7e: ff c8 decl %eax + // 80: 89 07 movl %eax, (%rdi) + // 82: 75 09 jne 0x8d <_JIT_ENTRY+0x8d> + // 84: 48 89 f9 movq %rdi, %rcx + // 87: ff 15 00 00 00 00 callq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 8d: 8b 06 movl (%rsi), %eax + // 8f: 85 c0 testl %eax, %eax + // 91: 78 0a js 0x9d <_JIT_ENTRY+0x9d> + // 93: ff c8 decl %eax + // 95: 89 06 movl %eax, (%rsi) + // 97: 0f 84 88 00 00 00 je 0x125 <_JIT_ENTRY+0x125> + // 9d: 85 db testl %ebx, %ebx + // 9f: 78 75 js 0x116 <_JIT_ENTRY+0x116> + // a1: 48 8b 4c 24 28 movq 0x28(%rsp), %rcx + // a6: 48 85 c9 testq %rcx, %rcx + // a9: 74 6b je 0x116 <_JIT_ENTRY+0x116> + // ab: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // b2: 48 39 c1 cmpq %rax, %rcx + // b5: 74 26 je 0xdd <_JIT_ENTRY+0xdd> + // b7: 49 83 c5 f0 addq $-0x10, %r13 + // bb: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // c0: ff 15 00 00 00 00 callq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp_PyErr_SetHandledException + // c6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // cb: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d4: 49 83 c5 10 addq $0x10, %r13 + // d8: 48 8b 44 24 28 movq 0x28(%rsp), %rax + // dd: 48 8b 4c 24 30 movq 0x30(%rsp), %rcx + // e2: 49 89 4d f0 movq %rcx, -0x10(%r13) + // e6: 49 89 45 f8 movq %rax, -0x8(%r13) + // ea: 48 83 c4 38 addq $0x38, %rsp + // ee: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf5 <_JIT_ENTRY+0xf5> + // 00000000000000f1: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // f5: 8b 07 movl (%rdi), %eax + // f7: 85 c0 testl %eax, %eax + // f9: 78 0f js 0x10a <_JIT_ENTRY+0x10a> + // fb: ff c8 decl %eax + // fd: 89 07 movl %eax, (%rdi) + // ff: 75 09 jne 0x10a <_JIT_ENTRY+0x10a> + // 101: 48 89 f9 movq %rdi, %rcx + // 104: ff 15 00 00 00 00 callq *(%rip) # 0x10a <_JIT_ENTRY+0x10a> + // 0000000000000106: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 10a: 8b 06 movl (%rsi), %eax + // 10c: 85 c0 testl %eax, %eax + // 10e: 78 06 js 0x116 <_JIT_ENTRY+0x116> + // 110: ff c8 decl %eax + // 112: 89 06 movl %eax, (%rsi) + // 114: 74 22 je 0x138 <_JIT_ENTRY+0x138> + // 116: 49 83 c5 f0 addq $-0x10, %r13 + // 11a: 48 83 c4 38 addq $0x38, %rsp + // 11e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x125 <_JIT_ENTRY+0x125> + // 0000000000000121: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 125: 48 89 f1 movq %rsi, %rcx + // 128: ff 15 00 00 00 00 callq *(%rip) # 0x12e <_JIT_ENTRY+0x12e> + // 000000000000012a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 12e: 85 db testl %ebx, %ebx + // 130: 0f 89 6b ff ff ff jns 0xa1 <_JIT_ENTRY+0xa1> + // 136: eb de jmp 0x116 <_JIT_ENTRY+0x116> + // 138: 48 89 f1 movq %rsi, %rcx + // 13b: ff 15 00 00 00 00 callq *(%rip) # 0x141 <_JIT_ENTRY+0x141> + // 000000000000013d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 141: 49 83 c5 f0 addq $-0x10, %r13 + // 145: 48 83 c4 38 addq $0x38, %rsp + // 149: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x150 <_JIT_ENTRY+0x150> + // 000000000000014c: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[336] = { + 0x48, 0x83, 0xec, 0x38, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf1, 0x48, 0x89, 0xf2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x88, 0xc2, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0x44, 0x24, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x44, 0x24, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8d, 0x44, 0x24, 0x30, 0x48, + 0x89, 0x44, 0x24, 0x20, 0x4c, 0x8d, 0x4c, 0x24, + 0x28, 0x4c, 0x89, 0xe1, 0x48, 0x89, 0xfa, 0x49, + 0x89, 0xf0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc3, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, + 0x89, 0x07, 0x75, 0x09, 0x48, 0x89, 0xf9, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, 0x85, + 0xc0, 0x78, 0x0a, 0xff, 0xc8, 0x89, 0x06, 0x0f, + 0x84, 0x88, 0x00, 0x00, 0x00, 0x85, 0xdb, 0x78, + 0x75, 0x48, 0x8b, 0x4c, 0x24, 0x28, 0x48, 0x85, + 0xc9, 0x74, 0x6b, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x39, 0xc1, 0x74, 0x26, 0x49, + 0x83, 0xc5, 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0x10, + 0x48, 0x8b, 0x44, 0x24, 0x28, 0x48, 0x8b, 0x4c, + 0x24, 0x30, 0x49, 0x89, 0x4d, 0xf0, 0x49, 0x89, + 0x45, 0xf8, 0x48, 0x83, 0xc4, 0x38, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x07, 0x75, + 0x09, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x06, 0x74, 0x22, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x38, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x85, 0xdb, + 0x0f, 0x89, 0x6b, 0xff, 0xff, 0xff, 0xeb, 0xde, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, + 0x38, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_CheckExceptStarTypeValid+0x0 + // 8: &_PyEval_ExceptionGroupMatch+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &_Py_NoneStruct+0x0 + // 20: &PyErr_SetHandledException+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_CheckExceptStarTypeValid); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ExceptionGroupMatch); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x20, (uintptr_t)&PyErr_SetHandledException); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x64, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xae, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xf1, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x106, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x121, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x12a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x13d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x14c, (uintptr_t)data + 0x2c); +} + +void +emit__CHECK_EXC_MATCH( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_EXC_MATCH.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 4c 89 f1 movq %r14, %rcx + // 14: 48 89 f2 movq %rsi, %rdx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__PyEval_CheckExceptTypeValid + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 85 c0 testl %eax, %eax + // 2d: 78 45 js 0x74 <_JIT_ENTRY+0x74> + // 2f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 34: 48 89 f9 movq %rdi, %rcx + // 37: 48 89 f2 movq %rsi, %rdx + // 3a: ff 15 00 00 00 00 callq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp_PyErr_GivenExceptionMatches + // 40: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 45: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4e: 8b 0e movl (%rsi), %ecx + // 50: 85 c9 testl %ecx, %ecx + // 52: 78 06 js 0x5a <_JIT_ENTRY+0x5a> + // 54: ff c9 decl %ecx + // 56: 89 0e movl %ecx, (%rsi) + // 58: 74 35 je 0x8f <_JIT_ENTRY+0x8f> + // 5a: 85 c0 testl %eax, %eax + // 5c: 75 42 jne 0xa0 <_JIT_ENTRY+0xa0> + // 5e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 65: 49 89 45 f8 movq %rax, -0x8(%r13) + // 69: 48 83 c4 28 addq $0x28, %rsp + // 6d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 74: 8b 06 movl (%rsi), %eax + // 76: 85 c0 testl %eax, %eax + // 78: 78 06 js 0x80 <_JIT_ENTRY+0x80> + // 7a: ff c8 decl %eax + // 7c: 89 06 movl %eax, (%rsi) + // 7e: 74 36 je 0xb6 <_JIT_ENTRY+0xb6> + // 80: 49 83 c5 f8 addq $-0x8, %r13 + // 84: 48 83 c4 28 addq $0x28, %rsp + // 88: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 8f: 48 89 f1 movq %rsi, %rcx + // 92: 89 c6 movl %eax, %esi + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 9a: 89 f0 movl %esi, %eax + // 9c: 85 c0 testl %eax, %eax + // 9e: 74 be je 0x5e <_JIT_ENTRY+0x5e> + // a0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // a7: 49 89 45 f8 movq %rax, -0x8(%r13) + // ab: 48 83 c4 28 addq $0x28, %rsp + // af: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb6 <_JIT_ENTRY+0xb6> + // 00000000000000b2: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // b6: 48 89 f1 movq %rsi, %rcx + // b9: ff 15 00 00 00 00 callq *(%rip) # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // bf: 49 83 c5 f8 addq $-0x8, %r13 + // c3: 48 83 c4 28 addq $0x28, %rsp + // c7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xce <_JIT_ENTRY+0xce> + // 00000000000000ca: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[206] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf1, 0x48, 0x89, 0xf2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x45, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf9, 0x48, + 0x89, 0xf2, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, + 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, + 0x74, 0x35, 0x85, 0xc0, 0x75, 0x42, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x36, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x85, 0xc0, 0x74, 0xbe, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_CheckExceptTypeValid+0x0 + // 8: &PyErr_GivenExceptionMatches+0x0 + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + // 28: &_Py_Dealloc+0x0 + // 30: &_Py_TrueStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_CheckExceptTypeValid); + patch_64(data + 0x8, (uintptr_t)&PyErr_GivenExceptionMatches); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xb2, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xca, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 10 movq 0x10(%r12), %rax + // 5: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // b: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 11: 75 07 jne 0x1a <_JIT_ENTRY+0x1a> + // 13: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x44, 0x24, 0x10, 0x8b, 0x80, 0x90, + 0x00, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_FUNCTION_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_EXACT_ARGS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 89 c1 movl %eax, %ecx + // 9: f7 d1 notl %ecx + // b: 48 63 c9 movslq %ecx, %rcx + // e: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 13: 29 c2 subl %eax, %edx + // 15: 48 63 d2 movslq %edx, %rdx + // 18: 49 8b 54 d5 00 movq (%r13,%rdx,8), %rdx + // 1d: 48 8b 52 30 movq 0x30(%rdx), %rdx + // 21: 49 83 7c cd 00 01 cmpq $0x1, (%r13,%rcx,8) + // 27: 83 d8 ff sbbl $-0x1, %eax + // 2a: 39 42 34 cmpl %eax, 0x34(%rdx) + // 2d: 75 07 jne 0x36 <_JIT_ENTRY+0x36> + // 2f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 36: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[61] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xc1, 0xf7, 0xd1, 0x48, 0x63, 0xc9, 0xba, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xc2, 0x48, 0x63, 0xd2, + 0x49, 0x8b, 0x54, 0xd5, 0x00, 0x48, 0x8b, 0x52, + 0x30, 0x49, 0x83, 0x7c, 0xcd, 0x00, 0x01, 0x83, + 0xd8, 0xff, 0x39, 0x42, 0x34, 0x75, 0x07, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_FUNCTION_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 48 08 movq 0x8(%rax), %rcx + // 1a: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp_PyFunction_Type + // 21: 75 15 jne 0x38 <_JIT_ENTRY+0x38> + // 23: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 29: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 2f: 75 07 jne 0x38 <_JIT_ENTRY+0x38> + // 31: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 38: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[63] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfe, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x48, 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x15, 0x8b, 0x80, 0x90, 0x00, 0x00, + 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: OPERAND0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->operand0); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_FUNCTION_VERSION_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_INLINE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND1 + // 7: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // d: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 13: 75 07 jne 0x1c <_JIT_ENTRY+0x1c> + // 15: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[35] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x80, 0x90, 0x00, 0x00, 0x00, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x07, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPERAND1 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand1); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + 0x14); +} + +void +emit__CHECK_FUNCTION_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_FUNCTION_VERSION_KW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 48 c7 c1 fd ff ff ff movq $-0x3, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 48 08 movq 0x8(%rax), %rcx + // 1a: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp_PyFunction_Type + // 21: 75 15 jne 0x38 <_JIT_ENTRY+0x38> + // 23: 8b 80 90 00 00 00 movl 0x90(%rax), %eax + // 29: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 2f: 75 07 jne 0x38 <_JIT_ENTRY+0x38> + // 31: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 38: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[63] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfd, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x48, 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x15, 0x8b, 0x80, 0x90, 0x00, 0x00, + 0x00, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: OPERAND0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, instruction->operand0); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 40 08 movq 0x8(%rax), %rax + // 1a: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp_PyFunction_Type + // 21: 74 10 je 0x33 <_JIT_ENTRY+0x33> + // 23: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 2a: 74 07 je 0x33 <_JIT_ENTRY+0x33> + // 2c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 33: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[58] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfe, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x10, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_IS_NOT_PY_CALLABLE_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_IS_NOT_PY_CALLABLE_KW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 48 c7 c1 fd ff ff ff movq $-0x3, %rcx + // e: 48 29 c1 subq %rax, %rcx + // 11: 49 8b 44 cd 00 movq (%r13,%rcx,8), %rax + // 16: 48 8b 40 08 movq 0x8(%rax), %rax + // 1a: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp_PyFunction_Type + // 21: 74 10 je 0x33 <_JIT_ENTRY+0x33> + // 23: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 2a: 74 07 je 0x33 <_JIT_ENTRY+0x33> + // 2c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 33: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[58] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0xc7, 0xc1, 0xfd, 0xff, 0xff, 0xff, 0x48, 0x29, + 0xc1, 0x49, 0x8b, 0x44, 0xcd, 0x00, 0x48, 0x8b, + 0x40, 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x74, 0x10, 0x48, 0x3b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyFunction_Type+0x0 + // 10: &PyMethod_Type+0x0 + // 18: CONTINUE + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x10, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_MANAGED_OBJECT_HAS_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_MANAGED_OBJECT_HAS_VALUES.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 8b 49 20 movq 0x20(%rcx), %rcx + // c: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 11: 74 07 je 0x1a <_JIT_ENTRY+0x1a> + // 13: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x8b, 0x49, 0x20, 0x80, 0x7c, 0x08, 0x03, + 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_METHOD_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // c: 29 c1 subl %eax, %ecx + // e: 48 63 c9 movslq %ecx, %rcx + // 11: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 16: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1a: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 21: 75 2b jne 0x4e <_JIT_ENTRY+0x4e> + // 23: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 27: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2b: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: IMAGE_REL_AMD64_REL32 __imp_PyFunction_Type + // 32: 75 1a jne 0x4e <_JIT_ENTRY+0x4e> + // 34: 8b 89 90 00 00 00 movl 0x90(%rcx), %ecx + // 3a: 3b 0d 00 00 00 00 cmpl (%rip), %ecx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 40: 75 0c jne 0x4e <_JIT_ENTRY+0x4e> + // 42: f7 d0 notl %eax + // 44: 48 98 cltq + // 46: 49 83 7c c5 00 00 cmpq $0x0, (%r13,%rax,8) + // 4c: 74 07 je 0x55 <_JIT_ENTRY+0x55> + // 4e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 55: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[85] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0xfe, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, + 0xc9, 0x49, 0x8b, 0x4c, 0xcd, 0x00, 0x48, 0x8b, + 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x2b, 0x48, 0x8b, 0x49, 0x10, 0x48, + 0x8b, 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x1a, 0x8b, 0x89, 0x90, 0x00, + 0x00, 0x00, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x0c, 0xf7, 0xd0, 0x48, 0x98, 0x49, 0x83, + 0x7c, 0xc5, 0x00, 0x00, 0x74, 0x07, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &PyFunction_Type+0x0 + // 18: OPERAND0 + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x18, instruction->operand0); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_METHOD_VERSION_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_METHOD_VERSION_KW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: b9 fd ff ff ff movl $0xfffffffd, %ecx # imm = 0xFFFFFFFD + // c: 29 c1 subl %eax, %ecx + // e: 48 63 c9 movslq %ecx, %rcx + // 11: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 16: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 1a: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 21: 75 31 jne 0x54 <_JIT_ENTRY+0x54> + // 23: 48 8b 49 10 movq 0x10(%rcx), %rcx + // 27: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2b: 48 3b 15 00 00 00 00 cmpq (%rip), %rdx # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: IMAGE_REL_AMD64_REL32 __imp_PyFunction_Type + // 32: 75 20 jne 0x54 <_JIT_ENTRY+0x54> + // 34: 8b 89 90 00 00 00 movl 0x90(%rcx), %ecx + // 3a: 3b 0d 00 00 00 00 cmpl (%rip), %ecx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 40: 75 12 jne 0x54 <_JIT_ENTRY+0x54> + // 42: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 47: 29 c1 subl %eax, %ecx + // 49: 48 63 c1 movslq %ecx, %rax + // 4c: 49 83 7c c5 00 00 cmpq $0x0, (%r13,%rax,8) + // 52: 74 07 je 0x5b <_JIT_ENTRY+0x5b> + // 54: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5b <_JIT_ENTRY+0x5b> + // 0000000000000057: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 5b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[91] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xb9, + 0xfd, 0xff, 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, + 0xc9, 0x49, 0x8b, 0x4c, 0xcd, 0x00, 0x48, 0x8b, + 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x31, 0x48, 0x8b, 0x49, 0x10, 0x48, + 0x8b, 0x51, 0x08, 0x48, 0x3b, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x20, 0x8b, 0x89, 0x90, 0x00, + 0x00, 0x00, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x12, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xc1, 0x48, 0x63, 0xc1, 0x49, 0x83, 0x7c, 0xc5, + 0x00, 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: &PyFunction_Type+0x0 + // 18: OPERAND0 + // 20: JUMP_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)&PyFunction_Type); + patch_64(data + 0x18, instruction->operand0); + patch_64(data + 0x20, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x57, (uintptr_t)data + 0x1c); +} + +void +emit__CHECK_PEP_523( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PEP_523.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 46 10 movq 0x10(%r14), %rax + // 4: 48 83 b8 70 20 00 00 00 cmpq $0x0, 0x2070(%rax) + // c: 74 07 je 0x15 <_JIT_ENTRY+0x15> + // e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 15: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[21] = { + 0x49, 0x8b, 0x46, 0x10, 0x48, 0x83, 0xb8, 0x70, + 0x20, 0x00, 0x00, 0x00, 0x74, 0x07, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); +} + +void +emit__CHECK_PERIODIC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 46 18 movq 0x18(%r14), %rax + // 8: 84 c0 testb %al, %al + // a: 74 2b je 0x37 <_JIT_ENTRY+0x37> + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 4c 89 f1 movq %r14, %rcx + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__Py_HandlePending + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 85 c0 testl %eax, %eax + // 2a: 74 0b je 0x37 <_JIT_ENTRY+0x37> + // 2c: 48 83 c4 28 addq $0x28, %rsp + // 30: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 37: 48 83 c4 28 addq $0x28, %rsp + // 3b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[59] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x46, 0x18, + 0x84, 0xc0, 0x74, 0x2b, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x74, 0x0b, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: &_Py_HandlePending+0x0 + // 8: ERROR_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_HandlePending); + patch_64(data + 0x8, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_PERIODIC_IF_NOT_YIELD_FROM.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: a8 02 testb $0x2, %al + // d: 75 33 jne 0x42 <_JIT_ENTRY+0x42> + // f: 49 8b 46 18 movq 0x18(%r14), %rax + // 13: 84 c0 testb %al, %al + // 15: 74 2b je 0x42 <_JIT_ENTRY+0x42> + // 17: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1c: 4c 89 f1 movq %r14, %rcx + // 1f: ff 15 00 00 00 00 callq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__Py_HandlePending + // 25: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 33: 85 c0 testl %eax, %eax + // 35: 74 0b je 0x42 <_JIT_ENTRY+0x42> + // 37: 48 83 c4 28 addq $0x28, %rsp + // 3b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 42: 48 83 c4 28 addq $0x28, %rsp + // 46: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4d <_JIT_ENTRY+0x4d> + // 0000000000000049: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[70] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xa8, 0x02, 0x75, 0x33, 0x49, + 0x8b, 0x46, 0x18, 0x84, 0xc0, 0x74, 0x2b, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x0b, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: &_Py_HandlePending+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_HandlePending); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0xc); +} + +void +emit__CHECK_STACK_SPACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 86 e8 00 00 00 movq 0xe8(%r14), %rax + // 7: 48 85 c0 testq %rax, %rax + // a: 74 38 je 0x44 <_JIT_ENTRY+0x44> + // c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 13: 48 c7 c2 fe ff ff ff movq $-0x2, %rdx + // 1a: 48 29 ca subq %rcx, %rdx + // 1d: 49 8b 4c d5 00 movq (%r13,%rdx,8), %rcx + // 22: 48 8b 49 30 movq 0x30(%rcx), %rcx + // 26: 48 63 49 4c movslq 0x4c(%rcx), %rcx + // 2a: 49 8b 96 f0 00 00 00 movq 0xf0(%r14), %rdx + // 31: 48 29 c2 subq %rax, %rdx + // 34: 48 c1 fa 03 sarq $0x3, %rdx + // 38: 48 39 ca cmpq %rcx, %rdx + // 3b: 7e 07 jle 0x44 <_JIT_ENTRY+0x44> + // 3d: 41 83 7e 2c 01 cmpl $0x1, 0x2c(%r14) + // 42: 7f 07 jg 0x4b <_JIT_ENTRY+0x4b> + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 4b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[75] = { + 0x49, 0x8b, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x38, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc2, 0xfe, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xca, 0x49, 0x8b, 0x4c, + 0xd5, 0x00, 0x48, 0x8b, 0x49, 0x30, 0x48, 0x63, + 0x49, 0x4c, 0x49, 0x8b, 0x96, 0xf0, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xc2, 0x48, 0xc1, 0xfa, 0x03, + 0x48, 0x39, 0xca, 0x7e, 0x07, 0x41, 0x83, 0x7e, + 0x2c, 0x01, 0x7f, 0x07, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_STACK_SPACE_OPERAND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_STACK_SPACE_OPERAND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 86 e8 00 00 00 movq 0xe8(%r14), %rax + // 7: 48 85 c0 testq %rax, %rax + // a: 74 21 je 0x2d <_JIT_ENTRY+0x2d> + // c: 48 63 0d 00 00 00 00 movslq (%rip), %rcx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 13: 49 8b 96 f0 00 00 00 movq 0xf0(%r14), %rdx + // 1a: 48 29 c2 subq %rax, %rdx + // 1d: 48 c1 fa 03 sarq $0x3, %rdx + // 21: 48 39 ca cmpq %rcx, %rdx + // 24: 7e 07 jle 0x2d <_JIT_ENTRY+0x2d> + // 26: 41 83 7e 2c 01 cmpl $0x1, 0x2c(%r14) + // 2b: 7f 07 jg 0x34 <_JIT_ENTRY+0x34> + // 2d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 34: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[52] = { + 0x49, 0x8b, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x21, 0x48, 0x63, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x96, 0xf0, 0x00, + 0x00, 0x00, 0x48, 0x29, 0xc2, 0x48, 0xc1, 0xfa, + 0x03, 0x48, 0x39, 0xca, 0x7e, 0x07, 0x41, 0x83, + 0x7e, 0x2c, 0x01, 0x7f, 0x07, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_VALIDITY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 7: f6 40 22 01 testb $0x1, 0x22(%rax) + // b: 75 07 jne 0x14 <_JIT_ENTRY+0x14> + // d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 14: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[20] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf6, + 0x40, 0x22, 0x01, 0x75, 0x07, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: EXECUTOR + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); +} + +void +emit__CHECK_VALIDITY_AND_SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CHECK_VALIDITY_AND_SET_IP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 7: f6 40 22 01 testb $0x1, 0x22(%rax) + // b: 75 07 jne 0x14 <_JIT_ENTRY+0x14> + // d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 14: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1b: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 20: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[32] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf6, + 0x40, 0x22, 0x01, 0x75, 0x07, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x44, 0x24, 0x38, + }; + // 0: EXECUTOR + // 8: JUMP_TARGET + // 10: OPERAND0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0xc); +} + +void +emit__COMPARE_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 44 0f b7 3d 00 00 00 00 movzwl (%rip), %r15d # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // c: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 10: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 45 89 f8 movl %r15d, %r8d + // 1c: 41 c1 e8 05 shrl $0x5, %r8d + // 20: 48 89 d9 movq %rbx, %rcx + // 23: 48 89 fa movq %rdi, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp_PyObject_RichCompare + // 2c: 48 89 c6 movq %rax, %rsi + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 8b 03 movl (%rbx), %eax + // 3f: 85 c0 testl %eax, %eax + // 41: 78 0f js 0x52 <_JIT_ENTRY+0x52> + // 43: ff c8 decl %eax + // 45: 89 03 movl %eax, (%rbx) + // 47: 75 09 jne 0x52 <_JIT_ENTRY+0x52> + // 49: 48 89 d9 movq %rbx, %rcx + // 4c: ff 15 00 00 00 00 callq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 52: 8b 07 movl (%rdi), %eax + // 54: 85 c0 testl %eax, %eax + // 56: 78 06 js 0x5e <_JIT_ENTRY+0x5e> + // 58: ff c8 decl %eax + // 5a: 89 07 movl %eax, (%rdi) + // 5c: 74 5b je 0xb9 <_JIT_ENTRY+0xb9> + // 5e: 49 83 c5 f0 addq $-0x10, %r13 + // 62: 48 85 f6 testq %rsi, %rsi + // 65: 0f 84 9b 00 00 00 je 0x106 <_JIT_ENTRY+0x106> + // 6b: 41 f6 c7 10 testb $0x10, %r15b + // 6f: 74 35 je 0xa6 <_JIT_ENTRY+0xa6> + // 71: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 76: 48 89 f1 movq %rsi, %rcx + // 79: ff 15 00 00 00 00 callq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: IMAGE_REL_AMD64_REL32 __imp_PyObject_IsTrue + // 7f: 8b 0e movl (%rsi), %ecx + // 81: 85 c9 testl %ecx, %ecx + // 83: 78 06 js 0x8b <_JIT_ENTRY+0x8b> + // 85: ff c9 decl %ecx + // 87: 89 0e movl %ecx, (%rsi) + // 89: 74 5c je 0xe7 <_JIT_ENTRY+0xe7> + // 8b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 90: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 99: 85 c0 testl %eax, %eax + // 9b: 78 69 js 0x106 <_JIT_ENTRY+0x106> + // 9d: 75 2e jne 0xcd <_JIT_ENTRY+0xcd> + // 9f: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0xa6 <_JIT_ENTRY+0xa6> + // 00000000000000a2: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // a6: 49 89 75 00 movq %rsi, (%r13) + // aa: 49 83 c5 08 addq $0x8, %r13 + // ae: 48 83 c4 28 addq $0x28, %rsp + // b2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb9 <_JIT_ENTRY+0xb9> + // 00000000000000b5: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // b9: 48 89 f9 movq %rdi, %rcx + // bc: ff 15 00 00 00 00 callq *(%rip) # 0xc2 <_JIT_ENTRY+0xc2> + // 00000000000000be: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c2: 49 83 c5 f0 addq $-0x10, %r13 + // c6: 48 85 f6 testq %rsi, %rsi + // c9: 75 a0 jne 0x6b <_JIT_ENTRY+0x6b> + // cb: eb 39 jmp 0x106 <_JIT_ENTRY+0x106> + // cd: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // d4: 49 89 75 00 movq %rsi, (%r13) + // d8: 49 83 c5 08 addq $0x8, %r13 + // dc: 48 83 c4 28 addq $0x28, %rsp + // e0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe7 <_JIT_ENTRY+0xe7> + // 00000000000000e3: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // e7: 48 89 f1 movq %rsi, %rcx + // ea: 89 c6 movl %eax, %esi + // ec: ff 15 00 00 00 00 callq *(%rip) # 0xf2 <_JIT_ENTRY+0xf2> + // 00000000000000ee: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // f2: 89 f0 movl %esi, %eax + // f4: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 102: 85 c0 testl %eax, %eax + // 104: 79 97 jns 0x9d <_JIT_ENTRY+0x9d> + // 106: 48 83 c4 28 addq $0x28, %rsp + // 10a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x111 <_JIT_ENTRY+0x111> + // 000000000000010d: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[273] = { + 0x48, 0x83, 0xec, 0x28, 0x44, 0x0f, 0xb7, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x45, 0x89, 0xf8, 0x41, 0xc1, 0xe8, 0x05, + 0x48, 0x89, 0xd9, 0x48, 0x89, 0xfa, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc6, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x5b, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x85, 0xf6, 0x0f, 0x84, 0x9b, + 0x00, 0x00, 0x00, 0x41, 0xf6, 0xc7, 0x10, 0x74, + 0x35, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0e, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0e, 0x74, 0x5c, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x78, 0x69, 0x75, 0x2e, 0x48, + 0x8b, 0x35, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x75, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x85, + 0xf6, 0x75, 0xa0, 0xeb, 0x39, 0x48, 0x8b, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x75, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x79, 0x97, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyObject_RichCompare+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: &PyObject_IsTrue+0x0 + // 20: &_Py_FalseStruct+0x0 + // 28: CONTINUE + // 30: &_Py_TrueStruct+0x0 + // 38: ERROR_TARGET + const unsigned char data_body[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_RichCompare); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb5, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xbe, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xe3, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xee, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x10d, (uintptr_t)data + 0x34); +} + +void +emit__COMPARE_OP_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: f2 0f 10 77 10 movsd 0x10(%rdi), %xmm6 + // 11: f2 0f 10 7e 10 movsd 0x10(%rsi), %xmm7 + // 16: 8b 07 movl (%rdi), %eax + // 18: 85 c0 testl %eax, %eax + // 1a: 78 33 js 0x4f <_JIT_ENTRY+0x4f> + // 1c: ff c8 decl %eax + // 1e: 89 07 movl %eax, (%rdi) + // 20: 75 2d jne 0x4f <_JIT_ENTRY+0x4f> + // 22: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 29: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 11 je 0x46 <_JIT_ENTRY+0x46> + // 35: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 3c: 48 89 f9 movq %rdi, %rcx + // 3f: ba 01 00 00 00 movl $0x1, %edx + // 44: ff d0 callq *%rax + // 46: 48 89 f9 movq %rdi, %rcx + // 49: ff 15 00 00 00 00 callq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: IMAGE_REL_AMD64_REL32 __imp__PyFloat_ExactDealloc + // 4f: 8b 06 movl (%rsi), %eax + // 51: 85 c0 testl %eax, %eax + // 53: 78 33 js 0x88 <_JIT_ENTRY+0x88> + // 55: ff c8 decl %eax + // 57: 89 06 movl %eax, (%rsi) + // 59: 75 2d jne 0x88 <_JIT_ENTRY+0x88> + // 5b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 62: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 69: 48 85 c0 testq %rax, %rax + // 6c: 74 11 je 0x7f <_JIT_ENTRY+0x7f> + // 6e: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 75: 48 89 f1 movq %rsi, %rcx + // 78: ba 01 00 00 00 movl $0x1, %edx + // 7d: ff d0 callq *%rax + // 7f: 48 89 f1 movq %rsi, %rcx + // 82: ff 15 00 00 00 00 callq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: IMAGE_REL_AMD64_REL32 __imp__PyFloat_ExactDealloc + // 88: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 8c: 31 c9 xorl %ecx, %ecx + // 8e: 66 0f 2e f7 ucomisd %xmm7, %xmm6 + // 92: 0f 93 c1 setae %cl + // 95: 01 c9 addl %ecx, %ecx + // 97: 31 d2 xorl %edx, %edx + // 99: 66 0f 2e fe ucomisd %xmm6, %xmm7 + // 9d: 0f 93 c2 setae %dl + // a0: 09 ca orl %ecx, %edx + // a2: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0xa8 <_JIT_ENTRY+0xa8> + // 00000000000000a4: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // a8: 0f a3 d1 btl %edx, %ecx + // ab: 72 19 jb 0xc6 <_JIT_ENTRY+0xc6> + // ad: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b0: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // b4: 49 89 4d f0 movq %rcx, -0x10(%r13) + // b8: 49 89 c5 movq %rax, %r13 + // bb: 48 83 c4 28 addq $0x28, %rsp + // bf: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // c6: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xcd <_JIT_ENTRY+0xcd> + // 00000000000000c9: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // cd: 49 89 4d f0 movq %rcx, -0x10(%r13) + // d1: 49 89 c5 movq %rax, %r13 + // d4: 48 83 c4 28 addq $0x28, %rsp + // d8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[216] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0xf2, 0x0f, 0x10, 0x77, + 0x10, 0xf2, 0x0f, 0x10, 0x7e, 0x10, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x33, 0xff, 0xc8, 0x89, 0x07, + 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, 0x81, + 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, 0xf9, 0xba, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, 0x89, + 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x33, 0xff, 0xc8, 0x89, + 0x06, 0x75, 0x2d, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, 0x25, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, 0x4c, 0x8b, + 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x48, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8d, 0x45, 0xf8, 0x31, 0xc9, 0x66, 0x0f, + 0x2e, 0xf7, 0x0f, 0x93, 0xc1, 0x01, 0xc9, 0x31, + 0xd2, 0x66, 0x0f, 0x2e, 0xfe, 0x0f, 0x93, 0xc2, + 0x09, 0xca, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xa3, 0xd1, 0x72, 0x19, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, + 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &_PyRuntime+0x0 + // 8: &_PyFloat_ExactDealloc+0x0 + // 10: OPARG + // 18: &_Py_FalseStruct+0x0 + // 20: CONTINUE + // 28: &_Py_TrueStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + patch_64(data + 0x8, (uintptr_t)&_PyFloat_ExactDealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa4, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb0, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc9, (uintptr_t)data + 0x24); +} + +void +emit__COMPARE_OP_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 55 pushq %rbp + // 1: 48 83 ec 30 subq $0x30, %rsp + // 5: 49 8b 7d f0 movq -0x10(%r13), %rdi + // 9: 4c 8b 7f 10 movq 0x10(%rdi), %r15 + // d: 49 83 ff 10 cmpq $0x10, %r15 + // 11: 73 0e jae 0x21 <_JIT_ENTRY+0x21> + // 13: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 17: 48 8b 5e 10 movq 0x10(%rsi), %rbx + // 1b: 48 83 fb 10 cmpq $0x10, %rbx + // 1f: 72 0c jb 0x2d <_JIT_ENTRY+0x2d> + // 21: 48 83 c4 30 addq $0x30, %rsp + // 25: 5d popq %rbp + // 26: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 2d: 8b 07 movl (%rdi), %eax + // 2f: 8b 6f 18 movl 0x18(%rdi), %ebp + // 32: 44 8b 46 18 movl 0x18(%rsi), %r8d + // 36: 85 c0 testl %eax, %eax + // 38: 78 3d js 0x77 <_JIT_ENTRY+0x77> + // 3a: ff c8 decl %eax + // 3c: 89 07 movl %eax, (%rdi) + // 3e: 75 37 jne 0x77 <_JIT_ENTRY+0x77> + // 40: 4c 89 44 24 28 movq %r8, 0x28(%rsp) + // 45: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 4c: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 53: 48 85 c0 testq %rax, %rax + // 56: 74 11 je 0x69 <_JIT_ENTRY+0x69> + // 58: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 5f: 48 89 f9 movq %rdi, %rcx + // 62: ba 01 00 00 00 movl $0x1, %edx + // 67: ff d0 callq *%rax + // 69: 48 89 f9 movq %rdi, %rcx + // 6c: ff 15 00 00 00 00 callq *(%rip) # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 72: 4c 8b 44 24 28 movq 0x28(%rsp), %r8 + // 77: 8b 06 movl (%rsi), %eax + // 79: 85 c0 testl %eax, %eax + // 7b: 78 39 js 0xb6 <_JIT_ENTRY+0xb6> + // 7d: ff c8 decl %eax + // 7f: 89 06 movl %eax, (%rsi) + // 81: 75 33 jne 0xb6 <_JIT_ENTRY+0xb6> + // 83: 4c 89 c7 movq %r8, %rdi + // 86: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 8d: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 94: 48 85 c0 testq %rax, %rax + // 97: 74 11 je 0xaa <_JIT_ENTRY+0xaa> + // 99: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // a0: 48 89 f1 movq %rsi, %rcx + // a3: ba 01 00 00 00 movl $0x1, %edx + // a8: ff d0 callq *%rax + // aa: 48 89 f1 movq %rsi, %rcx + // ad: ff 15 00 00 00 00 callq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // b3: 49 89 f8 movq %rdi, %r8 + // b6: 49 8d 45 f8 leaq -0x8(%r13), %rax + // ba: 41 83 e7 03 andl $0x3, %r15d + // be: b9 01 00 00 00 movl $0x1, %ecx + // c3: ba 01 00 00 00 movl $0x1, %edx + // c8: 4c 29 fa subq %r15, %rdx + // cb: 48 0f af d5 imulq %rbp, %rdx + // cf: 83 e3 03 andl $0x3, %ebx + // d2: 48 29 d9 subq %rbx, %rcx + // d5: 49 0f af c8 imulq %r8, %rcx + // d9: 31 f6 xorl %esi, %esi + // db: 31 ff xorl %edi, %edi + // dd: 48 39 ca cmpq %rcx, %rdx + // e0: 40 0f 9d c6 setge %sil + // e4: 40 0f 9e c7 setle %dil + // e8: 01 f6 addl %esi, %esi + // ea: 09 f7 orl %esi, %edi + // ec: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0xf2 <_JIT_ENTRY+0xf2> + // 00000000000000ee: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f2: 0f a3 f9 btl %edi, %ecx + // f5: 72 09 jb 0x100 <_JIT_ENTRY+0x100> + // f7: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xfe <_JIT_ENTRY+0xfe> + // 00000000000000fa: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // fe: eb 07 jmp 0x107 <_JIT_ENTRY+0x107> + // 100: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x107 <_JIT_ENTRY+0x107> + // 0000000000000103: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 107: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 10b: 49 89 c5 movq %rax, %r13 + // 10e: 48 83 c4 30 addq $0x30, %rsp + // 112: 5d popq %rbp + // 113: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x11a <_JIT_ENTRY+0x11a> + // 0000000000000116: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[275] = { + 0x55, 0x48, 0x83, 0xec, 0x30, 0x49, 0x8b, 0x7d, + 0xf0, 0x4c, 0x8b, 0x7f, 0x10, 0x49, 0x83, 0xff, + 0x10, 0x73, 0x0e, 0x49, 0x8b, 0x75, 0xf8, 0x48, + 0x8b, 0x5e, 0x10, 0x48, 0x83, 0xfb, 0x10, 0x72, + 0x0c, 0x48, 0x83, 0xc4, 0x30, 0x5d, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x8b, + 0x6f, 0x18, 0x44, 0x8b, 0x46, 0x18, 0x85, 0xc0, + 0x78, 0x3d, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x37, + 0x4c, 0x89, 0x44, 0x24, 0x28, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, + 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, + 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, + 0x89, 0xf9, 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, + 0xd0, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x8b, 0x44, 0x24, 0x28, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x39, 0xff, 0xc8, 0x89, + 0x06, 0x75, 0x33, 0x4c, 0x89, 0xc7, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, + 0x48, 0x89, 0xf1, 0xba, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0xf8, 0x49, 0x8d, + 0x45, 0xf8, 0x41, 0x83, 0xe7, 0x03, 0xb9, 0x01, + 0x00, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x29, 0xfa, 0x48, 0x0f, 0xaf, 0xd5, 0x83, + 0xe3, 0x03, 0x48, 0x29, 0xd9, 0x49, 0x0f, 0xaf, + 0xc8, 0x31, 0xf6, 0x31, 0xff, 0x48, 0x39, 0xca, + 0x40, 0x0f, 0x9d, 0xc6, 0x40, 0x0f, 0x9e, 0xc7, + 0x01, 0xf6, 0x09, 0xf7, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xa3, 0xf9, 0x72, 0x09, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x07, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, + 0xc4, 0x30, 0x5d, + }; + // 0: JUMP_TARGET + // 8: &_PyRuntime+0x0 + // 10: &_PyLong_ExactDealloc+0x0 + // 18: OPARG + // 20: &_Py_FalseStruct+0x0 + // 28: &_Py_TrueStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xee, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xfa, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x103, (uintptr_t)data + 0x24); +} + +void +emit__COMPARE_OP_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COMPARE_OP_STR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 7d f8 movq -0x8(%r13), %rdi + // c: 48 89 d9 movq %rbx, %rcx + // f: 48 89 fa movq %rdi, %rdx + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_Equal + // 18: 89 c6 movl %eax, %esi + // 1a: 8b 03 movl (%rbx), %eax + // 1c: 85 c0 testl %eax, %eax + // 1e: 78 33 js 0x53 <_JIT_ENTRY+0x53> + // 20: ff c8 decl %eax + // 22: 89 03 movl %eax, (%rbx) + // 24: 75 2d jne 0x53 <_JIT_ENTRY+0x53> + // 26: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 2d: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 34: 48 85 c0 testq %rax, %rax + // 37: 74 11 je 0x4a <_JIT_ENTRY+0x4a> + // 39: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 40: 48 89 d9 movq %rbx, %rcx + // 43: ba 01 00 00 00 movl $0x1, %edx + // 48: ff d0 callq *%rax + // 4a: 48 89 d9 movq %rbx, %rcx + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_ExactDealloc + // 53: 8b 07 movl (%rdi), %eax + // 55: 85 c0 testl %eax, %eax + // 57: 78 33 js 0x8c <_JIT_ENTRY+0x8c> + // 59: ff c8 decl %eax + // 5b: 89 07 movl %eax, (%rdi) + // 5d: 75 2d jne 0x8c <_JIT_ENTRY+0x8c> + // 5f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x66 <_JIT_ENTRY+0x66> + // 0000000000000062: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 66: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 6d: 48 85 c0 testq %rax, %rax + // 70: 74 11 je 0x83 <_JIT_ENTRY+0x83> + // 72: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 79: 48 89 f9 movq %rdi, %rcx + // 7c: ba 01 00 00 00 movl $0x1, %edx + // 81: ff d0 callq *%rax + // 83: 48 89 f9 movq %rdi, %rcx + // 86: ff 15 00 00 00 00 callq *(%rip) # 0x8c <_JIT_ENTRY+0x8c> + // 0000000000000088: IMAGE_REL_AMD64_REL32 __imp__PyUnicode_ExactDealloc + // 8c: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 90: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x97 <_JIT_ENTRY+0x97> + // 0000000000000093: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 97: 83 c6 07 addl $0x7, %esi + // 9a: 66 85 f1 testw %si, %cx + // 9d: 75 19 jne 0xb8 <_JIT_ENTRY+0xb8> + // 9f: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xa6 <_JIT_ENTRY+0xa6> + // 00000000000000a2: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // a6: 49 89 4d f0 movq %rcx, -0x10(%r13) + // aa: 49 89 c5 movq %rax, %r13 + // ad: 48 83 c4 28 addq $0x28, %rsp + // b1: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // b8: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xbf <_JIT_ENTRY+0xbf> + // 00000000000000bb: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // bf: 49 89 4d f0 movq %rcx, -0x10(%r13) + // c3: 49 89 c5 movq %rax, %r13 + // c6: 48 83 c4 28 addq $0x28, %rsp + // ca: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd1 <_JIT_ENTRY+0xd1> + // 00000000000000cd: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[202] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x89, 0xd9, 0x48, + 0x89, 0xfa, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xc6, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x33, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, + 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, + 0x48, 0x89, 0xd9, 0xba, 0x01, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x33, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x2d, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x81, 0x60, 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x11, 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, + 0x00, 0x48, 0x89, 0xf9, 0xba, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xd0, 0x48, 0x89, 0xf9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, 0x45, 0xf8, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x83, + 0xc6, 0x07, 0x66, 0x85, 0xf1, 0x75, 0x19, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, + 0xc4, 0x28, + }; + // 0: &_PyUnicode_Equal+0x0 + // 8: &_PyRuntime+0x0 + // 10: &_PyUnicode_ExactDealloc+0x0 + // 18: OPARG + // 20: &_Py_FalseStruct+0x0 + // 28: CONTINUE + // 30: &_Py_TrueStruct+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyUnicode_Equal); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + patch_64(data + 0x10, (uintptr_t)&_PyUnicode_ExactDealloc); + patch_64(data + 0x18, instruction->oparg); + patch_64(data + 0x20, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x62, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa2, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xbb, (uintptr_t)data + 0x2c); +} + +void +emit__CONTAINS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 7d f8 movq -0x8(%r13), %rdi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 89 f9 movq %rdi, %rcx + // 14: 48 89 da movq %rbx, %rdx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp_PySequence_Contains + // 1d: 89 c6 movl %eax, %esi + // 1f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 24: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2d: 8b 03 movl (%rbx), %eax + // 2f: 85 c0 testl %eax, %eax + // 31: 78 0f js 0x42 <_JIT_ENTRY+0x42> + // 33: ff c8 decl %eax + // 35: 89 03 movl %eax, (%rbx) + // 37: 75 09 jne 0x42 <_JIT_ENTRY+0x42> + // 39: 48 89 d9 movq %rbx, %rcx + // 3c: ff 15 00 00 00 00 callq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 42: 8b 07 movl (%rdi), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 06 js 0x4e <_JIT_ENTRY+0x4e> + // 48: ff c8 decl %eax + // 4a: 89 07 movl %eax, (%rdi) + // 4c: 74 43 je 0x91 <_JIT_ENTRY+0x91> + // 4e: 85 f6 testl %esi, %esi + // 50: 78 4c js 0x9e <_JIT_ENTRY+0x9e> + // 52: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 59: 39 c6 cmpl %eax, %esi + // 5b: 75 1a jne 0x77 <_JIT_ENTRY+0x77> + // 5d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 64: 49 89 45 f0 movq %rax, -0x10(%r13) + // 68: 49 83 c5 f8 addq $-0x8, %r13 + // 6c: 48 83 c4 28 addq $0x28, %rsp + // 70: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 77: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 7e: 49 89 45 f0 movq %rax, -0x10(%r13) + // 82: 49 83 c5 f8 addq $-0x8, %r13 + // 86: 48 83 c4 28 addq $0x28, %rsp + // 8a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x91 <_JIT_ENTRY+0x91> + // 000000000000008d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 91: 48 89 f9 movq %rdi, %rcx + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 9a: 85 f6 testl %esi, %esi + // 9c: 79 b4 jns 0x52 <_JIT_ENTRY+0x52> + // 9e: 49 83 c5 f0 addq $-0x10, %r13 + // a2: 48 83 c4 28 addq $0x28, %rsp + // a6: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xad <_JIT_ENTRY+0xad> + // 00000000000000a9: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[173] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xf9, 0x48, 0x89, 0xda, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xc6, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x43, 0x85, 0xf6, + 0x78, 0x4c, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x39, 0xc6, 0x75, 0x1a, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xf6, 0x79, 0xb4, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySequence_Contains+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: OPARG + // 18: &_Py_FalseStruct+0x0 + // 20: CONTINUE + // 28: &_Py_TrueStruct+0x0 + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySequence_Contains); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x73, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xa9, (uintptr_t)data + 0x2c); +} + +void +emit__CONTAINS_OP_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 48 8b 46 08 movq 0x8(%rsi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 13: 74 0b je 0x20 <_JIT_ENTRY+0x20> + // 15: 48 83 c4 28 addq $0x28, %rsp + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 20: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 48 89 f1 movq %rsi, %rcx + // 2c: 48 89 da movq %rbx, %rdx + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: IMAGE_REL_AMD64_REL32 __imp_PyDict_Contains + // 35: 89 c7 movl %eax, %edi + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 8b 03 movl (%rbx), %eax + // 47: 85 c0 testl %eax, %eax + // 49: 78 0f js 0x5a <_JIT_ENTRY+0x5a> + // 4b: ff c8 decl %eax + // 4d: 89 03 movl %eax, (%rbx) + // 4f: 75 09 jne 0x5a <_JIT_ENTRY+0x5a> + // 51: 48 89 d9 movq %rbx, %rcx + // 54: ff 15 00 00 00 00 callq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 5a: 8b 06 movl (%rsi), %eax + // 5c: 85 c0 testl %eax, %eax + // 5e: 78 06 js 0x66 <_JIT_ENTRY+0x66> + // 60: ff c8 decl %eax + // 62: 89 06 movl %eax, (%rsi) + // 64: 74 43 je 0xa9 <_JIT_ENTRY+0xa9> + // 66: 85 ff testl %edi, %edi + // 68: 78 4c js 0xb6 <_JIT_ENTRY+0xb6> + // 6a: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x71 <_JIT_ENTRY+0x71> + // 000000000000006d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 71: 39 c7 cmpl %eax, %edi + // 73: 75 1a jne 0x8f <_JIT_ENTRY+0x8f> + // 75: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 7c: 49 89 45 f0 movq %rax, -0x10(%r13) + // 80: 49 83 c5 f8 addq $-0x8, %r13 + // 84: 48 83 c4 28 addq $0x28, %rsp + // 88: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 8f: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x96 <_JIT_ENTRY+0x96> + // 0000000000000092: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 96: 49 89 45 f0 movq %rax, -0x10(%r13) + // 9a: 49 83 c5 f8 addq $-0x8, %r13 + // 9e: 48 83 c4 28 addq $0x28, %rsp + // a2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa9 <_JIT_ENTRY+0xa9> + // 00000000000000a5: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // a9: 48 89 f1 movq %rsi, %rcx + // ac: ff 15 00 00 00 00 callq *(%rip) # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b2: 85 ff testl %edi, %edi + // b4: 79 b4 jns 0x6a <_JIT_ENTRY+0x6a> + // b6: 49 83 c5 f0 addq $-0x10, %r13 + // ba: 48 83 c4 28 addq $0x28, %rsp + // be: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc5 <_JIT_ENTRY+0xc5> + // 00000000000000c1: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[197] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x48, 0x8b, 0x46, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x5d, 0xf0, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xf1, 0x48, 0x89, 0xda, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xc7, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x06, 0x74, 0x43, 0x85, 0xff, + 0x78, 0x4c, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x39, 0xc7, 0x75, 0x1a, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf0, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xff, 0x79, 0xb4, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: JUMP_TARGET + // 10: &PyDict_Contains+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: OPARG + // 28: &_Py_FalseStruct+0x0 + // 30: CONTINUE + // 38: &_Py_TrueStruct+0x0 + // 40: ERROR_TARGET + const unsigned char data_body[72] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&PyDict_Contains); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x40, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x92, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0xa5, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xae, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc1, (uintptr_t)data + 0x3c); +} + +void +emit__CONTAINS_OP_SET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONTAINS_OP_SET.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 48 8b 46 08 movq 0x8(%rsi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PySet_Type + // 13: 0f 94 c1 sete %cl + // 16: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp_PyFrozenSet_Type + // 1d: 0f 94 c0 sete %al + // 20: 08 c8 orb %cl, %al + // 22: 74 6f je 0x93 <_JIT_ENTRY+0x93> + // 24: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 48 89 f1 movq %rsi, %rcx + // 30: 48 89 da movq %rbx, %rdx + // 33: ff 15 00 00 00 00 callq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: IMAGE_REL_AMD64_REL32 __imp__PySet_Contains + // 39: 89 c7 movl %eax, %edi + // 3b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 40: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 49: 8b 03 movl (%rbx), %eax + // 4b: 85 c0 testl %eax, %eax + // 4d: 78 0f js 0x5e <_JIT_ENTRY+0x5e> + // 4f: ff c8 decl %eax + // 51: 89 03 movl %eax, (%rbx) + // 53: 75 09 jne 0x5e <_JIT_ENTRY+0x5e> + // 55: 48 89 d9 movq %rbx, %rcx + // 58: ff 15 00 00 00 00 callq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 5e: 8b 06 movl (%rsi), %eax + // 60: 85 c0 testl %eax, %eax + // 62: 78 06 js 0x6a <_JIT_ENTRY+0x6a> + // 64: ff c8 decl %eax + // 66: 89 06 movl %eax, (%rsi) + // 68: 74 4e je 0xb8 <_JIT_ENTRY+0xb8> + // 6a: 85 ff testl %edi, %edi + // 6c: 78 57 js 0xc5 <_JIT_ENTRY+0xc5> + // 6e: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x75 <_JIT_ENTRY+0x75> + // 0000000000000071: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 75: 39 c7 cmpl %eax, %edi + // 77: 75 25 jne 0x9e <_JIT_ENTRY+0x9e> + // 79: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x80 <_JIT_ENTRY+0x80> + // 000000000000007c: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 80: 49 89 45 f0 movq %rax, -0x10(%r13) + // 84: 49 83 c5 f8 addq $-0x8, %r13 + // 88: 48 83 c4 28 addq $0x28, %rsp + // 8c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 93: 48 83 c4 28 addq $0x28, %rsp + // 97: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9e <_JIT_ENTRY+0x9e> + // 000000000000009a: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 9e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // a5: 49 89 45 f0 movq %rax, -0x10(%r13) + // a9: 49 83 c5 f8 addq $-0x8, %r13 + // ad: 48 83 c4 28 addq $0x28, %rsp + // b1: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb8 <_JIT_ENTRY+0xb8> + // 00000000000000b4: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // b8: 48 89 f1 movq %rsi, %rcx + // bb: ff 15 00 00 00 00 callq *(%rip) # 0xc1 <_JIT_ENTRY+0xc1> + // 00000000000000bd: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c1: 85 ff testl %edi, %edi + // c3: 79 a9 jns 0x6e <_JIT_ENTRY+0x6e> + // c5: 49 83 c5 f0 addq $-0x10, %r13 + // c9: 48 83 c4 28 addq $0x28, %rsp + // cd: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[212] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x48, 0x8b, 0x46, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc1, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x94, 0xc0, + 0x08, 0xc8, 0x74, 0x6f, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0x48, 0x89, 0xda, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xd9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, + 0x74, 0x4e, 0x85, 0xff, 0x78, 0x57, 0x0f, 0xb7, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc7, 0x75, + 0x25, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0xf0, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xff, 0x79, 0xa9, 0x49, 0x83, 0xc5, + 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySet_Type+0x0 + // 8: &PyFrozenSet_Type+0x0 + // 10: &_PySet_Contains+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: OPARG + // 28: &_Py_FalseStruct+0x0 + // 30: CONTINUE + // 38: JUMP_TARGET + // 40: &_Py_TrueStruct+0x0 + // 48: ERROR_TARGET + const unsigned char data_body[80] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySet_Type); + patch_64(data + 0x8, (uintptr_t)&PyFrozenSet_Type); + patch_64(data + 0x10, (uintptr_t)&_PySet_Contains); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x40, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x48, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x71, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x7c, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x9a, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0xb4, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + 0x44); +} + +void +emit__CONVERT_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CONVERT_VALUE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp__PyEval_ConversionFuncs + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 89 f1 movq %rsi, %rcx + // 1e: ff 14 c2 callq *(%rdx,%rax,8) + // 21: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 27: 8b 0e movl (%rsi), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 06 js 0x33 <_JIT_ENTRY+0x33> + // 2d: ff c9 decl %ecx + // 2f: 89 0e movl %ecx, (%rsi) + // 31: 74 26 je 0x59 <_JIT_ENTRY+0x59> + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 48 85 c0 testq %rax, %rax + // 44: 74 35 je 0x7b <_JIT_ENTRY+0x7b> + // 46: 49 89 45 00 movq %rax, (%r13) + // 4a: 49 83 c5 08 addq $0x8, %r13 + // 4e: 48 83 c4 28 addq $0x28, %rsp + // 52: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 59: 48 89 f1 movq %rsi, %rcx + // 5c: 48 89 c6 movq %rax, %rsi + // 5f: ff 15 00 00 00 00 callq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 65: 48 89 f0 movq %rsi, %rax + // 68: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 76: 48 85 c0 testq %rax, %rax + // 79: 75 cb jne 0x46 <_JIT_ENTRY+0x46> + // 7b: 48 83 c4 28 addq $0x28, %rsp + // 7f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[134] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0xff, 0x14, + 0xc2, 0x49, 0x83, 0x44, 0x24, 0x40, 0xf8, 0x8b, + 0x0e, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0e, 0x74, 0x26, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x35, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0x48, 0x89, 0xc6, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf0, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xc0, 0x75, 0xcb, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ConversionFuncs+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ConversionFuncs); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0x1c); +} + +void +emit__COPY( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: c1 e0 03 shll $0x3, %eax + // a: 4c 89 e9 movq %r13, %rcx + // d: 48 29 c1 subq %rax, %rcx + // 10: 48 8b 01 movq (%rcx), %rax + // 13: 8b 08 movl (%rax), %ecx + // 15: 85 c9 testl %ecx, %ecx + // 17: 78 04 js 0x1d <_JIT_ENTRY+0x1d> + // 19: ff c1 incl %ecx + // 1b: 89 08 movl %ecx, (%rax) + // 1d: 49 89 45 00 movq %rax, (%r13) + // 21: 49 83 c5 08 addq $0x8, %r13 + // 25: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[37] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x03, 0x4c, 0x89, 0xe9, 0x48, 0x29, 0xc1, + 0x48, 0x8b, 0x01, 0x8b, 0x08, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__COPY_FREE_VARS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _COPY_FREE_VARS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 66 85 c0 testw %ax, %ax + // a: 74 45 je 0x51 <_JIT_ENTRY+0x51> + // c: 49 8b 04 24 movq (%r12), %rax + // 10: 49 8b 4c 24 10 movq 0x10(%r12), %rcx + // 15: 8b 40 48 movl 0x48(%rax), %eax + // 18: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1f: 0f b7 f2 movzwl %dx, %esi + // 22: 29 f0 subl %esi, %eax + // 24: 48 8b 49 48 movq 0x48(%rcx), %rcx + // 28: 48 98 cltq + // 2a: 0f b7 d2 movzwl %dx, %edx + // 2d: 66 83 fa 01 cmpw $0x1, %dx + // 31: 75 25 jne 0x58 <_JIT_ENTRY+0x58> + // 33: 31 f6 xorl %esi, %esi + // 35: f6 c2 01 testb $0x1, %dl + // 38: 74 17 je 0x51 <_JIT_ENTRY+0x51> + // 3a: 48 8b 4c f1 18 movq 0x18(%rcx,%rsi,8), %rcx + // 3f: 48 01 f0 addq %rsi, %rax + // 42: 8b 11 movl (%rcx), %edx + // 44: 85 d2 testl %edx, %edx + // 46: 78 04 js 0x4c <_JIT_ENTRY+0x4c> + // 48: ff c2 incl %edx + // 4a: 89 11 movl %edx, (%rcx) + // 4c: 49 89 4c c4 50 movq %rcx, 0x50(%r12,%rax,8) + // 51: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 58: 89 d7 movl %edx, %edi + // 5a: 83 e7 fe andl $-0x2, %edi + // 5d: 4d 8d 04 c4 leaq (%r12,%rax,8), %r8 + // 61: 49 83 c0 58 addq $0x58, %r8 + // 65: 31 f6 xorl %esi, %esi + // 67: eb 14 jmp 0x7d <_JIT_ENTRY+0x7d> + // 69: 0f 1f 80 00 00 00 00 nopl (%rax) + // 70: 4d 89 0c f0 movq %r9, (%r8,%rsi,8) + // 74: 48 83 c6 02 addq $0x2, %rsi + // 78: 48 39 f7 cmpq %rsi, %rdi + // 7b: 74 b8 je 0x35 <_JIT_ENTRY+0x35> + // 7d: 4c 8b 4c f1 18 movq 0x18(%rcx,%rsi,8), %r9 + // 82: 41 8b 19 movl (%r9), %ebx + // 85: 85 db testl %ebx, %ebx + // 87: 78 05 js 0x8e <_JIT_ENTRY+0x8e> + // 89: ff c3 incl %ebx + // 8b: 41 89 19 movl %ebx, (%r9) + // 8e: 4d 89 4c f0 f8 movq %r9, -0x8(%r8,%rsi,8) + // 93: 4c 8b 4c f1 20 movq 0x20(%rcx,%rsi,8), %r9 + // 98: 41 8b 19 movl (%r9), %ebx + // 9b: 85 db testl %ebx, %ebx + // 9d: 78 d1 js 0x70 <_JIT_ENTRY+0x70> + // 9f: ff c3 incl %ebx + // a1: 41 89 19 movl %ebx, (%r9) + // a4: eb ca jmp 0x70 <_JIT_ENTRY+0x70> + const unsigned char code_body[166] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x74, 0x45, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x4c, 0x24, 0x10, 0x8b, 0x40, 0x48, + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xf2, 0x29, 0xf0, 0x48, 0x8b, 0x49, 0x48, + 0x48, 0x98, 0x0f, 0xb7, 0xd2, 0x66, 0x83, 0xfa, + 0x01, 0x75, 0x25, 0x31, 0xf6, 0xf6, 0xc2, 0x01, + 0x74, 0x17, 0x48, 0x8b, 0x4c, 0xf1, 0x18, 0x48, + 0x01, 0xf0, 0x8b, 0x11, 0x85, 0xd2, 0x78, 0x04, + 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4c, 0xc4, + 0x50, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x89, 0xd7, 0x83, 0xe7, 0xfe, 0x4d, 0x8d, 0x04, + 0xc4, 0x49, 0x83, 0xc0, 0x58, 0x31, 0xf6, 0xeb, + 0x14, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x0c, 0xf0, 0x48, 0x83, 0xc6, 0x02, + 0x48, 0x39, 0xf7, 0x74, 0xb8, 0x4c, 0x8b, 0x4c, + 0xf1, 0x18, 0x41, 0x8b, 0x19, 0x85, 0xdb, 0x78, + 0x05, 0xff, 0xc3, 0x41, 0x89, 0x19, 0x4d, 0x89, + 0x4c, 0xf0, 0xf8, 0x4c, 0x8b, 0x4c, 0xf1, 0x20, + 0x41, 0x8b, 0x19, 0x85, 0xdb, 0x78, 0xd1, 0xff, + 0xc3, 0x41, 0x89, 0x19, 0xeb, 0xca, + }; + // 0: OPARG + // 8: CONTINUE + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x4); +} + +void +emit__CREATE_INIT_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _CREATE_INIT_FRAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 38 subq $0x38, %rsp + // 4: 4c 89 e8 movq %r13, %rax + // 7: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xe <_JIT_ENTRY+0xe> + // 000000000000000a: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // e: 8d 14 cd 00 00 00 00 leal (,%rcx,8), %edx + // 15: 4d 89 e9 movq %r13, %r9 + // 18: 49 29 d1 subq %rdx, %r9 + // 1b: 89 ca movl %ecx, %edx + // 1d: f7 d2 notl %edx + // 1f: 48 63 fa movslq %edx, %rdi + // 22: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 27: 29 ca subl %ecx, %edx + // 29: 4c 63 ea movslq %edx, %r13 + // 2c: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 31: 49 8b b6 e8 00 00 00 movq 0xe8(%r14), %rsi + // 38: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__Py_InitCleanup + // 3f: 4c 63 42 4c movslq 0x4c(%rdx), %r8 + // 43: 4e 8d 04 c6 leaq (%rsi,%r8,8), %r8 + // 47: 4d 89 86 e8 00 00 00 movq %r8, 0xe8(%r14) + // 4e: 4c 89 66 08 movq %r12, 0x8(%rsi) + // 52: 4c 8b 05 00 00 00 00 movq (%rip), %r8 # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 59: 4c 89 46 10 movq %r8, 0x10(%rsi) + // 5d: 48 89 16 movq %rdx, (%rsi) + // 60: 0f 57 c0 xorps %xmm0, %xmm0 + // 63: 0f 11 46 28 movups %xmm0, 0x28(%rsi) + // 67: 4c 63 42 48 movslq 0x48(%rdx), %r8 + // 6b: 4e 8d 04 c6 leaq (%rsi,%r8,8), %r8 + // 6f: 49 83 c0 58 addq $0x58, %r8 + // 73: 4c 89 46 40 movq %r8, 0x40(%rsi) + // 77: 48 81 c2 d0 00 00 00 addq $0xd0, %rdx + // 7e: 48 89 56 38 movq %rdx, 0x38(%rsi) + // 82: c7 46 48 00 00 00 00 movl $0x0, 0x48(%rsi) + // 89: 49 8b 54 24 40 movq 0x40(%r12), %rdx + // 8e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 97: 48 8b 3c f8 movq (%rax,%rdi,8), %rdi + // 9b: 8b 1f movl (%rdi), %ebx + // 9d: 85 db testl %ebx, %ebx + // 9f: 78 04 js 0xa5 <_JIT_ENTRY+0xa5> + // a1: ff c3 incl %ebx + // a3: 89 1f movl %ebx, (%rdi) + // a5: 48 89 7e 50 movq %rdi, 0x50(%rsi) + // a9: 49 89 54 24 40 movq %rdx, 0x40(%r12) + // ae: ff c1 incl %ecx + // b0: 49 83 c1 f8 addq $-0x8, %r9 + // b4: 4a 8b 14 e8 movq (%rax,%r13,8), %rdx + // b8: 49 c1 e5 03 shlq $0x3, %r13 + // bc: 48 89 74 24 30 movq %rsi, 0x30(%rsp) + // c1: 48 89 4c 24 20 movq %rcx, 0x20(%rsp) + // c6: 48 c7 44 24 28 00 00 00 00 movq $0x0, 0x28(%rsp) + // cf: 4c 89 f1 movq %r14, %rcx + // d2: 45 31 c0 xorl %r8d, %r8d + // d5: ff 15 00 00 00 00 callq *(%rip) # 0xdb <_JIT_ENTRY+0xdb> + // 00000000000000d7: IMAGE_REL_AMD64_REL32 __imp__PyEvalFramePushAndInit + // db: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // e0: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // e9: 48 85 c0 testq %rax, %rax + // ec: 74 1f je 0x10d <_JIT_ENTRY+0x10d> + // ee: 66 41 c7 44 24 48 04 00 movw $0x4, 0x48(%r12) + // f6: 41 ff 4e 2c decl 0x2c(%r14) + // fa: 49 89 45 00 movq %rax, (%r13) + // fe: 49 83 c5 08 addq $0x8, %r13 + // 102: 48 83 c4 38 addq $0x38, %rsp + // 106: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x10d <_JIT_ENTRY+0x10d> + // 0000000000000109: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 10d: 4c 89 f1 movq %r14, %rcx + // 110: 48 89 f2 movq %rsi, %rdx + // 113: ff 15 00 00 00 00 callq *(%rip) # 0x119 <_JIT_ENTRY+0x119> + // 0000000000000115: IMAGE_REL_AMD64_REL32 __imp__PyEval_FrameClearAndPop + // 119: 48 83 c4 38 addq $0x38, %rsp + // 11d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x124 <_JIT_ENTRY+0x124> + // 0000000000000120: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[292] = { + 0x48, 0x83, 0xec, 0x38, 0x4c, 0x89, 0xe8, 0x0f, + 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x14, + 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0xe9, + 0x49, 0x29, 0xd1, 0x89, 0xca, 0xf7, 0xd2, 0x48, + 0x63, 0xfa, 0xba, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xca, 0x4c, 0x63, 0xea, 0x49, 0x89, 0x44, 0x24, + 0x40, 0x49, 0x8b, 0xb6, 0xe8, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x63, 0x42, 0x4c, 0x4e, 0x8d, 0x04, 0xc6, 0x4d, + 0x89, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x66, 0x08, 0x4c, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0x46, 0x10, 0x48, 0x89, 0x16, + 0x0f, 0x57, 0xc0, 0x0f, 0x11, 0x46, 0x28, 0x4c, + 0x63, 0x42, 0x48, 0x4e, 0x8d, 0x04, 0xc6, 0x49, + 0x83, 0xc0, 0x58, 0x4c, 0x89, 0x46, 0x40, 0x48, + 0x81, 0xc2, 0xd0, 0x00, 0x00, 0x00, 0x48, 0x89, + 0x56, 0x38, 0xc7, 0x46, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x54, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x3c, 0xf8, 0x8b, 0x1f, 0x85, 0xdb, 0x78, + 0x04, 0xff, 0xc3, 0x89, 0x1f, 0x48, 0x89, 0x7e, + 0x50, 0x49, 0x89, 0x54, 0x24, 0x40, 0xff, 0xc1, + 0x49, 0x83, 0xc1, 0xf8, 0x4a, 0x8b, 0x14, 0xe8, + 0x49, 0xc1, 0xe5, 0x03, 0x48, 0x89, 0x74, 0x24, + 0x30, 0x48, 0x89, 0x4c, 0x24, 0x20, 0x48, 0xc7, + 0x44, 0x24, 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf1, 0x45, 0x31, 0xc0, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x03, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1f, 0x66, 0x41, + 0xc7, 0x44, 0x24, 0x48, 0x04, 0x00, 0x41, 0xff, + 0x4e, 0x2c, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x38, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, + 0x48, 0x89, 0xf2, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x38, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_Py_InitCleanup+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &_PyEvalFramePushAndInit+0x0 + // 20: CONTINUE + // 28: &_PyEval_FrameClearAndPop+0x0 + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_InitCleanup); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_PyEval_FrameClearAndPop); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x109, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x115, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x120, (uintptr_t)data + 0x2c); +} + +void +emit__DELETE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_ATTR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 48 8b 40 20 movq 0x20(%rax), %rax + // 10: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 17: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 48 89 f1 movq %rsi, %rcx + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp_PyObject_DelAttr + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 8b 0e movl (%rsi), %ecx + // 3a: 85 c9 testl %ecx, %ecx + // 3c: 78 06 js 0x44 <_JIT_ENTRY+0x44> + // 3e: ff c9 decl %ecx + // 40: 89 0e movl %ecx, (%rsi) + // 42: 74 13 je 0x57 <_JIT_ENTRY+0x57> + // 44: 49 83 c5 f8 addq $-0x8, %r13 + // 48: 48 83 c4 28 addq $0x28, %rsp + // 4c: 85 c0 testl %eax, %eax + // 4e: 74 20 je 0x70 <_JIT_ENTRY+0x70> + // 50: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 57: 48 89 f1 movq %rsi, %rcx + // 5a: 89 c6 movl %eax, %esi + // 5c: ff 15 00 00 00 00 callq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 62: 89 f0 movl %esi, %eax + // 64: 49 83 c5 f8 addq $-0x8, %r13 + // 68: 48 83 c4 28 addq $0x28, %rsp + // 6c: 85 c0 testl %eax, %eax + // 6e: 75 e0 jne 0x50 <_JIT_ENTRY+0x50> + // 70: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[112] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x20, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x54, 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0e, 0x74, 0x13, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, 0x74, 0x20, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf0, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, 0x75, 0xe0, + }; + // 0: OPARG + // 8: &PyObject_DelAttr+0x0 + // 10: ERROR_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_DelAttr); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0x14); +} + +void +emit__DELETE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_DEREF.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 10: 48 8b 48 10 movq 0x10(%rax), %rcx + // 14: 48 c7 40 10 00 00 00 00 movq $0x0, 0x10(%rax) + // 1c: 48 85 c9 testq %rcx, %rcx + // 1f: 74 2a je 0x4b <_JIT_ENTRY+0x4b> + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 8b 01 movl (%rcx), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 06 js 0x32 <_JIT_ENTRY+0x32> + // 2c: ff c8 decl %eax + // 2e: 89 01 movl %eax, (%rcx) + // 30: 74 4c je 0x7e <_JIT_ENTRY+0x7e> + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4b: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 53: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 58: 49 8b 14 24 movq (%r12), %rdx + // 5c: 4c 89 f1 movq %r14, %rcx + // 5f: ff 15 00 00 00 00 callq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcUnbound + // 65: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 73: 48 83 c4 28 addq $0x28, %rsp + // 77: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 7e: ff 15 00 00 00 00 callq *(%rip) # 0x84 <_JIT_ENTRY+0x84> + // 0000000000000080: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 84: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 89: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 92: 48 83 c4 28 addq $0x28, %rsp + // 96: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9d <_JIT_ENTRY+0x9d> + // 0000000000000099: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[150] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x44, 0xc4, 0x50, + 0x48, 0x8b, 0x48, 0x10, 0x48, 0xc7, 0x40, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, + 0x2a, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, + 0x74, 0x4c, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x49, 0x8b, 0x14, 0x24, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_PyEval_FormatExcUnbound+0x0 + // 18: ERROR_TARGET + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x80, (uintptr_t)data + 0x1c); +} + +void +emit__DELETE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_FAST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 0f b7 d0 movzwl %ax, %edx + // e: 0f b7 c0 movzwl %ax, %eax + // 11: 49 8b 4c c4 50 movq 0x50(%r12,%rax,8), %rcx + // 16: 48 85 c9 testq %rcx, %rcx + // 19: 74 33 je 0x4e <_JIT_ENTRY+0x4e> + // 1b: 49 c7 44 d4 50 00 00 00 00 movq $0x0, 0x50(%r12,%rdx,8) + // 24: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 29: 8b 01 movl (%rcx), %eax + // 2b: 85 c0 testl %eax, %eax + // 2d: 78 06 js 0x35 <_JIT_ENTRY+0x35> + // 2f: ff c8 decl %eax + // 31: 89 01 movl %eax, (%rcx) + // 33: 74 62 je 0x97 <_JIT_ENTRY+0x97> + // 35: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 43: 48 83 c4 28 addq $0x28, %rsp + // 47: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 53: 49 8b 04 24 movq (%r12), %rax + // 57: 48 8b 48 60 movq 0x60(%rax), %rcx + // 5b: ff 15 00 00 00 00 callq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: IMAGE_REL_AMD64_REL32 __imp_PyTuple_GetItem + // 61: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x68 <_JIT_ENTRY+0x68> + // 0000000000000064: IMAGE_REL_AMD64_REL32 __imp_PyExc_UnboundLocalError + // 68: 48 8b 11 movq (%rcx), %rdx + // 6b: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: IMAGE_REL_AMD64_REL32 ??_C@_0EK@CHGBBAMA@cannot?5access?5local?5variable?5?8?$CFs@ + // 72: 4c 89 f1 movq %r14, %rcx + // 75: 49 89 c1 movq %rax, %r9 + // 78: ff 15 00 00 00 00 callq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcCheckArg + // 7e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 83: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8c: 48 83 c4 28 addq $0x28, %rsp + // 90: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x97 <_JIT_ENTRY+0x97> + // 0000000000000093: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 97: ff 15 00 00 00 00 callq *(%rip) # 0x9d <_JIT_ENTRY+0x9d> + // 0000000000000099: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 9d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a2: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ab: 48 83 c4 28 addq $0x28, %rsp + // af: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb6 <_JIT_ENTRY+0xb6> + // 00000000000000b2: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[175] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd0, 0x0f, 0xb7, + 0xc0, 0x49, 0x8b, 0x4c, 0xc4, 0x50, 0x48, 0x85, + 0xc9, 0x74, 0x33, 0x49, 0xc7, 0x44, 0xd4, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x01, 0x74, 0x62, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x04, 0x24, 0x48, + 0x8b, 0x48, 0x60, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x11, 0x4c, 0x8d, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0xf1, 0x49, 0x89, 0xc1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: OPARG + // 58: CONTINUE + // 60: &PyTuple_GetItem+0x0 + // 68: &PyExc_UnboundLocalError+0x0 + // 70: &_PyEval_FormatExcCheckArg+0x0 + // 78: ERROR_TARGET + // 80: &_Py_Dealloc+0x0 + const unsigned char data_body[136] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, instruction->oparg); + patch_64(data + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x60, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x68, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x70, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x78, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x80, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x64, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0x99, (uintptr_t)data + 0x7c); +} + +void +emit__DELETE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_GLOBAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 49 8b 4c 24 18 movq 0x18(%r12), %rcx + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 18: 48 8b 74 d0 18 movq 0x18(%rax,%rdx,8), %rsi + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 89 f2 movq %rsi, %rdx + // 25: 45 31 c0 xorl %r8d, %r8d + // 28: ff 15 00 00 00 00 callq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp_PyDict_Pop + // 2e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 33: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3c: 85 c0 testl %eax, %eax + // 3e: 78 0d js 0x4d <_JIT_ENTRY+0x4d> + // 40: 74 16 je 0x58 <_JIT_ENTRY+0x58> + // 42: 48 83 c4 28 addq $0x28, %rsp + // 46: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4d <_JIT_ENTRY+0x4d> + // 0000000000000049: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4d: 48 83 c4 28 addq $0x28, %rsp + // 51: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 58: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 5d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp_PyExc_NameError + // 64: 48 8b 10 movq (%rax), %rdx + // 67: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: IMAGE_REL_AMD64_REL32 ??_C@_0BN@DBLGJMNF@name?5?8?$CF?4200s?8?5is?5not?5defined?$AA@ + // 6e: 4c 89 f1 movq %r14, %rcx + // 71: 49 89 f1 movq %rsi, %r9 + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcCheckArg + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 48 83 c4 28 addq $0x28, %rsp + // 8c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[147] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x4c, 0x24, 0x18, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x74, 0xd0, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xf2, 0x45, 0x31, 0xc0, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x0d, + 0x74, 0x16, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x10, 0x4c, + 0x8d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf1, 0x49, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: "name '%.200s' is not defined\x00" + // 1d: 00 00 00 + // 20: OPARG + // 28: &PyDict_Pop+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + // 40: &PyExc_NameError+0x0 + // 48: &_PyEval_FormatExcCheckArg+0x0 + const unsigned char data_body[80] = { + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 0x2e, + 0x32, 0x30, 0x30, 0x73, 0x27, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&PyDict_Pop); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x40, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x48, (uintptr_t)&_PyEval_FormatExcCheckArg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x49, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x34); +} + +void +emit__DELETE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_NAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 49 8b 4c 24 28 movq 0x28(%r12), %rcx + // d: 48 8b 40 20 movq 0x20(%rax), %rax + // 11: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 18: 48 8b 74 d0 18 movq 0x18(%rax,%rdx,8), %rsi + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 85 c9 testq %rcx, %rcx + // 25: 74 56 je 0x7d <_JIT_ENTRY+0x7d> + // 27: 48 89 f2 movq %rsi, %rdx + // 2a: ff 15 00 00 00 00 callq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp_PyObject_DelItem + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 85 c0 testl %eax, %eax + // 40: 74 71 je 0xb3 <_JIT_ENTRY+0xb3> + // 42: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 47: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp_PyExc_NameError + // 4e: 48 8b 10 movq (%rax), %rdx + // 51: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: IMAGE_REL_AMD64_REL32 ??_C@_0BN@DBLGJMNF@name?5?8?$CF?4200s?8?5is?5not?5defined?$AA@ + // 58: 4c 89 f1 movq %r14, %rcx + // 5b: 49 89 f1 movq %rsi, %r9 + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcCheckArg + // 64: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 69: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 72: 48 83 c4 28 addq $0x28, %rsp + // 76: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 7d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x84 <_JIT_ENTRY+0x84> + // 0000000000000080: IMAGE_REL_AMD64_REL32 __imp_PyExc_SystemError + // 84: 48 8b 10 movq (%rax), %rdx + // 87: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: IMAGE_REL_AMD64_REL32 ??_C@_0BL@HJKLBJNK@no?5locals?5when?5deleting?5?$CFR?$AA@ + // 8e: 4c 89 f1 movq %r14, %rcx + // 91: 49 89 f1 movq %rsi, %r9 + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // 9a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a8: 48 83 c4 28 addq $0x28, %rsp + // ac: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // b3: 48 83 c4 28 addq $0x28, %rsp + // b7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbe <_JIT_ENTRY+0xbe> + // 00000000000000ba: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[183] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x04, 0x24, + 0x49, 0x8b, 0x4c, 0x24, 0x28, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x74, 0xd0, 0x18, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x56, 0x48, + 0x89, 0xf2, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, + 0x74, 0x71, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x10, 0x4c, 0x8d, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0xf1, 0x49, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x10, 0x4c, + 0x8d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0xf1, 0x49, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: "no locals when deleting %R\x00name '%.200s' is not defined\x00" + // 38: OPARG + // 40: &PyObject_DelItem+0x0 + // 48: &PyExc_NameError+0x0 + // 50: &_PyEval_FormatExcCheckArg+0x0 + // 58: ERROR_TARGET + // 60: &PyExc_SystemError+0x0 + // 68: &_PyErr_Format+0x0 + const unsigned char data_body[112] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x52, 0x00, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x38, instruction->oparg); + patch_64(data + 0x40, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x48, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x50, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x58, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x60, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x68, (uintptr_t)&_PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x17); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x80, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0x54); +} + +void +emit__DELETE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DELETE_SUBSCR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 89 d9 movq %rbx, %rcx + // 14: 48 89 f2 movq %rsi, %rdx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp_PyObject_DelItem + // 1d: 89 c7 movl %eax, %edi + // 1f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 24: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2d: 8b 03 movl (%rbx), %eax + // 2f: 85 c0 testl %eax, %eax + // 31: 78 0f js 0x42 <_JIT_ENTRY+0x42> + // 33: ff c8 decl %eax + // 35: 89 03 movl %eax, (%rbx) + // 37: 75 09 jne 0x42 <_JIT_ENTRY+0x42> + // 39: 48 89 d9 movq %rbx, %rcx + // 3c: ff 15 00 00 00 00 callq *(%rip) # 0x42 <_JIT_ENTRY+0x42> + // 000000000000003e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 42: 8b 06 movl (%rsi), %eax + // 44: 85 c0 testl %eax, %eax + // 46: 78 06 js 0x4e <_JIT_ENTRY+0x4e> + // 48: ff c8 decl %eax + // 4a: 89 06 movl %eax, (%rsi) + // 4c: 74 13 je 0x61 <_JIT_ENTRY+0x61> + // 4e: 49 83 c5 f0 addq $-0x10, %r13 + // 52: 48 83 c4 28 addq $0x28, %rsp + // 56: 85 ff testl %edi, %edi + // 58: 74 1c je 0x76 <_JIT_ENTRY+0x76> + // 5a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 61: 48 89 f1 movq %rsi, %rcx + // 64: ff 15 00 00 00 00 callq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6a: 49 83 c5 f0 addq $-0x10, %r13 + // 6e: 48 83 c4 28 addq $0x28, %rsp + // 72: 85 ff testl %edi, %edi + // 74: 75 e4 jne 0x5a <_JIT_ENTRY+0x5a> + // 76: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[118] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xd9, 0x48, 0x89, 0xf2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xc7, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x06, 0x74, 0x13, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xff, + 0x74, 0x1c, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, + 0xc4, 0x28, 0x85, 0xff, 0x75, 0xe4, + }; + // 0: &PyObject_DelItem+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_DelItem); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0x4); +} + +void +emit__DEOPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DEOPT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 7: 49 89 86 08 01 00 00 movq %rax, 0x108(%r14) + // e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 13: 49 8b 04 24 movq (%r12), %rax + // 17: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_TARGET + // 1d: 48 8d 04 48 leaq (%rax,%rcx,2), %rax + // 21: 48 05 d0 00 00 00 addq $0xd0, %rax + // 27: c3 retq + const unsigned char code_body[40] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x86, 0x08, 0x01, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x04, 0x24, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x04, + 0x48, 0x48, 0x05, 0xd0, 0x00, 0x00, 0x00, 0xc3, + }; + // 0: EXECUTOR + // 8: TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->target); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); +} + +void +emit__DICT_MERGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_MERGE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 49 8b 75 f8 movq -0x8(%r13), %rsi + // f: ba fc ff ff ff movl $0xfffffffc, %edx # imm = 0xFFFFFFFC + // 14: 29 c2 subl %eax, %edx + // 16: f7 d0 notl %eax + // 18: 48 98 cltq + // 1a: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 1f: 48 63 c2 movslq %edx, %rax + // 22: 49 8b 7c c5 00 movq (%r13,%rax,8), %rdi + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 48 89 f2 movq %rsi, %rdx + // 2f: 41 b8 02 00 00 00 movl $0x2, %r8d + // 35: ff 15 00 00 00 00 callq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: IMAGE_REL_AMD64_REL32 __imp__PyDict_MergeEx + // 3b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 40: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 49: 85 c0 testl %eax, %eax + // 4b: 78 1b js 0x68 <_JIT_ENTRY+0x68> + // 4d: 8b 06 movl (%rsi), %eax + // 4f: 85 c0 testl %eax, %eax + // 51: 78 06 js 0x59 <_JIT_ENTRY+0x59> + // 53: ff c8 decl %eax + // 55: 89 06 movl %eax, (%rsi) + // 57: 74 4c je 0xa5 <_JIT_ENTRY+0xa5> + // 59: 49 83 c5 f8 addq $-0x8, %r13 + // 5d: 48 83 c4 28 addq $0x28, %rsp + // 61: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x68 <_JIT_ENTRY+0x68> + // 0000000000000064: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 68: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6d: 4c 89 f1 movq %r14, %rcx + // 70: 48 89 fa movq %rdi, %rdx + // 73: 49 89 f0 movq %rsi, %r8 + // 76: ff 15 00 00 00 00 callq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatKwargsError + // 7c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 81: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8a: 8b 06 movl (%rsi), %eax + // 8c: 85 c0 testl %eax, %eax + // 8e: 78 06 js 0x96 <_JIT_ENTRY+0x96> + // 90: ff c8 decl %eax + // 92: 89 06 movl %eax, (%rsi) + // 94: 74 27 je 0xbd <_JIT_ENTRY+0xbd> + // 96: 49 83 c5 f8 addq $-0x8, %r13 + // 9a: 48 83 c4 28 addq $0x28, %rsp + // 9e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // a5: 48 89 f1 movq %rsi, %rcx + // a8: ff 15 00 00 00 00 callq *(%rip) # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ae: 49 83 c5 f8 addq $-0x8, %r13 + // b2: 48 83 c4 28 addq $0x28, %rsp + // b6: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbd <_JIT_ENTRY+0xbd> + // 00000000000000b9: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // bd: 48 89 f1 movq %rsi, %rcx + // c0: ff 15 00 00 00 00 callq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c6: 49 83 c5 f8 addq $-0x8, %r13 + // ca: 48 83 c4 28 addq $0x28, %rsp + // ce: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd5 <_JIT_ENTRY+0xd5> + // 00000000000000d1: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[213] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf8, 0xba, + 0xfc, 0xff, 0xff, 0xff, 0x29, 0xc2, 0xf7, 0xd0, + 0x48, 0x98, 0x49, 0x8b, 0x4c, 0xc5, 0x00, 0x48, + 0x63, 0xc2, 0x49, 0x8b, 0x7c, 0xc5, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf2, 0x41, + 0xb8, 0x02, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x85, 0xc0, 0x78, 0x1b, 0x8b, 0x06, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, + 0x4c, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf1, + 0x48, 0x89, 0xfa, 0x49, 0x89, 0xf0, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x06, 0x74, 0x27, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyDict_MergeEx+0x0 + // 10: CONTINUE + // 18: &_PyEval_FormatKwargsError+0x0 + // 20: ERROR_TARGET + // 28: &_Py_Dealloc+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_MergeEx); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_PyEval_FormatKwargsError); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x64, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x78, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xb9, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xd1, (uintptr_t)data + 0x1c); +} + +void +emit__DICT_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _DICT_UPDATE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax # 0xa <_JIT_ENTRY+0xa> + // 0000000000000006: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // a: f7 d0 notl %eax + // c: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 19: 49 8b 4c 05 00 movq (%r13,%rax), %rcx + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 f2 movq %rsi, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp_PyDict_Update + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 1f js 0x5d <_JIT_ENTRY+0x5d> + // 3e: 8b 06 movl (%rsi), %eax + // 40: 85 c0 testl %eax, %eax + // 42: 78 0a js 0x4e <_JIT_ENTRY+0x4e> + // 44: ff c8 decl %eax + // 46: 89 06 movl %eax, (%rsi) + // 48: 0f 84 89 00 00 00 je 0xd7 <_JIT_ENTRY+0xd7> + // 4e: 49 83 c5 f8 addq $-0x8, %r13 + // 52: 48 83 c4 28 addq $0x28, %rsp + // 56: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 5d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 62: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp_PyExc_AttributeError + // 69: 48 8b 10 movq (%rax), %rdx + // 6c: 4c 89 f1 movq %r14, %rcx + // 6f: ff 15 00 00 00 00 callq *(%rip) # 0x75 <_JIT_ENTRY+0x75> + // 0000000000000071: IMAGE_REL_AMD64_REL32 __imp__PyErr_ExceptionMatches + // 75: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 83: 85 c0 testl %eax, %eax + // 85: 74 35 je 0xbc <_JIT_ENTRY+0xbc> + // 87: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8c: 48 8b 46 08 movq 0x8(%rsi), %rax + // 90: 4c 8b 48 18 movq 0x18(%rax), %r9 + // 94: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x9b <_JIT_ENTRY+0x9b> + // 0000000000000097: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // 9b: 48 8b 10 movq (%rax), %rdx + // 9e: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: IMAGE_REL_AMD64_REL32 ??_C@_0CB@CMJMJEG@?8?$CF?4200s?8?5object?5is?5not?5a?5mapping@ + // a5: 4c 89 f1 movq %r14, %rcx + // a8: ff 15 00 00 00 00 callq *(%rip) # 0xae <_JIT_ENTRY+0xae> + // 00000000000000aa: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // ae: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b3: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // bc: 8b 06 movl (%rsi), %eax + // be: 85 c0 testl %eax, %eax + // c0: 78 06 js 0xc8 <_JIT_ENTRY+0xc8> + // c2: ff c8 decl %eax + // c4: 89 06 movl %eax, (%rsi) + // c6: 74 27 je 0xef <_JIT_ENTRY+0xef> + // c8: 49 83 c5 f8 addq $-0x8, %r13 + // cc: 48 83 c4 28 addq $0x28, %rsp + // d0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd7 <_JIT_ENTRY+0xd7> + // 00000000000000d3: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // d7: 48 89 f1 movq %rsi, %rcx + // da: ff 15 00 00 00 00 callq *(%rip) # 0xe0 <_JIT_ENTRY+0xe0> + // 00000000000000dc: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // e0: 49 83 c5 f8 addq $-0x8, %r13 + // e4: 48 83 c4 28 addq $0x28, %rsp + // e8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xef <_JIT_ENTRY+0xef> + // 00000000000000eb: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // ef: 48 89 f1 movq %rsi, %rcx + // f2: ff 15 00 00 00 00 callq *(%rip) # 0xf8 <_JIT_ENTRY+0xf8> + // 00000000000000f4: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // f8: 49 83 c5 f8 addq $-0x8, %r13 + // fc: 48 83 c4 28 addq $0x28, %rsp + // 100: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x107 <_JIT_ENTRY+0x107> + // 0000000000000103: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[263] = { + 0x48, 0x83, 0xec, 0x28, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x75, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x4c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf2, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x1f, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x0a, 0xff, 0xc8, 0x89, 0x06, + 0x0f, 0x84, 0x89, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x35, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x46, 0x08, + 0x4c, 0x8b, 0x48, 0x18, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x8d, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x27, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'%.200s' object is not a mapping\x00" + // 21: 00 00 00 00 00 00 00 + // 28: OPARG + // 30: &PyDict_Update+0x0 + // 38: CONTINUE + // 40: &PyExc_AttributeError+0x0 + // 48: &_PyErr_ExceptionMatches+0x0 + // 50: &PyExc_TypeError+0x0 + // 58: &_PyErr_Format+0x0 + // 60: ERROR_TARGET + // 68: &_Py_Dealloc+0x0 + const unsigned char data_body[112] = { + 0x27, 0x25, 0x2e, 0x32, 0x30, 0x30, 0x73, 0x27, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, instruction->oparg); + patch_64(data + 0x30, (uintptr_t)&PyDict_Update); + patch_64(data + 0x38, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x40, (uintptr_t)&PyExc_AttributeError); + patch_64(data + 0x48, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x50, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x58, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x60, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x68, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x71, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xaa, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xdc, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xeb, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0xf4, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x103, (uintptr_t)data + 0x5c); +} + +void +emit__END_FOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_FOR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 8b 01 movl (%rcx), %eax + // 13: 85 c0 testl %eax, %eax + // 15: 78 06 js 0x1d <_JIT_ENTRY+0x1d> + // 17: ff c8 decl %eax + // 19: 89 01 movl %eax, (%rcx) + // 1b: 74 19 je 0x36 <_JIT_ENTRY+0x36> + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 48 83 c4 28 addq $0x28, %rsp + // 2f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 36: ff 15 00 00 00 00 callq *(%rip) # 0x3c <_JIT_ENTRY+0x3c> + // 0000000000000038: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 3c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 41: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4a: 48 83 c4 28 addq $0x28, %rsp + // 4e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[78] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0x4); +} + +void +emit__END_SEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _END_SEND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 ee movq %r13, %rsi + // 7: 49 83 c5 f8 addq $-0x8, %r13 + // b: 48 8b 4e f0 movq -0x10(%rsi), %rcx + // f: 48 8b 7e f8 movq -0x8(%rsi), %rdi + // 13: 8b 01 movl (%rcx), %eax + // 15: 85 c0 testl %eax, %eax + // 17: 78 06 js 0x1f <_JIT_ENTRY+0x1f> + // 19: ff c8 decl %eax + // 1b: 89 01 movl %eax, (%rcx) + // 1d: 74 0f je 0x2e <_JIT_ENTRY+0x2e> + // 1f: 48 89 7e f0 movq %rdi, -0x10(%rsi) + // 23: 48 83 c4 28 addq $0x28, %rsp + // 27: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 2e: ff 15 00 00 00 00 callq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 34: 48 89 7e f0 movq %rdi, -0x10(%rsi) + // 38: 48 83 c4 28 addq $0x28, %rsp + // 3c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x43 <_JIT_ENTRY+0x43> + // 000000000000003f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[60] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xee, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x8b, 0x4e, 0xf0, 0x48, + 0x8b, 0x7e, 0xf8, 0x8b, 0x01, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x01, 0x74, 0x0f, 0x48, + 0x89, 0x7e, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x7e, 0xf0, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); +} + +void +emit__ERROR_POP_N( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ERROR_POP_N.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 7: 49 89 86 08 01 00 00 movq %rax, 0x108(%r14) + // e: 49 8b 04 24 movq (%r12), %rax + // 12: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 18: 48 8d 04 48 leaq (%rax,%rcx,2), %rax + // 1c: 48 05 d0 00 00 00 addq $0xd0, %rax + // 22: 49 89 44 24 38 movq %rax, 0x38(%r12) + // 27: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2c: 31 c0 xorl %eax, %eax + // 2e: c3 retq + const unsigned char code_body[47] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x86, 0x08, 0x01, 0x00, 0x00, 0x49, 0x8b, + 0x04, 0x24, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8d, 0x04, 0x48, 0x48, 0x05, 0xd0, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x44, 0x24, 0x38, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x31, 0xc0, 0xc3, + }; + // 0: EXECUTOR + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__EXIT_INIT_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_INIT_CHECK.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // f: 74 3d je 0x4e <_JIT_ENTRY+0x4e> + // 11: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 16: 48 8b 40 08 movq 0x8(%rax), %rax + // 1a: 4c 8b 40 18 movq 0x18(%rax), %r8 + // 1e: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // 25: 48 8b 08 movq (%rax), %rcx + // 28: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: IMAGE_REL_AMD64_REL32 ??_C@_0CM@HKPEOANK@__init__?$CI?$CJ?5should?5return?5None?0?5n@ + // 2f: ff 15 00 00 00 00 callq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: IMAGE_REL_AMD64_REL32 __imp_PyErr_Format + // 35: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 43: 48 83 c4 28 addq $0x28, %rsp + // 47: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 4e: 49 83 c5 f8 addq $-0x8, %r13 + // 52: 48 83 c4 28 addq $0x28, %rsp + // 56: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[86] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x3d, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x40, 0x08, 0x4c, 0x8b, 0x40, 0x18, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x08, + 0x48, 0x8d, 0x15, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: "__init__() should return None, not '%.200s'\x00" + // 2c: 00 00 00 00 + // 30: &_Py_NoneStruct+0x0 + // 38: &PyExc_TypeError+0x0 + // 40: &PyErr_Format+0x0 + // 48: ERROR_TARGET + const unsigned char data_body[80] = { + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x5f, + 0x28, 0x29, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x27, 0x25, 0x2e, 0x32, 0x30, + 0x30, 0x73, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x38, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x40, (uintptr_t)&PyErr_Format); + patch_64(data + 0x48, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x44); +} + +void +emit__EXIT_TRACE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXIT_TRACE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 1c 24 movq (%r12), %rbx + // 8: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // f: 8b 37 movl (%rdi), %esi + // 11: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 15: 48 85 c9 testq %rcx, %rcx + // 18: 0f 84 03 01 00 00 je 0x121 <_JIT_ENTRY+0x121> + // 1e: f6 41 22 01 testb $0x1, 0x22(%rcx) + // 22: 0f 85 c4 00 00 00 jne 0xec <_JIT_ENTRY+0xec> + // 28: 66 c7 47 04 fc ff movw $0xfffc, 0x4(%rdi) # imm = 0xFFFC + // 2e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 33: 48 c7 47 08 00 00 00 00 movq $0x0, 0x8(%rdi) + // 3b: 8b 01 movl (%rcx), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 0f 88 ce 00 00 00 js 0x113 <_JIT_ENTRY+0x113> + // 45: ff c8 decl %eax + // 47: 89 01 movl %eax, (%rcx) + // 49: 75 06 jne 0x51 <_JIT_ENTRY+0x51> + // 4b: ff 15 00 00 00 00 callq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 51: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 55: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 63: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 6a: 49 89 86 08 01 00 00 movq %rax, 0x108(%r14) + // 71: 48 85 c9 testq %rcx, %rcx + // 74: 0f 85 80 00 00 00 jne 0xfa <_JIT_ENTRY+0xfa> + // 7a: 48 8d 04 73 leaq (%rbx,%rsi,2), %rax + // 7e: 48 05 d0 00 00 00 addq $0xd0, %rax + // 84: 0f b7 77 04 movzwl 0x4(%rdi), %esi + // 88: 83 fe 0f cmpl $0xf, %esi + // 8b: 0f 83 b5 00 00 00 jae 0x146 <_JIT_ENTRY+0x146> + // 91: 80 38 ff cmpb $-0x1, (%rax) + // 94: 0f 84 bd 00 00 00 je 0x157 <_JIT_ENTRY+0x157> + // 9a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xa1 <_JIT_ENTRY+0xa1> + // 000000000000009d: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // a1: 44 0f b6 49 22 movzbl 0x22(%rcx), %r9d + // a6: 41 c1 e9 02 shrl $0x2, %r9d + // aa: 41 ff c1 incl %r9d + // ad: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // b2: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // b7: 4c 89 e1 movq %r12, %rcx + // ba: 48 89 c3 movq %rax, %rbx + // bd: 48 89 c2 movq %rax, %rdx + // c0: ff 15 00 00 00 00 callq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__PyOptimizer_Optimize + // c6: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // cb: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d4: 85 c0 testl %eax, %eax + // d6: 0f 8e a1 00 00 00 jle 0x17d <_JIT_ENTRY+0x17d> + // dc: 66 c7 47 04 fc ff movw $0xfffc, 0x4(%rdi) # imm = 0xFFFC + // e2: 48 8b 4c 24 20 movq 0x20(%rsp), %rcx + // e7: e9 85 00 00 00 jmp 0x171 <_JIT_ENTRY+0x171> + // ec: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xf3 <_JIT_ENTRY+0xf3> + // 00000000000000ef: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // f3: 49 89 86 08 01 00 00 movq %rax, 0x108(%r14) + // fa: 8b 01 movl (%rcx), %eax + // fc: 85 c0 testl %eax, %eax + // fe: 78 08 js 0x108 <_JIT_ENTRY+0x108> + // 100: ff c0 incl %eax + // 102: 89 01 movl %eax, (%rcx) + // 104: 48 8b 4f 08 movq 0x8(%rdi), %rcx + // 108: 48 8b 41 78 movq 0x78(%rcx), %rax + // 10c: 48 83 c4 28 addq $0x28, %rsp + // 110: 48 ff e0 jmpq *%rax + // 113: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 118: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 121: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x128 <_JIT_ENTRY+0x128> + // 0000000000000124: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 128: 49 89 86 08 01 00 00 movq %rax, 0x108(%r14) + // 12f: 48 8d 04 73 leaq (%rbx,%rsi,2), %rax + // 133: 48 05 d0 00 00 00 addq $0xd0, %rax + // 139: 0f b7 77 04 movzwl 0x4(%rdi), %esi + // 13d: 83 fe 0f cmpl $0xf, %esi + // 140: 0f 82 4b ff ff ff jb 0x91 <_JIT_ENTRY+0x91> + // 146: 83 c6 f0 addl $-0x10, %esi + // 149: 66 89 77 04 movw %si, 0x4(%rdi) + // 14d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 152: 48 83 c4 28 addq $0x28, %rsp + // 156: c3 retq + // 157: 48 8b 8b 98 00 00 00 movq 0x98(%rbx), %rcx + // 15e: 0f b6 40 01 movzbl 0x1(%rax), %eax + // 162: 48 8b 4c c1 08 movq 0x8(%rcx,%rax,8), %rcx + // 167: 8b 01 movl (%rcx), %eax + // 169: 85 c0 testl %eax, %eax + // 16b: 78 04 js 0x171 <_JIT_ENTRY+0x171> + // 16d: ff c0 incl %eax + // 16f: 89 01 movl %eax, (%rcx) + // 171: 48 89 4f 08 movq %rcx, 0x8(%rdi) + // 175: 8b 01 movl (%rcx), %eax + // 177: 85 c0 testl %eax, %eax + // 179: 79 85 jns 0x100 <_JIT_ENTRY+0x100> + // 17b: eb 8b jmp 0x108 <_JIT_ENTRY+0x108> + // 17d: 66 ba fc ff movw $0xfffc, %dx # imm = 0xFFFC + // 181: 66 83 fe 0b cmpw $0xb, %si + // 185: 77 12 ja 0x199 <_JIT_ENTRY+0x199> + // 187: ff c6 incl %esi + // 189: ba ff ff ff ff movl $0xffffffff, %edx # imm = 0xFFFFFFFF + // 18e: 89 f1 movl %esi, %ecx + // 190: d3 e2 shll %cl, %edx + // 192: f7 d2 notl %edx + // 194: c1 e2 04 shll $0x4, %edx + // 197: 09 f2 orl %esi, %edx + // 199: 66 89 57 04 movw %dx, 0x4(%rdi) + // 19d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1a2: 31 c9 xorl %ecx, %ecx + // 1a4: 85 c0 testl %eax, %eax + // 1a6: 48 89 d8 movq %rbx, %rax + // 1a9: 48 0f 45 c1 cmovneq %rcx, %rax + // 1ad: 48 83 c4 28 addq $0x28, %rsp + // 1b1: c3 retq + const unsigned char code_body[434] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x1c, 0x24, + 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x37, 0x48, 0x8b, 0x4f, 0x08, 0x48, 0x85, 0xc9, + 0x0f, 0x84, 0x03, 0x01, 0x00, 0x00, 0xf6, 0x41, + 0x22, 0x01, 0x0f, 0x85, 0xc4, 0x00, 0x00, 0x00, + 0x66, 0xc7, 0x47, 0x04, 0xfc, 0xff, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0xc7, 0x47, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x0f, + 0x88, 0xce, 0x00, 0x00, 0x00, 0xff, 0xc8, 0x89, + 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x4f, 0x08, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x86, 0x08, 0x01, 0x00, + 0x00, 0x48, 0x85, 0xc9, 0x0f, 0x85, 0x80, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x04, 0x73, 0x48, 0x05, + 0xd0, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0x77, 0x04, + 0x83, 0xfe, 0x0f, 0x0f, 0x83, 0xb5, 0x00, 0x00, + 0x00, 0x80, 0x38, 0xff, 0x0f, 0x84, 0xbd, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x0f, 0xb6, 0x49, 0x22, 0x41, 0xc1, + 0xe9, 0x02, 0x41, 0xff, 0xc1, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x4c, 0x8d, 0x44, 0x24, 0x20, 0x4c, + 0x89, 0xe1, 0x48, 0x89, 0xc3, 0x48, 0x89, 0xc2, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x0f, 0x8e, + 0xa1, 0x00, 0x00, 0x00, 0x66, 0xc7, 0x47, 0x04, + 0xfc, 0xff, 0x48, 0x8b, 0x4c, 0x24, 0x20, 0xe9, + 0x85, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x86, 0x08, 0x01, + 0x00, 0x00, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x08, + 0xff, 0xc0, 0x89, 0x01, 0x48, 0x8b, 0x4f, 0x08, + 0x48, 0x8b, 0x41, 0x78, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0xe0, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x86, 0x08, 0x01, 0x00, 0x00, 0x48, + 0x8d, 0x04, 0x73, 0x48, 0x05, 0xd0, 0x00, 0x00, + 0x00, 0x0f, 0xb7, 0x77, 0x04, 0x83, 0xfe, 0x0f, + 0x0f, 0x82, 0x4b, 0xff, 0xff, 0xff, 0x83, 0xc6, + 0xf0, 0x66, 0x89, 0x77, 0x04, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0x48, + 0x8b, 0x8b, 0x98, 0x00, 0x00, 0x00, 0x0f, 0xb6, + 0x40, 0x01, 0x48, 0x8b, 0x4c, 0xc1, 0x08, 0x8b, + 0x01, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, + 0x01, 0x48, 0x89, 0x4f, 0x08, 0x8b, 0x01, 0x85, + 0xc0, 0x79, 0x85, 0xeb, 0x8b, 0x66, 0xba, 0xfc, + 0xff, 0x66, 0x83, 0xfe, 0x0b, 0x77, 0x12, 0xff, + 0xc6, 0xba, 0xff, 0xff, 0xff, 0xff, 0x89, 0xf1, + 0xd3, 0xe2, 0xf7, 0xd2, 0xc1, 0xe2, 0x04, 0x09, + 0xf2, 0x66, 0x89, 0x57, 0x04, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x31, 0xc9, 0x85, 0xc0, 0x48, 0x89, + 0xd8, 0x48, 0x0f, 0x45, 0xc1, 0x48, 0x83, 0xc4, + 0x28, 0xc3, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: EXECUTOR + // 18: &_PyOptimizer_Optimize+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)executor); + patch_64(data + 0x18, (uintptr_t)&_PyOptimizer_Optimize); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x9d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xef, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x124, (uintptr_t)data + 0xc); +} + +void +emit__EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 10: 29 c2 subl %eax, %edx + // 12: f7 d0 notl %eax + // 14: 48 63 c8 movslq %eax, %rcx + // 17: 48 63 c2 movslq %edx, %rax + // 1a: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1f: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 23: 8b 3e movl (%rsi), %edi + // 25: 85 ff testl %edi, %edi + // 27: 78 04 js 0x2d <_JIT_ENTRY+0x2d> + // 29: ff c7 incl %edi + // 2b: 89 3e movl %edi, (%rsi) + // 2d: 49 89 74 cd 00 movq %rsi, (%r13,%rcx,8) + // 32: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 37: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 3b: 8b 32 movl (%rdx), %esi + // 3d: 85 f6 testl %esi, %esi + // 3f: 78 04 js 0x45 <_JIT_ENTRY+0x45> + // 41: ff c6 incl %esi + // 43: 89 32 movl %esi, (%rdx) + // 45: 49 89 54 c5 00 movq %rdx, (%r13,%rax,8) + // 4a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4f: 8b 01 movl (%rcx), %eax + // 51: 85 c0 testl %eax, %eax + // 53: 78 06 js 0x5b <_JIT_ENTRY+0x5b> + // 55: ff c8 decl %eax + // 57: 89 01 movl %eax, (%rcx) + // 59: 74 19 je 0x74 <_JIT_ENTRY+0x74> + // 5b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 60: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 69: 48 83 c4 28 addq $0x28, %rsp + // 6d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 48 83 c4 28 addq $0x28, %rsp + // 8c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[140] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xba, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc2, 0xf7, 0xd0, 0x48, 0x63, 0xc8, 0x48, + 0x63, 0xc2, 0x49, 0x8b, 0x54, 0xc5, 0x00, 0x48, + 0x8b, 0x72, 0x18, 0x8b, 0x3e, 0x85, 0xff, 0x78, + 0x04, 0xff, 0xc7, 0x89, 0x3e, 0x49, 0x89, 0x74, + 0xcd, 0x00, 0x49, 0x8b, 0x4c, 0xc5, 0x00, 0x48, + 0x8b, 0x52, 0x10, 0x8b, 0x32, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x32, 0x49, 0x89, 0x54, + 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xc); +} + +void +emit__EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _EXPAND_METHOD_KW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 10: 29 c1 subl %eax, %ecx + // 12: 48 63 d1 movslq %ecx, %rdx + // 15: b9 fd ff ff ff movl $0xfffffffd, %ecx # imm = 0xFFFFFFFD + // 1a: 29 c1 subl %eax, %ecx + // 1c: 48 63 c1 movslq %ecx, %rax + // 1f: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 24: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 28: 8b 3e movl (%rsi), %edi + // 2a: 85 ff testl %edi, %edi + // 2c: 78 04 js 0x32 <_JIT_ENTRY+0x32> + // 2e: ff c7 incl %edi + // 30: 89 3e movl %edi, (%rsi) + // 32: 49 89 74 d5 00 movq %rsi, (%r13,%rdx,8) + // 37: 48 8b 51 10 movq 0x10(%rcx), %rdx + // 3b: 8b 32 movl (%rdx), %esi + // 3d: 85 f6 testl %esi, %esi + // 3f: 78 04 js 0x45 <_JIT_ENTRY+0x45> + // 41: ff c6 incl %esi + // 43: 89 32 movl %esi, (%rdx) + // 45: 49 89 54 c5 00 movq %rdx, (%r13,%rax,8) + // 4a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4f: 8b 01 movl (%rcx), %eax + // 51: 85 c0 testl %eax, %eax + // 53: 78 06 js 0x5b <_JIT_ENTRY+0x5b> + // 55: ff c8 decl %eax + // 57: 89 01 movl %eax, (%rcx) + // 59: 74 19 je 0x74 <_JIT_ENTRY+0x74> + // 5b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 60: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 69: 48 83 c4 28 addq $0x28, %rsp + // 6d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 48 83 c4 28 addq $0x28, %rsp + // 8c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[140] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xb9, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc1, 0x48, 0x63, 0xd1, 0xb9, 0xfd, 0xff, + 0xff, 0xff, 0x29, 0xc1, 0x48, 0x63, 0xc1, 0x49, + 0x8b, 0x4c, 0xc5, 0x00, 0x48, 0x8b, 0x71, 0x18, + 0x8b, 0x3e, 0x85, 0xff, 0x78, 0x04, 0xff, 0xc7, + 0x89, 0x3e, 0x49, 0x89, 0x74, 0xd5, 0x00, 0x48, + 0x8b, 0x51, 0x10, 0x8b, 0x32, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x32, 0x49, 0x89, 0x54, + 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xc); +} + +void +emit__FATAL_ERROR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FATAL_ERROR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8d 0d 00 00 00 00 leaq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 ??_C@_0L@HIBONIGH@_JIT_ENTRY?$AA@ + // b: 48 8d 15 00 00 00 00 leaq (%rip), %rdx # 0x12 <_JIT_ENTRY+0x12> + // 000000000000000e: IMAGE_REL_AMD64_REL32 ??_C@_0BK@GCJGAMOK@Fatal?5error?5uop?5executed?4?$AA@ + // 12: ff 15 00 00 00 00 callq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__Py_FatalErrorFunc + const unsigned char code_body[24] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8d, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8d, 0x15, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'Fatal error uop executed.\x00_JIT_ENTRY\x00' + // 25: 00 00 00 + // 28: &_Py_FatalErrorFunc+0x0 + const unsigned char data_body[48] = { + 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x75, 0x6f, 0x70, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x2e, 0x00, 0x5f, 0x4a, 0x49, 0x54, 0x5f, 0x45, + 0x4e, 0x54, 0x52, 0x59, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_FatalErrorFunc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x16); + patch_x86_64_32rx(code + 0xe, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x24); +} + +void +emit__FORMAT_SIMPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_SIMPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 48 8b 46 08 movq 0x8(%rsi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Type + // 13: 74 4b je 0x60 <_JIT_ENTRY+0x60> + // 15: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1a: 48 89 f1 movq %rsi, %rcx + // 1d: 31 d2 xorl %edx, %edx + // 1f: ff 15 00 00 00 00 callq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp_PyObject_Format + // 25: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 2b: 8b 0e movl (%rsi), %ecx + // 2d: 85 c9 testl %ecx, %ecx + // 2f: 78 06 js 0x37 <_JIT_ENTRY+0x37> + // 31: ff c9 decl %ecx + // 33: 89 0e movl %ecx, (%rsi) + // 35: 74 40 je 0x77 <_JIT_ENTRY+0x77> + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 48 85 c0 testq %rax, %rax + // 48: 74 4f je 0x99 <_JIT_ENTRY+0x99> + // 4a: 48 89 c6 movq %rax, %rsi + // 4d: 49 89 75 00 movq %rsi, (%r13) + // 51: 49 83 c5 08 addq $0x8, %r13 + // 55: 48 83 c4 28 addq $0x28, %rsp + // 59: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 60: 49 83 c5 f8 addq $-0x8, %r13 + // 64: 49 89 75 00 movq %rsi, (%r13) + // 68: 49 83 c5 08 addq $0x8, %r13 + // 6c: 48 83 c4 28 addq $0x28, %rsp + // 70: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 77: 48 89 f1 movq %rsi, %rcx + // 7a: 48 89 c6 movq %rax, %rsi + // 7d: ff 15 00 00 00 00 callq *(%rip) # 0x83 <_JIT_ENTRY+0x83> + // 000000000000007f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 83: 48 89 f0 movq %rsi, %rax + // 86: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 8b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 94: 48 85 c0 testq %rax, %rax + // 97: 75 b1 jne 0x4a <_JIT_ENTRY+0x4a> + // 99: 48 83 c4 28 addq $0x28, %rsp + // 9d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa4 <_JIT_ENTRY+0xa4> + // 00000000000000a0: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[164] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x48, 0x8b, 0x46, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x4b, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x89, 0xf1, 0x31, 0xd2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xf8, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x40, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x4f, 0x48, 0x89, 0xc6, 0x49, 0x89, 0x75, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x89, 0x75, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf0, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x75, + 0xb1, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: &PyObject_Format+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, (uintptr_t)&PyObject_Format); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x73, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xa0, (uintptr_t)data + 0x1c); +} + +void +emit__FORMAT_WITH_SPEC( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FORMAT_WITH_SPEC.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 7d f8 movq -0x8(%r13), %rdi + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 89 d9 movq %rbx, %rcx + // 14: 48 89 fa movq %rdi, %rdx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp_PyObject_Format + // 1d: 48 89 c6 movq %rax, %rsi + // 20: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 25: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2e: 8b 03 movl (%rbx), %eax + // 30: 85 c0 testl %eax, %eax + // 32: 78 0f js 0x43 <_JIT_ENTRY+0x43> + // 34: ff c8 decl %eax + // 36: 89 03 movl %eax, (%rbx) + // 38: 75 09 jne 0x43 <_JIT_ENTRY+0x43> + // 3a: 48 89 d9 movq %rbx, %rcx + // 3d: ff 15 00 00 00 00 callq *(%rip) # 0x43 <_JIT_ENTRY+0x43> + // 000000000000003f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 43: 8b 07 movl (%rdi), %eax + // 45: 85 c0 testl %eax, %eax + // 47: 78 06 js 0x4f <_JIT_ENTRY+0x4f> + // 49: ff c8 decl %eax + // 4b: 89 07 movl %eax, (%rdi) + // 4d: 74 18 je 0x67 <_JIT_ENTRY+0x67> + // 4f: 48 85 f6 testq %rsi, %rsi + // 52: 74 21 je 0x75 <_JIT_ENTRY+0x75> + // 54: 49 89 75 f0 movq %rsi, -0x10(%r13) + // 58: 49 83 c5 f8 addq $-0x8, %r13 + // 5c: 48 83 c4 28 addq $0x28, %rsp + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 67: 48 89 f9 movq %rdi, %rcx + // 6a: ff 15 00 00 00 00 callq *(%rip) # 0x70 <_JIT_ENTRY+0x70> + // 000000000000006c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 70: 48 85 f6 testq %rsi, %rsi + // 73: 75 df jne 0x54 <_JIT_ENTRY+0x54> + // 75: 49 83 c5 f0 addq $-0x10, %r13 + // 79: 48 83 c4 28 addq $0x28, %rsp + // 7d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x84 <_JIT_ENTRY+0x84> + // 0000000000000080: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[132] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xd9, 0x48, 0x89, 0xfa, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc6, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, + 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, + 0x75, 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x07, 0x74, 0x18, 0x48, + 0x85, 0xf6, 0x74, 0x21, 0x49, 0x89, 0x75, 0xf0, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xf6, 0x75, 0xdf, 0x49, 0x83, 0xc5, + 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_Format+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Format); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3f, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x80, (uintptr_t)data + 0x14); +} + +void +emit__FOR_ITER_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_GEN_FRAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyGen_Type + // f: 75 06 jne 0x17 <_JIT_ENTRY+0x17> + // 11: 80 78 43 00 cmpb $0x0, 0x43(%rax) + // 15: 78 07 js 0x1e <_JIT_ENTRY+0x1e> + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 1e: 48 8b 88 88 00 00 00 movq 0x88(%rax), %rcx + // 25: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 2c: 48 89 11 movq %rdx, (%rcx) + // 2f: 48 83 80 88 00 00 00 08 addq $0x8, 0x88(%rax) + // 37: 48 8d 48 48 leaq 0x48(%rax), %rcx + // 3b: c6 40 43 00 movb $0x0, 0x43(%rax) + // 3f: 49 8b 56 78 movq 0x78(%r14), %rdx + // 43: 48 8d 70 28 leaq 0x28(%rax), %rsi + // 47: 48 89 50 30 movq %rdx, 0x30(%rax) + // 4b: 49 89 76 78 movq %rsi, 0x78(%r14) + // 4f: 4c 89 60 50 movq %r12, 0x50(%rax) + // 53: 8b 05 00 00 00 00 movl (%rip), %eax # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 59: 83 c0 02 addl $0x2, %eax + // 5c: 66 41 89 44 24 48 movw %ax, 0x48(%r12) + // 62: 49 89 4d 00 movq %rcx, (%r13) + // 66: 49 83 c5 08 addq $0x8, %r13 + // 6a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x71 <_JIT_ENTRY+0x71> + // 000000000000006d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[106] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x06, 0x80, 0x78, 0x43, 0x00, 0x78, 0x07, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x88, 0x88, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x11, 0x48, + 0x83, 0x80, 0x88, 0x00, 0x00, 0x00, 0x08, 0x48, + 0x8d, 0x48, 0x48, 0xc6, 0x40, 0x43, 0x00, 0x49, + 0x8b, 0x56, 0x78, 0x48, 0x8d, 0x70, 0x28, 0x48, + 0x89, 0x50, 0x30, 0x49, 0x89, 0x76, 0x78, 0x4c, + 0x89, 0x60, 0x50, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc0, 0x02, 0x66, 0x41, 0x89, 0x44, + 0x24, 0x48, 0x49, 0x89, 0x4d, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + // 0: &PyGen_Type+0x0 + // 8: JUMP_TARGET + // 10: &_Py_NoneStruct+0x0 + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyGen_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0x14); +} + +void +emit__FOR_ITER_TIER_TWO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _FOR_ITER_TIER_TWO.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 8b 41 08 movq 0x8(%rcx), %rax + // 11: ff 90 e0 00 00 00 callq *0xe0(%rax) + // 17: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 25: 48 85 c0 testq %rax, %rax + // 28: 74 13 je 0x3d <_JIT_ENTRY+0x3d> + // 2a: 49 89 45 00 movq %rax, (%r13) + // 2e: 49 83 c5 08 addq $0x8, %r13 + // 32: 48 83 c4 28 addq $0x28, %rsp + // 36: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 3d: 49 8b 46 70 movq 0x70(%r14), %rax + // 41: 48 85 c0 testq %rax, %rax + // 44: 74 5e je 0xa4 <_JIT_ENTRY+0xa4> + // 46: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // 4b: 74 57 je 0xa4 <_JIT_ENTRY+0xa4> + // 4d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 52: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp_PyExc_StopIteration + // 59: 48 8b 10 movq (%rax), %rdx + // 5c: 4c 89 f1 movq %r14, %rcx + // 5f: ff 15 00 00 00 00 callq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: IMAGE_REL_AMD64_REL32 __imp__PyErr_ExceptionMatches + // 65: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 73: 85 c0 testl %eax, %eax + // 75: 74 38 je 0xaf <_JIT_ENTRY+0xaf> + // 77: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7c: 4d 8b 44 24 38 movq 0x38(%r12), %r8 + // 81: 4c 89 f1 movq %r14, %rcx + // 84: 4c 89 e2 movq %r12, %rdx + // 87: ff 15 00 00 00 00 callq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: IMAGE_REL_AMD64_REL32 __imp__PyEval_MonitorRaise + // 8d: 4c 89 f1 movq %r14, %rcx + // 90: ff 15 00 00 00 00 callq *(%rip) # 0x96 <_JIT_ENTRY+0x96> + // 0000000000000092: IMAGE_REL_AMD64_REL32 __imp__PyErr_Clear + // 96: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a4: 48 83 c4 28 addq $0x28, %rsp + // a8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xaf <_JIT_ENTRY+0xaf> + // 00000000000000ab: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // af: 48 83 c4 28 addq $0x28, %rsp + // b3: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xba <_JIT_ENTRY+0xba> + // 00000000000000b6: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[186] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x41, + 0x08, 0xff, 0x90, 0xe0, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x13, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x46, + 0x70, 0x48, 0x85, 0xc0, 0x74, 0x5e, 0x48, 0x83, + 0x78, 0x08, 0x00, 0x74, 0x57, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x38, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4d, 0x8b, 0x44, 0x24, + 0x38, 0x4c, 0x89, 0xf1, 0x4c, 0x89, 0xe2, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: CONTINUE + // 8: &PyExc_StopIteration+0x0 + // 10: &_PyErr_ExceptionMatches+0x0 + // 18: &_PyEval_MonitorRaise+0x0 + // 20: &_PyErr_Clear+0x0 + // 28: JUMP_TARGET + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&PyExc_StopIteration); + patch_64(data + 0x10, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x18, (uintptr_t)&_PyEval_MonitorRaise); + patch_64(data + 0x20, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x28, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x92, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xb6, (uintptr_t)data + 0x2c); +} + +void +emit__GET_AITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AITER.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 48 8b 47 08 movq 0x8(%rdi), %rax + // c: 48 8b 48 50 movq 0x50(%rax), %rcx + // 10: 48 85 c9 testq %rcx, %rcx + // 13: 74 5c je 0x71 <_JIT_ENTRY+0x71> + // 15: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 19: 48 85 d2 testq %rdx, %rdx + // 1c: 74 53 je 0x71 <_JIT_ENTRY+0x71> + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 f9 movq %rdi, %rcx + // 26: ff d2 callq *%rdx + // 28: 48 89 c6 movq %rax, %rsi + // 2b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 30: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 39: 8b 07 movl (%rdi), %eax + // 3b: 85 c0 testl %eax, %eax + // 3d: 78 0a js 0x49 <_JIT_ENTRY+0x49> + // 3f: ff c8 decl %eax + // 41: 89 07 movl %eax, (%rdi) + // 43: 0f 84 dc 00 00 00 je 0x125 <_JIT_ENTRY+0x125> + // 49: 48 85 f6 testq %rsi, %rsi + // 4c: 74 60 je 0xae <_JIT_ENTRY+0xae> + // 4e: 48 8b 46 08 movq 0x8(%rsi), %rax + // 52: 48 8b 40 50 movq 0x50(%rax), %rax + // 56: 48 85 c0 testq %rax, %rax + // 59: 74 62 je 0xbd <_JIT_ENTRY+0xbd> + // 5b: 48 83 78 10 00 cmpq $0x0, 0x10(%rax) + // 60: 74 5b je 0xbd <_JIT_ENTRY+0xbd> + // 62: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 66: 48 83 c4 28 addq $0x28, %rsp + // 6a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x71 <_JIT_ENTRY+0x71> + // 000000000000006d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 71: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 76: 4c 8b 48 18 movq 0x18(%rax), %r9 + // 7a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x81 <_JIT_ENTRY+0x81> + // 000000000000007d: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // 81: 48 8b 10 movq (%rax), %rdx + // 84: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x8b <_JIT_ENTRY+0x8b> + // 0000000000000087: IMAGE_REL_AMD64_REL32 ??_C@_0EB@HAIFCLCF@?8async?5for?8?5requires?5an?5object?5w@ + // 8b: 4c 89 f1 movq %r14, %rcx + // 8e: ff 15 00 00 00 00 callq *(%rip) # 0x94 <_JIT_ENTRY+0x94> + // 0000000000000090: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // 94: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 99: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a2: 8b 07 movl (%rdi), %eax + // a4: 85 c0 testl %eax, %eax + // a6: 78 06 js 0xae <_JIT_ENTRY+0xae> + // a8: ff c8 decl %eax + // aa: 89 07 movl %eax, (%rdi) + // ac: 74 5f je 0x10d <_JIT_ENTRY+0x10d> + // ae: 49 83 c5 f8 addq $-0x8, %r13 + // b2: 48 83 c4 28 addq $0x28, %rsp + // b6: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbd <_JIT_ENTRY+0xbd> + // 00000000000000b9: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // bd: 49 83 c5 f8 addq $-0x8, %r13 + // c1: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // c6: 48 8b 46 08 movq 0x8(%rsi), %rax + // ca: 4c 8b 48 18 movq 0x18(%rax), %r9 + // ce: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0xd5 <_JIT_ENTRY+0xd5> + // 00000000000000d1: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // d5: 48 8b 10 movq (%rax), %rdx + // d8: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0xdf <_JIT_ENTRY+0xdf> + // 00000000000000db: IMAGE_REL_AMD64_REL32 ??_C@_0FI@MHPMLJOA@?8async?5for?8?5received?5an?5object?5f@ + // df: 4c 89 f1 movq %r14, %rcx + // e2: ff 15 00 00 00 00 callq *(%rip) # 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e4: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // e8: 8b 06 movl (%rsi), %eax + // ea: 85 c0 testl %eax, %eax + // ec: 78 06 js 0xf4 <_JIT_ENTRY+0xf4> + // ee: ff c8 decl %eax + // f0: 89 06 movl %eax, (%rsi) + // f2: 74 48 je 0x13c <_JIT_ENTRY+0x13c> + // f4: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // f9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 102: 48 83 c4 28 addq $0x28, %rsp + // 106: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x10d <_JIT_ENTRY+0x10d> + // 0000000000000109: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 10d: 48 89 f9 movq %rdi, %rcx + // 110: ff 15 00 00 00 00 callq *(%rip) # 0x116 <_JIT_ENTRY+0x116> + // 0000000000000112: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 116: 49 83 c5 f8 addq $-0x8, %r13 + // 11a: 48 83 c4 28 addq $0x28, %rsp + // 11e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x125 <_JIT_ENTRY+0x125> + // 0000000000000121: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 125: 48 89 f9 movq %rdi, %rcx + // 128: ff 15 00 00 00 00 callq *(%rip) # 0x12e <_JIT_ENTRY+0x12e> + // 000000000000012a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 12e: 48 85 f6 testq %rsi, %rsi + // 131: 0f 85 17 ff ff ff jne 0x4e <_JIT_ENTRY+0x4e> + // 137: e9 72 ff ff ff jmp 0xae <_JIT_ENTRY+0xae> + // 13c: 48 89 f1 movq %rsi, %rcx + // 13f: ff 15 00 00 00 00 callq *(%rip) # 0x145 <_JIT_ENTRY+0x145> + // 0000000000000141: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 145: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 14a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 153: 48 83 c4 28 addq $0x28, %rsp + // 157: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x15e <_JIT_ENTRY+0x15e> + // 000000000000015a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[350] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf8, + 0x48, 0x8b, 0x47, 0x08, 0x48, 0x8b, 0x48, 0x50, + 0x48, 0x85, 0xc9, 0x74, 0x5c, 0x48, 0x8b, 0x51, + 0x08, 0x48, 0x85, 0xd2, 0x74, 0x53, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf9, 0xff, 0xd2, + 0x48, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0a, 0xff, + 0xc8, 0x89, 0x07, 0x0f, 0x84, 0xdc, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xf6, 0x74, 0x60, 0x48, 0x8b, + 0x46, 0x08, 0x48, 0x8b, 0x40, 0x50, 0x48, 0x85, + 0xc0, 0x74, 0x62, 0x48, 0x83, 0x78, 0x10, 0x00, + 0x74, 0x5b, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x8b, + 0x48, 0x18, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x8d, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x07, 0x74, 0x5f, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, + 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x46, 0x08, 0x4c, 0x8b, 0x48, 0x18, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x10, + 0x4c, 0x8d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x06, 0x74, 0x48, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xf6, 0x0f, 0x85, 0x17, 0xff, 0xff, 0xff, 0xe9, + 0x72, 0xff, 0xff, 0xff, 0x48, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: "'async for' requires an object with __aiter__ method, got %.100s\x00'async for' received an object from __aiter__ that does not implement __anext__: %.100s\x00" + // 99: 00 00 00 00 00 00 00 + // a0: CONTINUE + // a8: &PyExc_TypeError+0x0 + // b0: &_PyErr_Format+0x0 + // b8: ERROR_TARGET + // c0: &_Py_Dealloc+0x0 + const unsigned char data_body[200] = { + 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, + 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x5f, 0x5f, 0x61, 0x69, + 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x27, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x66, 0x6f, 0x72, 0x27, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x5f, 0x5f, 0x61, + 0x69, 0x74, 0x65, 0x72, 0x5f, 0x5f, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x5f, + 0x5f, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, + 0x3a, 0x20, 0x25, 0x2e, 0x31, 0x30, 0x30, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0xa0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0xa8, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0xb0, (uintptr_t)&_PyErr_Format); + patch_64(data + 0xb8, state->instruction_starts[instruction->error_target]); + patch_64(data + 0xc0, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6d, (uintptr_t)data + 0x9c); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)data + 0xa4); + patch_x86_64_32rx(code + 0x87, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x90, (uintptr_t)data + 0xac); + patch_x86_64_32rx(code + 0xb9, (uintptr_t)data + 0xb4); + patch_x86_64_32rx(code + 0xd1, (uintptr_t)data + 0xa4); + patch_x86_64_32rx(code + 0xdb, (uintptr_t)data + 0x3d); + patch_x86_64_32rx(code + 0xe4, (uintptr_t)data + 0xac); + patch_x86_64_32rx(code + 0x109, (uintptr_t)data + 0xb4); + patch_x86_64_32rx(code + 0x112, (uintptr_t)data + 0xbc); + patch_x86_64_32rx(code + 0x121, (uintptr_t)data + 0xb4); + patch_x86_64_32rx(code + 0x12a, (uintptr_t)data + 0xbc); + patch_x86_64_32rx(code + 0x141, (uintptr_t)data + 0xbc); + patch_x86_64_32rx(code + 0x15a, (uintptr_t)data + 0xb4); +} + +void +emit__GET_ANEXT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ANEXT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: ff 15 00 00 00 00 callq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__PyEval_GetANext + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 48 85 c0 testq %rax, %rax + // 24: 74 13 je 0x39 <_JIT_ENTRY+0x39> + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: 48 83 c4 28 addq $0x28, %rsp + // 32: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 39: 48 83 c4 28 addq $0x28, %rsp + // 3d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[68] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_GetANext+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_GetANext); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0xc); +} + +void +emit__GET_AWAITABLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_AWAITABLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 49 8b 75 f8 movq -0x8(%r13), %rsi + // f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 14: 48 89 f1 movq %rsi, %rcx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__PyEval_GetAwaitable + // 1d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 22: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2b: 8b 0e movl (%rsi), %ecx + // 2d: 85 c9 testl %ecx, %ecx + // 2f: 78 06 js 0x37 <_JIT_ENTRY+0x37> + // 31: ff c9 decl %ecx + // 33: 89 0e movl %ecx, (%rsi) + // 35: 74 14 je 0x4b <_JIT_ENTRY+0x4b> + // 37: 48 85 c0 testq %rax, %rax + // 3a: 74 23 je 0x5f <_JIT_ENTRY+0x5f> + // 3c: 49 89 45 f8 movq %rax, -0x8(%r13) + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4b: 48 89 f1 movq %rsi, %rcx + // 4e: 48 89 c6 movq %rax, %rsi + // 51: ff 15 00 00 00 00 callq *(%rip) # 0x57 <_JIT_ENTRY+0x57> + // 0000000000000053: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 57: 48 89 f0 movq %rsi, %rax + // 5a: 48 85 c0 testq %rax, %rax + // 5d: 75 dd jne 0x3c <_JIT_ENTRY+0x3c> + // 5f: 49 83 c5 f8 addq $-0x8, %r13 + // 63: 48 83 c4 28 addq $0x28, %rsp + // 67: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[110] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x14, 0x48, + 0x85, 0xc0, 0x74, 0x23, 0x49, 0x89, 0x45, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x48, 0x89, + 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf0, 0x48, 0x85, 0xc0, 0x75, 0xdd, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_GetAwaitable+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_GetAwaitable); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x53, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0x1c); +} + +void +emit__GET_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_ITER.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 f1 movq %rsi, %rcx + // 10: ff 15 00 00 00 00 callq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyObject_GetIter + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0e movl (%rsi), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0e movl %ecx, (%rsi) + // 2e: 74 14 je 0x44 <_JIT_ENTRY+0x44> + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 23 je 0x58 <_JIT_ENTRY+0x58> + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 48 83 c4 28 addq $0x28, %rsp + // 3d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 44: 48 89 f1 movq %rsi, %rcx + // 47: 48 89 c6 movq %rax, %rsi + // 4a: ff 15 00 00 00 00 callq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 50: 48 89 f0 movq %rsi, %rax + // 53: 48 85 c0 testq %rax, %rax + // 56: 75 dd jne 0x35 <_JIT_ENTRY+0x35> + // 58: 49 83 c5 f8 addq $-0x8, %r13 + // 5c: 48 83 c4 28 addq $0x28, %rsp + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[103] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x14, + 0x48, 0x85, 0xc0, 0x74, 0x23, 0x49, 0x89, 0x45, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x48, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf0, 0x48, 0x85, 0xc0, 0x75, 0xdd, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyObject_GetIter+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x14); +} + +void +emit__GET_LEN( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_LEN.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: ff 15 00 00 00 00 callq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyObject_Size + // 13: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 18: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 21: 48 85 c0 testq %rax, %rax + // 24: 78 21 js 0x47 <_JIT_ENTRY+0x47> + // 26: 48 89 c1 movq %rax, %rcx + // 29: ff 15 00 00 00 00 callq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: IMAGE_REL_AMD64_REL32 __imp_PyLong_FromSsize_t + // 2f: 48 85 c0 testq %rax, %rax + // 32: 74 13 je 0x47 <_JIT_ENTRY+0x47> + // 34: 49 89 45 00 movq %rax, (%r13) + // 38: 49 83 c5 08 addq $0x8, %r13 + // 3c: 48 83 c4 28 addq $0x28, %rsp + // 40: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 47: 48 83 c4 28 addq $0x28, %rsp + // 4b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[82] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x78, 0x21, 0x48, 0x89, + 0xc1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &PyObject_Size+0x0 + // 8: &PyLong_FromSsize_t+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_Size); + patch_64(data + 0x8, (uintptr_t)&PyLong_FromSsize_t); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x14); +} + +void +emit__GET_YIELD_FROM_ITER( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GET_YIELD_FROM_ITER.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 48 8b 46 08 movq 0x8(%rsi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyCoro_Type + // 13: 74 48 je 0x5d <_JIT_ENTRY+0x5d> + // 15: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp_PyGen_Type + // 1c: 74 4e je 0x6c <_JIT_ENTRY+0x6c> + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 f1 movq %rsi, %rcx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp_PyObject_GetIter + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 85 c0 testq %rax, %rax + // 3d: 74 69 je 0xa8 <_JIT_ENTRY+0xa8> + // 3f: 8b 0e movl (%rsi), %ecx + // 41: 85 c9 testl %ecx, %ecx + // 43: 78 6e js 0xb3 <_JIT_ENTRY+0xb3> + // 45: ff c9 decl %ecx + // 47: 89 0e movl %ecx, (%rsi) + // 49: 74 7a je 0xc5 <_JIT_ENTRY+0xc5> + // 4b: 48 89 c6 movq %rax, %rsi + // 4e: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 52: 48 83 c4 28 addq $0x28, %rsp + // 56: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 5d: 49 8b 04 24 movq (%r12), %rax + // 61: 0f b7 40 30 movzwl 0x30(%rax), %eax + // 65: a9 80 01 00 00 testl $0x180, %eax # imm = 0x180 + // 6a: 74 0f je 0x7b <_JIT_ENTRY+0x7b> + // 6c: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 7b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 80: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // 87: 48 8b 10 movq (%rax), %rdx + // 8a: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x91 <_JIT_ENTRY+0x91> + // 000000000000008d: IMAGE_REL_AMD64_REL32 ??_C@_0EE@OKAKFBDN@cannot?5?8yield?5from?8?5a?5coroutine?5@ + // 91: 4c 89 f1 movq %r14, %rcx + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: IMAGE_REL_AMD64_REL32 __imp__PyErr_SetString + // 9a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a8: 48 83 c4 28 addq $0x28, %rsp + // ac: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // b3: 48 89 c6 movq %rax, %rsi + // b6: 49 89 75 f8 movq %rsi, -0x8(%r13) + // ba: 48 83 c4 28 addq $0x28, %rsp + // be: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc5 <_JIT_ENTRY+0xc5> + // 00000000000000c1: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // c5: 48 89 f1 movq %rsi, %rcx + // c8: 48 89 c6 movq %rax, %rsi + // cb: ff 15 00 00 00 00 callq *(%rip) # 0xd1 <_JIT_ENTRY+0xd1> + // 00000000000000cd: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // d1: 49 89 75 f8 movq %rsi, -0x8(%r13) + // d5: 48 83 c4 28 addq $0x28, %rsp + // d9: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe0 <_JIT_ENTRY+0xe0> + // 00000000000000dc: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[217] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x48, 0x8b, 0x46, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x48, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x4e, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x69, 0x8b, + 0x0e, 0x85, 0xc9, 0x78, 0x6e, 0xff, 0xc9, 0x89, + 0x0e, 0x74, 0x7a, 0x48, 0x89, 0xc6, 0x49, 0x89, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x04, + 0x24, 0x0f, 0xb7, 0x40, 0x30, 0xa9, 0x80, 0x01, + 0x00, 0x00, 0x74, 0x0f, 0x49, 0x89, 0x75, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x10, 0x4c, 0x8d, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xc6, 0x49, 0x89, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x28, + }; + // 0: "cannot 'yield from' a coroutine object in a non-coroutine generator\x00" + // 44: 00 00 00 00 + // 48: &PyCoro_Type+0x0 + // 50: &PyGen_Type+0x0 + // 58: &PyObject_GetIter+0x0 + // 60: CONTINUE + // 68: &PyExc_TypeError+0x0 + // 70: &_PyErr_SetString+0x0 + // 78: ERROR_TARGET + // 80: &_Py_Dealloc+0x0 + const unsigned char data_body[136] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x27, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x27, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x48, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x50, (uintptr_t)&PyGen_Type); + patch_64(data + 0x58, (uintptr_t)&PyObject_GetIter); + patch_64(data + 0x60, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x68, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x70, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x78, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x80, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x77, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x8d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0xc1, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xcd, (uintptr_t)data + 0x7c); +} + +void +emit__GUARD_BINARY_OP_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BINARY_OP_EXTEND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 18: ff 50 08 callq *0x8(%rax) + // 1b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 20: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 29: 48 83 c4 28 addq $0x28, %rsp + // 2d: 85 c0 testl %eax, %eax + // 2f: 74 07 je 0x38 <_JIT_ENTRY+0x38> + // 31: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 38: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[63] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x50, 0x08, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0xc); +} + +void +emit__GUARD_BOTH_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyFloat_Type + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 45 f8 movq -0x8(%r13), %rax + // 15: 48 8b 40 08 movq 0x8(%rax), %rax + // 19: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp_PyFloat_Type + // 20: 74 07 je 0x29 <_JIT_ENTRY+0x29> + // 22: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 29: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[41] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyFloat_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_BOTH_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 45 f8 movq -0x8(%r13), %rax + // 15: 48 8b 40 08 movq 0x8(%rax), %rax + // 19: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // 20: 74 07 je 0x29 <_JIT_ENTRY+0x29> + // 22: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 29: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[41] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_BOTH_UNICODE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BOTH_UNICODE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Type + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 45 f8 movq -0x8(%r13), %rax + // 15: 48 8b 40 08 movq 0x8(%rax), %rax + // 19: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Type + // 20: 74 07 je 0x29 <_JIT_ENTRY+0x29> + // 22: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 29: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[41] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyUnicode_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_BUILTINS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_BUILTINS_VERSION_PUSH_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 20 movq 0x20(%r12), %rax + // 5: 48 8b 48 08 movq 0x8(%rax), %rcx + // 9: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 10: 75 1f jne 0x31 <_JIT_ENTRY+0x31> + // 12: 48 8b 40 20 movq 0x20(%rax), %rax + // 16: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1d: 39 48 0c cmpl %ecx, 0xc(%rax) + // 20: 75 0f jne 0x31 <_JIT_ENTRY+0x31> + // 22: 49 89 45 00 movq %rax, (%r13) + // 26: 49 83 c5 08 addq $0x8, %r13 + // 2a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 31: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[56] = { + 0x49, 0x8b, 0x44, 0x24, 0x20, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x1f, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x39, 0x48, 0x0c, + 0x75, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_DORV_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_NO_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 83 78 e8 00 cmpq $0x0, -0x18(%rax) + // 9: 74 07 je 0x12 <_JIT_ENTRY+0x12> + // b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x12 <_JIT_ENTRY+0x12> + // 000000000000000e: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 12: 48 8b 48 08 movq 0x8(%rax), %rcx + // 16: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 1a: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 1f: 74 ea je 0xb <_JIT_ENTRY+0xb> + // 21: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x83, 0x78, 0xe8, + 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x48, 0x08, 0x48, 0x8b, + 0x49, 0x20, 0x80, 0x7c, 0x08, 0x03, 0x00, 0x74, + 0xea, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xe, (uintptr_t)data + -0x4); +} + +void +emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 8b 49 20 movq 0x20(%rcx), %rcx + // c: 80 7c 08 03 00 cmpb $0x0, 0x3(%rax,%rcx) + // 11: 74 07 je 0x1a <_JIT_ENTRY+0x1a> + // 13: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x8b, 0x49, 0x20, 0x80, 0x7c, 0x08, 0x03, + 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_GLOBALS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 5: 48 8b 48 08 movq 0x8(%rax), %rcx + // 9: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 10: 75 17 jne 0x29 <_JIT_ENTRY+0x29> + // 12: 48 8b 40 20 movq 0x20(%rax), %rax + // 16: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1d: 39 48 0c cmpl %ecx, 0xc(%rax) + // 20: 75 07 jne 0x29 <_JIT_ENTRY+0x29> + // 22: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 29: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[48] = { + 0x49, 0x8b, 0x44, 0x24, 0x18, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x17, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x39, 0x48, 0x0c, + 0x75, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_GLOBALS_VERSION_PUSH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_GLOBALS_VERSION_PUSH_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 5: 48 8b 48 08 movq 0x8(%rax), %rcx + // 9: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x10 <_JIT_ENTRY+0x10> + // 000000000000000c: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 10: 75 1f jne 0x31 <_JIT_ENTRY+0x31> + // 12: 48 8b 40 20 movq 0x20(%rax), %rax + // 16: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1d: 39 48 0c cmpl %ecx, 0xc(%rax) + // 20: 75 0f jne 0x31 <_JIT_ENTRY+0x31> + // 22: 49 89 45 00 movq %rax, (%r13) + // 26: 49 83 c5 08 addq $0x8, %r13 + // 2a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 31: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[56] = { + 0x49, 0x8b, 0x44, 0x24, 0x18, 0x48, 0x8b, 0x48, + 0x08, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x1f, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x39, 0x48, 0x0c, + 0x75, 0x0f, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: OPERAND0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, instruction->operand0); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xc, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_IS_FALSE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_FALSE_POP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_IS_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NONE_POP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 13: 74 2a je 0x3f <_JIT_ENTRY+0x3f> + // 15: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1a: 8b 01 movl (%rcx), %eax + // 1c: 85 c0 testl %eax, %eax + // 1e: 78 06 js 0x26 <_JIT_ENTRY+0x26> + // 20: ff c8 decl %eax + // 22: 89 01 movl %eax, (%rcx) + // 24: 74 24 je 0x4a <_JIT_ENTRY+0x4a> + // 26: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 34: 48 83 c4 28 addq $0x28, %rsp + // 38: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 3f: 48 83 c4 28 addq $0x28, %rsp + // 43: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4a: ff 15 00 00 00 00 callq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 50: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 55: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5e: 48 83 c4 28 addq $0x28, %rsp + // 62: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[105] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x3b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x2a, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x01, 0x74, 0x24, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: JUMP_TARGET + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_IS_NOT_NONE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_NOT_NONE_POP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 8b 06 movl (%rsi), %eax + // 13: 85 c0 testl %eax, %eax + // 15: 78 0f js 0x26 <_JIT_ENTRY+0x26> + // 17: ff c8 decl %eax + // 19: 89 06 movl %eax, (%rsi) + // 1b: 75 09 jne 0x26 <_JIT_ENTRY+0x26> + // 1d: 48 89 f1 movq %rsi, %rcx + // 20: ff 15 00 00 00 00 callq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 26: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 34: 48 83 c4 28 addq $0x28, %rsp + // 38: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 3f: 74 07 je 0x48 <_JIT_ENTRY+0x48> + // 41: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 48: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[79] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x06, 0x75, 0x09, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0x3b, 0x35, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_Dealloc+0x0 + // 8: &_Py_NoneStruct+0x0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x14); +} + +void +emit__GUARD_IS_TRUE_POP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_IS_TRUE_POP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_KEYS_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_KEYS_VERSION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 8b 80 70 03 00 00 movq 0x370(%rax), %rax + // f: 8b 40 0c movl 0xc(%rax), %eax + // 12: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 18: 75 07 jne 0x21 <_JIT_ENTRY+0x21> + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 21: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[40] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x8b, 0x80, 0x70, 0x03, 0x00, 0x00, 0x8b, + 0x40, 0x0c, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0xc); +} + +void +emit__GUARD_NOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyFloat_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyFloat_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOS_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_LIST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 18 movq 0x18(%rax), %rcx + // 8: 48 85 c9 testq %rcx, %rcx + // b: 74 11 je 0x1e <_JIT_ENTRY+0x1e> + // d: 48 8b 50 10 movq 0x10(%rax), %rdx + // 11: 48 3b 51 10 cmpq 0x10(%rcx), %rdx + // 15: 73 0e jae 0x25 <_JIT_ENTRY+0x25> + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 25: 48 c7 40 10 ff ff ff ff movq $-0x1, 0x10(%rax) + // 2d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[52] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x18, + 0x48, 0x85, 0xc9, 0x74, 0x11, 0x48, 0x8b, 0x50, + 0x10, 0x48, 0x3b, 0x51, 0x10, 0x73, 0x0e, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x40, + 0x10, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_RANGE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 83 78 18 00 cmpl $0x0, 0x18(%rax) + // 8: 7e 07 jle 0x11 <_JIT_ENTRY+0x11> + // a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x83, 0x78, 0x18, 0x00, + 0x7e, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_NOT_EXHAUSTED_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_NOT_EXHAUSTED_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 18 movq 0x18(%rax), %rcx + // 8: 48 85 c9 testq %rcx, %rcx + // b: 74 11 je 0x1e <_JIT_ENTRY+0x1e> + // d: 48 8b 40 10 movq 0x10(%rax), %rax + // 11: 48 3b 41 10 cmpq 0x10(%rcx), %rax + // 15: 7d 07 jge 0x1e <_JIT_ENTRY+0x1e> + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[37] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x18, + 0x48, 0x85, 0xc9, 0x74, 0x11, 0x48, 0x8b, 0x40, + 0x10, 0x48, 0x3b, 0x41, 0x10, 0x7d, 0x07, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_TOS_FLOAT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_FLOAT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyFloat_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyFloat_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFloat_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_TOS_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TOS_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__GUARD_TYPE_VERSION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // e: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 14: 75 07 jne 0x1d <_JIT_ENTRY+0x1d> + // 16: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[36] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x8b, 0x80, 0x80, 0x01, 0x00, 0x00, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x07, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0xc); +} + +void +emit__GUARD_TYPE_VERSION_AND_LOCK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _GUARD_TYPE_VERSION_AND_LOCK.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 8b 80 80 01 00 00 movl 0x180(%rax), %eax + // e: 3b 05 00 00 00 00 cmpl (%rip), %eax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 14: 75 07 jne 0x1d <_JIT_ENTRY+0x1d> + // 16: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[36] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x8b, 0x80, 0x80, 0x01, 0x00, 0x00, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x07, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0xc); +} + +void +emit__IMPORT_FROM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_FROM.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 48 8b 40 20 movq 0x20(%rax), %rax + // 10: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 17: 4c 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %r8 + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 4c 89 f1 movq %r14, %rcx + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp__PyEval_ImportFrom + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 48 85 c0 testq %rax, %rax + // 3b: 74 13 je 0x50 <_JIT_ENTRY+0x50> + // 3d: 49 89 45 00 movq %rax, (%r13) + // 41: 49 83 c5 08 addq $0x8, %r13 + // 45: 48 83 c4 28 addq $0x28, %rsp + // 49: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 50: 48 83 c4 28 addq $0x28, %rsp + // 54: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5b <_JIT_ENTRY+0x5b> + // 0000000000000057: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[91] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x55, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x20, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x44, 0xc8, 0x18, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ImportFrom+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportFrom); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x57, (uintptr_t)data + 0x14); +} + +void +emit__IMPORT_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IMPORT_NAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 49 8b 04 24 movq (%r12), %rax + // 10: 48 8b 40 20 movq 0x20(%rax), %rax + // 14: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1b: 4c 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %r8 + // 20: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 25: 48 89 5c 24 20 movq %rbx, 0x20(%rsp) + // 2a: 4c 89 f1 movq %r14, %rcx + // 2d: 4c 89 e2 movq %r12, %rdx + // 30: 49 89 f1 movq %rsi, %r9 + // 33: ff 15 00 00 00 00 callq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: IMAGE_REL_AMD64_REL32 __imp__PyEval_ImportName + // 39: 48 89 c7 movq %rax, %rdi + // 3c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 41: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4a: 8b 03 movl (%rbx), %eax + // 4c: 85 c0 testl %eax, %eax + // 4e: 78 0f js 0x5f <_JIT_ENTRY+0x5f> + // 50: ff c8 decl %eax + // 52: 89 03 movl %eax, (%rbx) + // 54: 75 09 jne 0x5f <_JIT_ENTRY+0x5f> + // 56: 48 89 d9 movq %rbx, %rcx + // 59: ff 15 00 00 00 00 callq *(%rip) # 0x5f <_JIT_ENTRY+0x5f> + // 000000000000005b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 5f: 8b 06 movl (%rsi), %eax + // 61: 85 c0 testl %eax, %eax + // 63: 78 06 js 0x6b <_JIT_ENTRY+0x6b> + // 65: ff c8 decl %eax + // 67: 89 06 movl %eax, (%rsi) + // 69: 74 18 je 0x83 <_JIT_ENTRY+0x83> + // 6b: 48 85 ff testq %rdi, %rdi + // 6e: 74 21 je 0x91 <_JIT_ENTRY+0x91> + // 70: 49 89 7d f0 movq %rdi, -0x10(%r13) + // 74: 49 83 c5 f8 addq $-0x8, %r13 + // 78: 48 83 c4 28 addq $0x28, %rsp + // 7c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x83 <_JIT_ENTRY+0x83> + // 000000000000007f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 83: 48 89 f1 movq %rsi, %rcx + // 86: ff 15 00 00 00 00 callq *(%rip) # 0x8c <_JIT_ENTRY+0x8c> + // 0000000000000088: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 8c: 48 85 ff testq %rdi, %rdi + // 8f: 75 df jne 0x70 <_JIT_ENTRY+0x70> + // 91: 49 83 c5 f0 addq $-0x10, %r13 + // 95: 48 83 c4 28 addq $0x28, %rsp + // 99: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa0 <_JIT_ENTRY+0xa0> + // 000000000000009c: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[160] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x44, 0xc8, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0x5c, + 0x24, 0x20, 0x4c, 0x89, 0xf1, 0x4c, 0x89, 0xe2, + 0x49, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, + 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x06, 0x74, 0x18, 0x48, 0x85, 0xff, 0x74, 0x21, + 0x49, 0x89, 0x7d, 0xf0, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xff, 0x75, + 0xdf, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_ImportName+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_ImportName); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x9c, (uintptr_t)data + 0x1c); +} + +void +emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_BOUND_METHOD_EXACT_ARGS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: ba fe ff ff ff movl $0xfffffffe, %edx # imm = 0xFFFFFFFE + // 10: 29 c2 subl %eax, %edx + // 12: f7 d0 notl %eax + // 14: 48 63 c8 movslq %eax, %rcx + // 17: 48 63 c2 movslq %edx, %rax + // 1a: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1f: 48 8b 72 18 movq 0x18(%rdx), %rsi + // 23: 8b 3e movl (%rsi), %edi + // 25: 85 ff testl %edi, %edi + // 27: 78 04 js 0x2d <_JIT_ENTRY+0x2d> + // 29: ff c7 incl %edi + // 2b: 89 3e movl %edi, (%rsi) + // 2d: 49 89 74 cd 00 movq %rsi, (%r13,%rcx,8) + // 32: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 37: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 3b: 8b 32 movl (%rdx), %esi + // 3d: 85 f6 testl %esi, %esi + // 3f: 78 04 js 0x45 <_JIT_ENTRY+0x45> + // 41: ff c6 incl %esi + // 43: 89 32 movl %esi, (%rdx) + // 45: 49 89 54 c5 00 movq %rdx, (%r13,%rax,8) + // 4a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4f: 8b 01 movl (%rcx), %eax + // 51: 85 c0 testl %eax, %eax + // 53: 78 06 js 0x5b <_JIT_ENTRY+0x5b> + // 55: ff c8 decl %eax + // 57: 89 01 movl %eax, (%rcx) + // 59: 74 19 je 0x74 <_JIT_ENTRY+0x74> + // 5b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 60: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 69: 48 83 c4 28 addq $0x28, %rsp + // 6d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 48 83 c4 28 addq $0x28, %rsp + // 8c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[140] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xba, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xc2, 0xf7, 0xd0, 0x48, 0x63, 0xc8, 0x48, + 0x63, 0xc2, 0x49, 0x8b, 0x54, 0xc5, 0x00, 0x48, + 0x8b, 0x72, 0x18, 0x8b, 0x3e, 0x85, 0xff, 0x78, + 0x04, 0xff, 0xc7, 0x89, 0x3e, 0x49, 0x89, 0x74, + 0xcd, 0x00, 0x49, 0x8b, 0x4c, 0xc5, 0x00, 0x48, + 0x8b, 0x52, 0x10, 0x8b, 0x32, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x32, 0x49, 0x89, 0x54, + 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0xc); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 89 f0 movl %esi, %eax + // 9: f7 d0 notl %eax + // b: 48 98 cltq + // d: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 12: 29 f1 subl %esi, %ecx + // 14: 48 63 c9 movslq %ecx, %rcx + // 17: 4d 8b 54 c5 00 movq (%r13,%rax,8), %r10 + // 1c: 49 83 fa 01 cmpq $0x1, %r10 + // 20: 89 f3 movl %esi, %ebx + // 22: 83 db ff sbbl $-0x1, %ebx + // 25: 4d 8b 44 cd 00 movq (%r13,%rcx,8), %r8 + // 2a: 49 8b 78 30 movq 0x30(%r8), %rdi + // 2e: 49 8b 96 e8 00 00 00 movq 0xe8(%r14), %rdx + // 35: 4c 63 4f 4c movslq 0x4c(%rdi), %r9 + // 39: 4e 8d 0c ca leaq (%rdx,%r9,8), %r9 + // 3d: 4d 89 8e e8 00 00 00 movq %r9, 0xe8(%r14) + // 44: 4c 89 62 08 movq %r12, 0x8(%rdx) + // 48: 4c 89 42 10 movq %r8, 0x10(%rdx) + // 4c: 44 8b 0f movl (%rdi), %r9d + // 4f: 45 85 c9 testl %r9d, %r9d + // 52: 78 06 js 0x5a <_JIT_ENTRY+0x5a> + // 54: 41 ff c1 incl %r9d + // 57: 44 89 0f movl %r9d, (%rdi) + // 5a: 48 8d 04 c5 00 00 00 00 leaq (,%rax,8), %rax + // 62: 4c 01 e8 addq %r13, %rax + // 65: 48 89 3a movq %rdi, (%rdx) + // 68: 4d 8b 48 18 movq 0x18(%r8), %r9 + // 6c: 4c 89 4a 20 movq %r9, 0x20(%rdx) + // 70: 4d 8b 40 10 movq 0x10(%r8), %r8 + // 74: 4c 89 42 18 movq %r8, 0x18(%rdx) + // 78: 48 c7 42 28 00 00 00 00 movq $0x0, 0x28(%rdx) + // 80: 4c 8d 4a 50 leaq 0x50(%rdx), %r9 + // 84: 4c 63 47 48 movslq 0x48(%rdi), %r8 + // 88: 4e 8d 44 c2 50 leaq 0x50(%rdx,%r8,8), %r8 + // 8d: 4c 89 42 40 movq %r8, 0x40(%rdx) + // 91: 48 c7 42 30 00 00 00 00 movq $0x0, 0x30(%rdx) + // 99: 4c 8d 87 d0 00 00 00 leaq 0xd0(%rdi), %r8 + // a0: 4c 89 42 38 movq %r8, 0x38(%rdx) + // a4: c7 42 48 00 00 00 00 movl $0x0, 0x48(%rdx) + // ab: 39 5f 48 cmpl %ebx, 0x48(%rdi) + // ae: 7e 24 jle 0xd4 <_JIT_ENTRY+0xd4> + // b0: 41 89 d8 movl %ebx, %r8d + // b3: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // c0: 4b c7 04 c1 00 00 00 00 movq $0x0, (%r9,%r8,8) + // c8: 49 ff c0 incq %r8 + // cb: 4c 63 5f 48 movslq 0x48(%rdi), %r11 + // cf: 4d 39 d8 cmpq %r11, %r8 + // d2: 7c ec jl 0xc0 <_JIT_ENTRY+0xc0> + // d4: 45 31 c0 xorl %r8d, %r8d + // d7: 4d 85 d2 testq %r10, %r10 + // da: 0f 95 c3 setne %bl + // dd: 48 8b 38 movq (%rax), %rdi + // e0: 49 89 39 movq %rdi, (%r9) + // e3: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xea <_JIT_ENTRY+0xea> + // 00000000000000e6: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // ea: 66 85 ff testw %di, %di + // ed: 0f 84 15 01 00 00 je 0x208 <_JIT_ENTRY+0x208> + // f3: 41 88 d8 movb %bl, %r8b + // f6: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xfd <_JIT_ENTRY+0xfd> + // 00000000000000f9: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // fd: 0f b7 ff movzwl %di, %edi + // 100: 66 83 ff 11 cmpw $0x11, %di + // 104: 76 2a jbe 0x130 <_JIT_ENTRY+0x130> + // 106: 45 31 db xorl %r11d, %r11d + // 109: 4d 85 d2 testq %r10, %r10 + // 10c: 41 0f 95 c3 setne %r11b + // 110: 4e 8d 14 da leaq (%rdx,%r11,8), %r10 + // 114: 44 8d 3c fd 00 00 00 00 leal (,%rdi,8), %r15d + // 11c: 4d 01 fa addq %r15, %r10 + // 11f: 4d 29 ea subq %r13, %r10 + // 122: 49 83 c2 50 addq $0x50, %r10 + // 126: 49 83 fa 20 cmpq $0x20, %r10 + // 12a: 0f 83 91 00 00 00 jae 0x1c1 <_JIT_ENTRY+0x1c1> + // 130: 45 31 d2 xorl %r10d, %r10d + // 133: 48 89 fb movq %rdi, %rbx + // 136: 4d 89 d3 movq %r10, %r11 + // 139: 48 83 e3 03 andq $0x3, %rbx + // 13d: 74 21 je 0x160 <_JIT_ENTRY+0x160> + // 13f: c1 e6 03 shll $0x3, %esi + // 142: 4d 89 ef movq %r13, %r15 + // 145: 49 29 f7 subq %rsi, %r15 + // 148: 4b 8d 34 c1 leaq (%r9,%r8,8), %rsi + // 14c: 4d 89 d3 movq %r10, %r11 + // 14f: 90 nop + // 150: 4f 8b 0c df movq (%r15,%r11,8), %r9 + // 154: 4e 89 0c de movq %r9, (%rsi,%r11,8) + // 158: 49 ff c3 incq %r11 + // 15b: 48 ff cb decq %rbx + // 15e: 75 f0 jne 0x150 <_JIT_ENTRY+0x150> + // 160: 49 29 fa subq %rdi, %r10 + // 163: 49 83 fa fc cmpq $-0x4, %r10 + // 167: 0f 87 9b 00 00 00 ja 0x208 <_JIT_ENTRY+0x208> + // 16d: 44 8d 0c fd 00 00 00 00 leal (,%rdi,8), %r9d + // 175: 4c 89 ee movq %r13, %rsi + // 178: 4c 29 ce subq %r9, %rsi + // 17b: 48 83 c6 18 addq $0x18, %rsi + // 17f: 4e 8d 04 c2 leaq (%rdx,%r8,8), %r8 + // 183: 49 83 c0 68 addq $0x68, %r8 + // 187: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 190: 4e 8b 4c de e8 movq -0x18(%rsi,%r11,8), %r9 + // 195: 4f 89 4c d8 e8 movq %r9, -0x18(%r8,%r11,8) + // 19a: 4e 8b 4c de f0 movq -0x10(%rsi,%r11,8), %r9 + // 19f: 4f 89 4c d8 f0 movq %r9, -0x10(%r8,%r11,8) + // 1a4: 4e 8b 4c de f8 movq -0x8(%rsi,%r11,8), %r9 + // 1a9: 4f 89 4c d8 f8 movq %r9, -0x8(%r8,%r11,8) + // 1ae: 4e 8b 0c de movq (%rsi,%r11,8), %r9 + // 1b2: 4f 89 0c d8 movq %r9, (%r8,%r11,8) + // 1b6: 49 83 c3 04 addq $0x4, %r11 + // 1ba: 4c 39 df cmpq %r11, %rdi + // 1bd: 75 d1 jne 0x190 <_JIT_ENTRY+0x190> + // 1bf: eb 47 jmp 0x208 <_JIT_ENTRY+0x208> + // 1c1: 41 89 fa movl %edi, %r10d + // 1c4: 41 83 e2 fc andl $-0x4, %r10d + // 1c8: 4e 8d 1c c2 leaq (%rdx,%r8,8), %r11 + // 1cc: 49 83 c3 60 addq $0x60, %r11 + // 1d0: 4c 89 eb movq %r13, %rbx + // 1d3: 4c 29 fb subq %r15, %rbx + // 1d6: 48 83 c3 10 addq $0x10, %rbx + // 1da: 45 31 ff xorl %r15d, %r15d + // 1dd: 0f 1f 00 nopl (%rax) + // 1e0: 42 0f 10 44 fb f0 movups -0x10(%rbx,%r15,8), %xmm0 + // 1e6: 42 0f 10 0c fb movups (%rbx,%r15,8), %xmm1 + // 1eb: 43 0f 11 44 fb f0 movups %xmm0, -0x10(%r11,%r15,8) + // 1f1: 43 0f 11 0c fb movups %xmm1, (%r11,%r15,8) + // 1f6: 49 83 c7 04 addq $0x4, %r15 + // 1fa: 4d 39 fa cmpq %r15, %r10 + // 1fd: 75 e1 jne 0x1e0 <_JIT_ENTRY+0x1e0> + // 1ff: 41 39 fa cmpl %edi, %r10d + // 202: 0f 85 2b ff ff ff jne 0x133 <_JIT_ENTRY+0x133> + // 208: 49 89 54 cd 00 movq %rdx, (%r13,%rcx,8) + // 20d: 49 89 c5 movq %rax, %r13 + // 210: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x217 <_JIT_ENTRY+0x217> + // 0000000000000213: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[528] = { + 0x0f, 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0xf7, 0xd0, 0x48, 0x98, 0xb9, 0xfe, 0xff, + 0xff, 0xff, 0x29, 0xf1, 0x48, 0x63, 0xc9, 0x4d, + 0x8b, 0x54, 0xc5, 0x00, 0x49, 0x83, 0xfa, 0x01, + 0x89, 0xf3, 0x83, 0xdb, 0xff, 0x4d, 0x8b, 0x44, + 0xcd, 0x00, 0x49, 0x8b, 0x78, 0x30, 0x49, 0x8b, + 0x96, 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x4f, + 0x4c, 0x4e, 0x8d, 0x0c, 0xca, 0x4d, 0x89, 0x8e, + 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x62, 0x08, + 0x4c, 0x89, 0x42, 0x10, 0x44, 0x8b, 0x0f, 0x45, + 0x85, 0xc9, 0x78, 0x06, 0x41, 0xff, 0xc1, 0x44, + 0x89, 0x0f, 0x48, 0x8d, 0x04, 0xc5, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x01, 0xe8, 0x48, 0x89, 0x3a, + 0x4d, 0x8b, 0x48, 0x18, 0x4c, 0x89, 0x4a, 0x20, + 0x4d, 0x8b, 0x40, 0x10, 0x4c, 0x89, 0x42, 0x18, + 0x48, 0xc7, 0x42, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x8d, 0x4a, 0x50, 0x4c, 0x63, 0x47, 0x48, + 0x4e, 0x8d, 0x44, 0xc2, 0x50, 0x4c, 0x89, 0x42, + 0x40, 0x48, 0xc7, 0x42, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x87, 0xd0, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x42, 0x38, 0xc7, 0x42, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x39, 0x5f, 0x48, 0x7e, 0x24, + 0x41, 0x89, 0xd8, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0xc7, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc0, 0x4c, 0x63, 0x5f, 0x48, 0x4d, + 0x39, 0xd8, 0x7c, 0xec, 0x45, 0x31, 0xc0, 0x4d, + 0x85, 0xd2, 0x0f, 0x95, 0xc3, 0x48, 0x8b, 0x38, + 0x49, 0x89, 0x39, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x85, 0xff, 0x0f, 0x84, 0x15, + 0x01, 0x00, 0x00, 0x41, 0x88, 0xd8, 0x48, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xff, + 0x66, 0x83, 0xff, 0x11, 0x76, 0x2a, 0x45, 0x31, + 0xdb, 0x4d, 0x85, 0xd2, 0x41, 0x0f, 0x95, 0xc3, + 0x4e, 0x8d, 0x14, 0xda, 0x44, 0x8d, 0x3c, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x01, 0xfa, 0x4d, + 0x29, 0xea, 0x49, 0x83, 0xc2, 0x50, 0x49, 0x83, + 0xfa, 0x20, 0x0f, 0x83, 0x91, 0x00, 0x00, 0x00, + 0x45, 0x31, 0xd2, 0x48, 0x89, 0xfb, 0x4d, 0x89, + 0xd3, 0x48, 0x83, 0xe3, 0x03, 0x74, 0x21, 0xc1, + 0xe6, 0x03, 0x4d, 0x89, 0xef, 0x49, 0x29, 0xf7, + 0x4b, 0x8d, 0x34, 0xc1, 0x4d, 0x89, 0xd3, 0x90, + 0x4f, 0x8b, 0x0c, 0xdf, 0x4e, 0x89, 0x0c, 0xde, + 0x49, 0xff, 0xc3, 0x48, 0xff, 0xcb, 0x75, 0xf0, + 0x49, 0x29, 0xfa, 0x49, 0x83, 0xfa, 0xfc, 0x0f, + 0x87, 0x9b, 0x00, 0x00, 0x00, 0x44, 0x8d, 0x0c, + 0xfd, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xee, + 0x4c, 0x29, 0xce, 0x48, 0x83, 0xc6, 0x18, 0x4e, + 0x8d, 0x04, 0xc2, 0x49, 0x83, 0xc0, 0x68, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x8b, 0x4c, 0xde, 0xe8, 0x4f, 0x89, 0x4c, + 0xd8, 0xe8, 0x4e, 0x8b, 0x4c, 0xde, 0xf0, 0x4f, + 0x89, 0x4c, 0xd8, 0xf0, 0x4e, 0x8b, 0x4c, 0xde, + 0xf8, 0x4f, 0x89, 0x4c, 0xd8, 0xf8, 0x4e, 0x8b, + 0x0c, 0xde, 0x4f, 0x89, 0x0c, 0xd8, 0x49, 0x83, + 0xc3, 0x04, 0x4c, 0x39, 0xdf, 0x75, 0xd1, 0xeb, + 0x47, 0x41, 0x89, 0xfa, 0x41, 0x83, 0xe2, 0xfc, + 0x4e, 0x8d, 0x1c, 0xc2, 0x49, 0x83, 0xc3, 0x60, + 0x4c, 0x89, 0xeb, 0x4c, 0x29, 0xfb, 0x48, 0x83, + 0xc3, 0x10, 0x45, 0x31, 0xff, 0x0f, 0x1f, 0x00, + 0x42, 0x0f, 0x10, 0x44, 0xfb, 0xf0, 0x42, 0x0f, + 0x10, 0x0c, 0xfb, 0x43, 0x0f, 0x11, 0x44, 0xfb, + 0xf0, 0x43, 0x0f, 0x11, 0x0c, 0xfb, 0x49, 0x83, + 0xc7, 0x04, 0x4d, 0x39, 0xfa, 0x75, 0xe1, 0x41, + 0x39, 0xfa, 0x0f, 0x85, 0x2b, 0xff, 0xff, 0xff, + 0x49, 0x89, 0x54, 0xcd, 0x00, 0x49, 0x89, 0xc5, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xe6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf9, (uintptr_t)data + -0x4); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_0.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 f0 movq -0x10(%r13), %r8 + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 31 ff xorl %edi, %edi + // a: 48 85 f6 testq %rsi, %rsi + // d: 40 0f 95 c7 setne %dil + // 11: 49 8b 50 30 movq 0x30(%r8), %rdx + // 15: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 1c: 48 63 42 4c movslq 0x4c(%rdx), %rax + // 20: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 24: 49 89 86 e8 00 00 00 movq %rax, 0xe8(%r14) + // 2b: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 2f: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 33: 8b 02 movl (%rdx), %eax + // 35: 85 c0 testl %eax, %eax + // 37: 78 04 js 0x3d <_JIT_ENTRY+0x3d> + // 39: ff c0 incl %eax + // 3b: 89 02 movl %eax, (%rdx) + // 3d: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 41: 48 89 11 movq %rdx, (%rcx) + // 44: 4d 8b 48 18 movq 0x18(%r8), %r9 + // 48: 4c 89 49 20 movq %r9, 0x20(%rcx) + // 4c: 4d 8b 40 10 movq 0x10(%r8), %r8 + // 50: 4c 89 41 18 movq %r8, 0x18(%rcx) + // 54: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5c: 4c 63 42 48 movslq 0x48(%rdx), %r8 + // 60: 4e 8d 44 c1 50 leaq 0x50(%rcx,%r8,8), %r8 + // 65: 4c 89 41 40 movq %r8, 0x40(%rcx) + // 69: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 71: 4c 8d 82 d0 00 00 00 leaq 0xd0(%rdx), %r8 + // 78: 4c 89 41 38 movq %r8, 0x38(%rcx) + // 7c: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 83: 39 7a 48 cmpl %edi, 0x48(%rdx) + // 86: 7e 2c jle 0xb4 <_JIT_ENTRY+0xb4> + // 88: 48 8d 79 50 leaq 0x50(%rcx), %rdi + // 8c: 45 31 c0 xorl %r8d, %r8d + // 8f: 48 85 f6 testq %rsi, %rsi + // 92: 41 0f 95 c0 setne %r8b + // 96: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // a0: 4a c7 04 c7 00 00 00 00 movq $0x0, (%rdi,%r8,8) + // a8: 49 ff c0 incq %r8 + // ab: 48 63 72 48 movslq 0x48(%rdx), %rsi + // af: 49 39 f0 cmpq %rsi, %r8 + // b2: 7c ec jl 0xa0 <_JIT_ENTRY+0xa0> + // b4: 49 8b 55 f8 movq -0x8(%r13), %rdx + // b8: 48 89 51 50 movq %rdx, 0x50(%rcx) + // bc: 49 89 4d f0 movq %rcx, -0x10(%r13) + // c0: 49 89 c5 movq %rax, %r13 + // c3: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xca <_JIT_ENTRY+0xca> + // 00000000000000c6: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[195] = { + 0x4d, 0x8b, 0x45, 0xf0, 0x49, 0x8b, 0x75, 0xf8, + 0x31, 0xff, 0x48, 0x85, 0xf6, 0x40, 0x0f, 0x95, + 0xc7, 0x49, 0x8b, 0x50, 0x30, 0x49, 0x8b, 0x8e, + 0xe8, 0x00, 0x00, 0x00, 0x48, 0x63, 0x42, 0x4c, + 0x48, 0x8d, 0x04, 0xc1, 0x49, 0x89, 0x86, 0xe8, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x61, 0x08, 0x4c, + 0x89, 0x41, 0x10, 0x8b, 0x02, 0x85, 0xc0, 0x78, + 0x04, 0xff, 0xc0, 0x89, 0x02, 0x49, 0x8d, 0x45, + 0xf8, 0x48, 0x89, 0x11, 0x4d, 0x8b, 0x48, 0x18, + 0x4c, 0x89, 0x49, 0x20, 0x4d, 0x8b, 0x40, 0x10, + 0x4c, 0x89, 0x41, 0x18, 0x48, 0xc7, 0x41, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x42, 0x48, + 0x4e, 0x8d, 0x44, 0xc1, 0x50, 0x4c, 0x89, 0x41, + 0x40, 0x48, 0xc7, 0x41, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x82, 0xd0, 0x00, 0x00, 0x00, + 0x4c, 0x89, 0x41, 0x38, 0xc7, 0x41, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x39, 0x7a, 0x48, 0x7e, 0x2c, + 0x48, 0x8d, 0x79, 0x50, 0x45, 0x31, 0xc0, 0x48, + 0x85, 0xf6, 0x41, 0x0f, 0x95, 0xc0, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0xc7, 0x04, 0xc7, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xff, 0xc0, 0x48, 0x63, 0x72, 0x48, 0x49, + 0x39, 0xf0, 0x7c, 0xec, 0x49, 0x8b, 0x55, 0xf8, + 0x48, 0x89, 0x51, 0x50, 0x49, 0x89, 0x4d, 0xf0, + 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 e8 movq -0x18(%r13), %r8 + // 4: 49 8b 55 f0 movq -0x10(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 01 00 00 00 movl $0x1, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 e8 00 00 00 movq %rax, 0xe8(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 f0 leaq -0x10(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 4d 8b 48 18 movq 0x18(%r8), %r9 + // 4b: 4c 89 49 20 movq %r9, 0x20(%rcx) + // 4f: 4d 8b 40 10 movq 0x10(%r8), %r8 + // 53: 4c 89 41 18 movq %r8, 0x18(%rcx) + // 57: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5f: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 63: 4e 8d 44 c1 50 leaq 0x50(%rcx,%r8,8), %r8 + // 68: 4c 89 41 40 movq %r8, 0x40(%rcx) + // 6c: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 74: 4c 8d 86 d0 00 00 00 leaq 0xd0(%rsi), %r8 + // 7b: 4c 89 41 38 movq %r8, 0x38(%rcx) + // 7f: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 86: 39 7e 48 cmpl %edi, 0x48(%rsi) + // 89: 7e 29 jle 0xb4 <_JIT_ENTRY+0xb4> + // 8b: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8f: 89 ff movl %edi, %edi + // 91: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // a0: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // a8: 48 ff c7 incq %rdi + // ab: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // af: 4c 39 cf cmpq %r9, %rdi + // b2: 7c ec jl 0xa0 <_JIT_ENTRY+0xa0> + // b4: 31 f6 xorl %esi, %esi + // b6: 48 85 d2 testq %rdx, %rdx + // b9: 40 0f 95 c6 setne %sil + // bd: 49 8b 55 f0 movq -0x10(%r13), %rdx + // c1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // c5: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // ce: 49 89 4d e8 movq %rcx, -0x18(%r13) + // d2: 49 89 c5 movq %rax, %r13 + // d5: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xdc <_JIT_ENTRY+0xdc> + // 00000000000000d8: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[213] = { + 0x4d, 0x8b, 0x45, 0xe8, 0x49, 0x8b, 0x55, 0xf0, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x01, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xf0, 0x48, 0x89, 0x31, 0x4d, + 0x8b, 0x48, 0x18, 0x4c, 0x89, 0x49, 0x20, 0x4d, + 0x8b, 0x40, 0x10, 0x4c, 0x89, 0x41, 0x18, 0x48, + 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x44, 0xc1, 0x50, + 0x4c, 0x89, 0x41, 0x40, 0x48, 0xc7, 0x41, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x86, 0xd0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x41, 0x38, 0xc7, + 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x39, 0x7e, + 0x48, 0x7e, 0x29, 0x4c, 0x8d, 0x41, 0x50, 0x89, + 0xff, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xf0, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x89, + 0x4d, 0xe8, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_2.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 e0 movq -0x20(%r13), %r8 + // 4: 49 8b 55 e8 movq -0x18(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 02 00 00 00 movl $0x2, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 e8 00 00 00 movq %rax, 0xe8(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 e8 leaq -0x18(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 4d 8b 48 18 movq 0x18(%r8), %r9 + // 4b: 4c 89 49 20 movq %r9, 0x20(%rcx) + // 4f: 4d 8b 40 10 movq 0x10(%r8), %r8 + // 53: 4c 89 41 18 movq %r8, 0x18(%rcx) + // 57: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5f: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 63: 4e 8d 44 c1 50 leaq 0x50(%rcx,%r8,8), %r8 + // 68: 4c 89 41 40 movq %r8, 0x40(%rcx) + // 6c: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 74: 4c 8d 86 d0 00 00 00 leaq 0xd0(%rsi), %r8 + // 7b: 4c 89 41 38 movq %r8, 0x38(%rcx) + // 7f: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 86: 39 7e 48 cmpl %edi, 0x48(%rsi) + // 89: 7e 29 jle 0xb4 <_JIT_ENTRY+0xb4> + // 8b: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8f: 89 ff movl %edi, %edi + // 91: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // a0: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // a8: 48 ff c7 incq %rdi + // ab: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // af: 4c 39 cf cmpq %r9, %rdi + // b2: 7c ec jl 0xa0 <_JIT_ENTRY+0xa0> + // b4: 31 f6 xorl %esi, %esi + // b6: 48 85 d2 testq %rdx, %rdx + // b9: 40 0f 95 c6 setne %sil + // bd: 49 8b 55 e8 movq -0x18(%r13), %rdx + // c1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // c5: 49 8b 55 f0 movq -0x10(%r13), %rdx + // c9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // ce: 49 8b 55 f8 movq -0x8(%r13), %rdx + // d2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // d7: 49 89 4d e0 movq %rcx, -0x20(%r13) + // db: 49 89 c5 movq %rax, %r13 + // de: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe5 <_JIT_ENTRY+0xe5> + // 00000000000000e1: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[222] = { + 0x4d, 0x8b, 0x45, 0xe0, 0x49, 0x8b, 0x55, 0xe8, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x02, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xe8, 0x48, 0x89, 0x31, 0x4d, + 0x8b, 0x48, 0x18, 0x4c, 0x89, 0x49, 0x20, 0x4d, + 0x8b, 0x40, 0x10, 0x4c, 0x89, 0x41, 0x18, 0x48, + 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x44, 0xc1, 0x50, + 0x4c, 0x89, 0x41, 0x40, 0x48, 0xc7, 0x41, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x86, 0xd0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x41, 0x38, 0xc7, + 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x39, 0x7e, + 0x48, 0x7e, 0x29, 0x4c, 0x8d, 0x41, 0x50, 0x89, + 0xff, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xe8, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x89, 0x4d, 0xe0, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_3.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 d8 movq -0x28(%r13), %r8 + // 4: 49 8b 55 e0 movq -0x20(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 03 00 00 00 movl $0x3, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 e8 00 00 00 movq %rax, 0xe8(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 e0 leaq -0x20(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 4d 8b 48 18 movq 0x18(%r8), %r9 + // 4b: 4c 89 49 20 movq %r9, 0x20(%rcx) + // 4f: 4d 8b 40 10 movq 0x10(%r8), %r8 + // 53: 4c 89 41 18 movq %r8, 0x18(%rcx) + // 57: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5f: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 63: 4e 8d 44 c1 50 leaq 0x50(%rcx,%r8,8), %r8 + // 68: 4c 89 41 40 movq %r8, 0x40(%rcx) + // 6c: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 74: 4c 8d 86 d0 00 00 00 leaq 0xd0(%rsi), %r8 + // 7b: 4c 89 41 38 movq %r8, 0x38(%rcx) + // 7f: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 86: 39 7e 48 cmpl %edi, 0x48(%rsi) + // 89: 7e 29 jle 0xb4 <_JIT_ENTRY+0xb4> + // 8b: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8f: 89 ff movl %edi, %edi + // 91: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // a0: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // a8: 48 ff c7 incq %rdi + // ab: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // af: 4c 39 cf cmpq %r9, %rdi + // b2: 7c ec jl 0xa0 <_JIT_ENTRY+0xa0> + // b4: 31 f6 xorl %esi, %esi + // b6: 48 85 d2 testq %rdx, %rdx + // b9: 40 0f 95 c6 setne %sil + // bd: 49 8b 55 e0 movq -0x20(%r13), %rdx + // c1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // c5: 49 8b 55 e8 movq -0x18(%r13), %rdx + // c9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // ce: 49 8b 55 f0 movq -0x10(%r13), %rdx + // d2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // d7: 49 8b 55 f8 movq -0x8(%r13), %rdx + // db: 48 89 54 f1 60 movq %rdx, 0x60(%rcx,%rsi,8) + // e0: 49 89 4d d8 movq %rcx, -0x28(%r13) + // e4: 49 89 c5 movq %rax, %r13 + // e7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xee <_JIT_ENTRY+0xee> + // 00000000000000ea: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[231] = { + 0x4d, 0x8b, 0x45, 0xd8, 0x49, 0x8b, 0x55, 0xe0, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x03, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xe0, 0x48, 0x89, 0x31, 0x4d, + 0x8b, 0x48, 0x18, 0x4c, 0x89, 0x49, 0x20, 0x4d, + 0x8b, 0x40, 0x10, 0x4c, 0x89, 0x41, 0x18, 0x48, + 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x44, 0xc1, 0x50, + 0x4c, 0x89, 0x41, 0x40, 0x48, 0xc7, 0x41, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x86, 0xd0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x41, 0x38, 0xc7, + 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x39, 0x7e, + 0x48, 0x7e, 0x29, 0x4c, 0x8d, 0x41, 0x50, 0x89, + 0xff, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xe0, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xe8, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, 0x60, + 0x49, 0x89, 0x4d, 0xd8, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__INIT_CALL_PY_EXACT_ARGS_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _INIT_CALL_PY_EXACT_ARGS_4.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 4d 8b 45 d0 movq -0x30(%r13), %r8 + // 4: 49 8b 55 d8 movq -0x28(%r13), %rdx + // 8: 48 83 fa 01 cmpq $0x1, %rdx + // c: bf 04 00 00 00 movl $0x4, %edi + // 11: 83 df ff sbbl $-0x1, %edi + // 14: 49 8b 70 30 movq 0x30(%r8), %rsi + // 18: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 1f: 48 63 46 4c movslq 0x4c(%rsi), %rax + // 23: 48 8d 04 c1 leaq (%rcx,%rax,8), %rax + // 27: 49 89 86 e8 00 00 00 movq %rax, 0xe8(%r14) + // 2e: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 32: 4c 89 41 10 movq %r8, 0x10(%rcx) + // 36: 8b 06 movl (%rsi), %eax + // 38: 85 c0 testl %eax, %eax + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c0 incl %eax + // 3e: 89 06 movl %eax, (%rsi) + // 40: 49 8d 45 d8 leaq -0x28(%r13), %rax + // 44: 48 89 31 movq %rsi, (%rcx) + // 47: 4d 8b 48 18 movq 0x18(%r8), %r9 + // 4b: 4c 89 49 20 movq %r9, 0x20(%rcx) + // 4f: 4d 8b 40 10 movq 0x10(%r8), %r8 + // 53: 4c 89 41 18 movq %r8, 0x18(%rcx) + // 57: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 5f: 4c 63 46 48 movslq 0x48(%rsi), %r8 + // 63: 4e 8d 44 c1 50 leaq 0x50(%rcx,%r8,8), %r8 + // 68: 4c 89 41 40 movq %r8, 0x40(%rcx) + // 6c: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // 74: 4c 8d 86 d0 00 00 00 leaq 0xd0(%rsi), %r8 + // 7b: 4c 89 41 38 movq %r8, 0x38(%rcx) + // 7f: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // 86: 39 7e 48 cmpl %edi, 0x48(%rsi) + // 89: 7e 29 jle 0xb4 <_JIT_ENTRY+0xb4> + // 8b: 4c 8d 41 50 leaq 0x50(%rcx), %r8 + // 8f: 89 ff movl %edi, %edi + // 91: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax) + // a0: 49 c7 04 f8 00 00 00 00 movq $0x0, (%r8,%rdi,8) + // a8: 48 ff c7 incq %rdi + // ab: 4c 63 4e 48 movslq 0x48(%rsi), %r9 + // af: 4c 39 cf cmpq %r9, %rdi + // b2: 7c ec jl 0xa0 <_JIT_ENTRY+0xa0> + // b4: 31 f6 xorl %esi, %esi + // b6: 48 85 d2 testq %rdx, %rdx + // b9: 40 0f 95 c6 setne %sil + // bd: 49 8b 55 d8 movq -0x28(%r13), %rdx + // c1: 48 89 51 50 movq %rdx, 0x50(%rcx) + // c5: 49 8b 55 e0 movq -0x20(%r13), %rdx + // c9: 48 89 54 f1 50 movq %rdx, 0x50(%rcx,%rsi,8) + // ce: 49 8b 55 e8 movq -0x18(%r13), %rdx + // d2: 48 89 54 f1 58 movq %rdx, 0x58(%rcx,%rsi,8) + // d7: 49 8b 55 f0 movq -0x10(%r13), %rdx + // db: 48 89 54 f1 60 movq %rdx, 0x60(%rcx,%rsi,8) + // e0: 49 8b 55 f8 movq -0x8(%r13), %rdx + // e4: 48 89 54 f1 68 movq %rdx, 0x68(%rcx,%rsi,8) + // e9: 49 89 4d d0 movq %rcx, -0x30(%r13) + // ed: 49 89 c5 movq %rax, %r13 + // f0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf7 <_JIT_ENTRY+0xf7> + // 00000000000000f3: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[240] = { + 0x4d, 0x8b, 0x45, 0xd0, 0x49, 0x8b, 0x55, 0xd8, + 0x48, 0x83, 0xfa, 0x01, 0xbf, 0x04, 0x00, 0x00, + 0x00, 0x83, 0xdf, 0xff, 0x49, 0x8b, 0x70, 0x30, + 0x49, 0x8b, 0x8e, 0xe8, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x46, 0x4c, 0x48, 0x8d, 0x04, 0xc1, 0x49, + 0x89, 0x86, 0xe8, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x61, 0x08, 0x4c, 0x89, 0x41, 0x10, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x06, + 0x49, 0x8d, 0x45, 0xd8, 0x48, 0x89, 0x31, 0x4d, + 0x8b, 0x48, 0x18, 0x4c, 0x89, 0x49, 0x20, 0x4d, + 0x8b, 0x40, 0x10, 0x4c, 0x89, 0x41, 0x18, 0x48, + 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x63, 0x46, 0x48, 0x4e, 0x8d, 0x44, 0xc1, 0x50, + 0x4c, 0x89, 0x41, 0x40, 0x48, 0xc7, 0x41, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0x86, 0xd0, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0x41, 0x38, 0xc7, + 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x39, 0x7e, + 0x48, 0x7e, 0x29, 0x4c, 0x8d, 0x41, 0x50, 0x89, + 0xff, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2e, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xc7, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0xc7, 0x4c, 0x63, 0x4e, 0x48, 0x4c, + 0x39, 0xcf, 0x7c, 0xec, 0x31, 0xf6, 0x48, 0x85, + 0xd2, 0x40, 0x0f, 0x95, 0xc6, 0x49, 0x8b, 0x55, + 0xd8, 0x48, 0x89, 0x51, 0x50, 0x49, 0x8b, 0x55, + 0xe0, 0x48, 0x89, 0x54, 0xf1, 0x50, 0x49, 0x8b, + 0x55, 0xe8, 0x48, 0x89, 0x54, 0xf1, 0x58, 0x49, + 0x8b, 0x55, 0xf0, 0x48, 0x89, 0x54, 0xf1, 0x60, + 0x49, 0x8b, 0x55, 0xf8, 0x48, 0x89, 0x54, 0xf1, + 0x68, 0x49, 0x89, 0x4d, 0xd0, 0x49, 0x89, 0xc5, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__IS_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_NONE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // f: 74 22 je 0x33 <_JIT_ENTRY+0x33> + // 11: 8b 01 movl (%rcx), %eax + // 13: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 1a: 85 c0 testl %eax, %eax + // 1c: 78 06 js 0x24 <_JIT_ENTRY+0x24> + // 1e: ff c8 decl %eax + // 20: 89 01 movl %eax, (%rcx) + // 22: 74 25 je 0x49 <_JIT_ENTRY+0x49> + // 24: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 28: 48 83 c4 28 addq $0x28, %rsp + // 2c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x33 <_JIT_ENTRY+0x33> + // 000000000000002f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 33: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 3a: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 3e: 48 83 c4 28 addq $0x28, %rsp + // 42: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 49: ff 15 00 00 00 00 callq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4f: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 53: 48 83 c4 28 addq $0x28, %rsp + // 57: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[87] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x22, 0x8b, 0x01, 0x48, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x25, 0x49, 0x89, 0x75, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: CONTINUE + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x1c); +} + +void +emit__IS_OP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _IS_OP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 8: 49 8b 7d f8 movq -0x8(%r13), %rdi + // c: 8b 06 movl (%rsi), %eax + // e: 85 c0 testl %eax, %eax + // 10: 78 0f js 0x21 <_JIT_ENTRY+0x21> + // 12: ff c8 decl %eax + // 14: 89 06 movl %eax, (%rsi) + // 16: 75 09 jne 0x21 <_JIT_ENTRY+0x21> + // 18: 48 89 f1 movq %rsi, %rcx + // 1b: ff 15 00 00 00 00 callq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 21: 8b 07 movl (%rdi), %eax + // 23: 85 c0 testl %eax, %eax + // 25: 78 0f js 0x36 <_JIT_ENTRY+0x36> + // 27: ff c8 decl %eax + // 29: 89 07 movl %eax, (%rdi) + // 2b: 75 09 jne 0x36 <_JIT_ENTRY+0x36> + // 2d: 48 89 f9 movq %rdi, %rcx + // 30: ff 15 00 00 00 00 callq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 36: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 3a: 31 c9 xorl %ecx, %ecx + // 3c: 48 39 fe cmpq %rdi, %rsi + // 3f: 0f 94 c1 sete %cl + // 42: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 49: 66 39 d1 cmpw %dx, %cx + // 4c: 75 19 jne 0x67 <_JIT_ENTRY+0x67> + // 4e: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 55: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 59: 49 89 c5 movq %rax, %r13 + // 5c: 48 83 c4 28 addq $0x28, %rsp + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 67: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 6e: 49 89 4d f0 movq %rcx, -0x10(%r13) + // 72: 49 89 c5 movq %rax, %r13 + // 75: 48 83 c4 28 addq $0x28, %rsp + // 79: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x80 <_JIT_ENTRY+0x80> + // 000000000000007c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[121] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x06, 0x75, 0x09, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x07, 0x75, 0x09, 0x48, 0x89, 0xf9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8d, + 0x45, 0xf8, 0x31, 0xc9, 0x48, 0x39, 0xfe, 0x0f, + 0x94, 0xc1, 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x39, 0xd1, 0x75, 0x19, 0x48, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, + 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x4d, 0xf0, 0x49, 0x89, 0xc5, 0x48, 0x83, 0xc4, + 0x28, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPARG + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: &_Py_TrueStruct+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x51, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0x1c); +} + +void +emit__ITER_CHECK_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_LIST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyListIter_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyListIter_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyListIter_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__ITER_CHECK_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_RANGE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyRangeIter_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyRangeIter_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyRangeIter_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__ITER_CHECK_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_CHECK_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyTupleIter_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTupleIter_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTupleIter_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__ITER_NEXT_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_LIST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 10 movq 0x10(%rax), %rcx + // 8: 48 8b 50 18 movq 0x18(%rax), %rdx + // c: 48 8b 52 18 movq 0x18(%rdx), %rdx + // 10: 48 8d 71 01 leaq 0x1(%rcx), %rsi + // 14: 48 89 70 10 movq %rsi, 0x10(%rax) + // 18: 48 8b 04 ca movq (%rdx,%rcx,8), %rax + // 1c: 8b 08 movl (%rax), %ecx + // 1e: 85 c9 testl %ecx, %ecx + // 20: 78 04 js 0x26 <_JIT_ENTRY+0x26> + // 22: ff c1 incl %ecx + // 24: 89 08 movl %ecx, (%rax) + // 26: 49 89 45 00 movq %rax, (%r13) + // 2a: 49 83 c5 08 addq $0x8, %r13 + // 2e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[46] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x10, + 0x48, 0x8b, 0x50, 0x18, 0x48, 0x8b, 0x52, 0x18, + 0x48, 0x8d, 0x71, 0x01, 0x48, 0x89, 0x70, 0x10, + 0x48, 0x8b, 0x04, 0xca, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__ITER_NEXT_RANGE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_RANGE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 8b 48 10 movl 0x10(%rax), %ecx + // b: 8b 50 14 movl 0x14(%rax), %edx + // e: 01 ca addl %ecx, %edx + // 10: 89 50 10 movl %edx, 0x10(%rax) + // 13: ff 48 18 decl 0x18(%rax) + // 16: ff 15 00 00 00 00 callq *(%rip) # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp_PyLong_FromLong + // 1c: 48 85 c0 testq %rax, %rax + // 1f: 74 13 je 0x34 <_JIT_ENTRY+0x34> + // 21: 49 89 45 00 movq %rax, (%r13) + // 25: 49 83 c5 08 addq $0x8, %r13 + // 29: 48 83 c4 28 addq $0x28, %rsp + // 2d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 34: 48 83 c4 28 addq $0x28, %rsp + // 38: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[63] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x8b, 0x48, 0x10, 0x8b, 0x50, 0x14, 0x01, 0xca, + 0x89, 0x50, 0x10, 0xff, 0x48, 0x18, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, + 0x13, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_FromLong+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_FromLong); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0xc); +} + +void +emit__ITER_NEXT_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _ITER_NEXT_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 48 10 movq 0x10(%rax), %rcx + // 8: 48 8b 50 18 movq 0x18(%rax), %rdx + // c: 48 8d 71 01 leaq 0x1(%rcx), %rsi + // 10: 48 89 70 10 movq %rsi, 0x10(%rax) + // 14: 48 8b 44 ca 18 movq 0x18(%rdx,%rcx,8), %rax + // 19: 8b 08 movl (%rax), %ecx + // 1b: 85 c9 testl %ecx, %ecx + // 1d: 78 04 js 0x23 <_JIT_ENTRY+0x23> + // 1f: ff c1 incl %ecx + // 21: 89 08 movl %ecx, (%rax) + // 23: 49 89 45 00 movq %rax, (%r13) + // 27: 49 83 c5 08 addq $0x8, %r13 + // 2b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[43] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x48, 0x10, + 0x48, 0x8b, 0x50, 0x18, 0x48, 0x8d, 0x71, 0x01, + 0x48, 0x89, 0x70, 0x10, 0x48, 0x8b, 0x44, 0xca, + 0x18, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__JUMP_TO_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _JUMP_TO_TOP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[7] = { + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LIST_APPEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_APPEND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 e8 movq %r13, %rax + // 7: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0xd <_JIT_ENTRY+0xd> + // 0000000000000009: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // d: f7 d1 notl %ecx + // f: 49 83 c5 f8 addq $-0x8, %r13 + // 13: 48 8b 50 f8 movq -0x8(%rax), %rdx + // 17: c1 e1 03 shll $0x3, %ecx + // 1a: 48 81 c9 00 00 f8 ff orq $-0x80000, %rcx # imm = 0xFFF80000 + // 21: 48 8b 0c 08 movq (%rax,%rcx), %rcx + // 25: 48 8b 41 10 movq 0x10(%rcx), %rax + // 29: 48 39 41 20 cmpq %rax, 0x20(%rcx) + // 2d: 7e 1a jle 0x49 <_JIT_ENTRY+0x49> + // 2f: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 33: 48 89 14 c6 movq %rdx, (%rsi,%rax,8) + // 37: 48 ff c0 incq %rax + // 3a: 48 89 41 10 movq %rax, 0x10(%rcx) + // 3e: 48 83 c4 28 addq $0x28, %rsp + // 42: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 49: ff 15 00 00 00 00 callq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: IMAGE_REL_AMD64_REL32 __imp__PyList_AppendTakeRefListResize + // 4f: 85 c0 testl %eax, %eax + // 51: 78 0b js 0x5e <_JIT_ENTRY+0x5e> + // 53: 48 83 c4 28 addq $0x28, %rsp + // 57: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 5e: 48 83 c4 28 addq $0x28, %rsp + // 62: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[105] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xe8, 0x8b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xd1, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x8b, 0x50, 0xf8, 0xc1, + 0xe1, 0x03, 0x48, 0x81, 0xc9, 0x00, 0x00, 0xf8, + 0xff, 0x48, 0x8b, 0x0c, 0x08, 0x48, 0x8b, 0x41, + 0x10, 0x48, 0x39, 0x41, 0x20, 0x7e, 0x1a, 0x48, + 0x8b, 0x71, 0x18, 0x48, 0x89, 0x14, 0xc6, 0x48, + 0xff, 0xc0, 0x48, 0x89, 0x41, 0x10, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x78, 0x0b, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_PyList_AppendTakeRefListResize+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_PyList_AppendTakeRefListResize); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x9, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x45, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x14); +} + +void +emit__LIST_EXTEND( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LIST_EXTEND.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax # 0xa <_JIT_ENTRY+0xa> + // 0000000000000006: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // a: f7 d0 notl %eax + // c: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 19: 49 8b 4c 05 00 movq (%r13,%rax), %rcx + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 f2 movq %rsi, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__PyList_Extend + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 85 c0 testq %rax, %rax + // 3d: 74 1f je 0x5e <_JIT_ENTRY+0x5e> + // 3f: 8b 06 movl (%rsi), %eax + // 41: 85 c0 testl %eax, %eax + // 43: 78 0a js 0x4f <_JIT_ENTRY+0x4f> + // 45: ff c8 decl %eax + // 47: 89 06 movl %eax, (%rsi) + // 49: 0f 84 a6 00 00 00 je 0xf5 <_JIT_ENTRY+0xf5> + // 4f: 49 83 c5 f8 addq $-0x8, %r13 + // 53: 48 83 c4 28 addq $0x28, %rsp + // 57: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5e <_JIT_ENTRY+0x5e> + // 000000000000005a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 5e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 63: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // 6a: 48 8b 17 movq (%rdi), %rdx + // 6d: 4c 89 f1 movq %r14, %rcx + // 70: ff 15 00 00 00 00 callq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp__PyErr_ExceptionMatches + // 76: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 84: 85 c0 testl %eax, %eax + // 86: 74 52 je 0xda <_JIT_ENTRY+0xda> + // 88: 48 8b 46 08 movq 0x8(%rsi), %rax + // 8c: 48 83 b8 d8 00 00 00 00 cmpq $0x0, 0xd8(%rax) + // 94: 75 44 jne 0xda <_JIT_ENTRY+0xda> + // 96: 48 89 f1 movq %rsi, %rcx + // 99: ff 15 00 00 00 00 callq *(%rip) # 0x9f <_JIT_ENTRY+0x9f> + // 000000000000009b: IMAGE_REL_AMD64_REL32 __imp_PySequence_Check + // 9f: 85 c0 testl %eax, %eax + // a1: 75 37 jne 0xda <_JIT_ENTRY+0xda> + // a3: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a8: 4c 89 f1 movq %r14, %rcx + // ab: ff 15 00 00 00 00 callq *(%rip) # 0xb1 <_JIT_ENTRY+0xb1> + // 00000000000000ad: IMAGE_REL_AMD64_REL32 __imp__PyErr_Clear + // b1: 48 8b 46 08 movq 0x8(%rsi), %rax + // b5: 4c 8b 48 18 movq 0x18(%rax), %r9 + // b9: 48 8b 17 movq (%rdi), %rdx + // bc: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: IMAGE_REL_AMD64_REL32 ??_C@_0CO@OBBMLOHJ@Value?5after?5?$CK?5must?5be?5an?5iterabl@ + // c3: 4c 89 f1 movq %r14, %rcx + // c6: ff 15 00 00 00 00 callq *(%rip) # 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000c8: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // cc: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d1: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // da: 8b 06 movl (%rsi), %eax + // dc: 85 c0 testl %eax, %eax + // de: 78 06 js 0xe6 <_JIT_ENTRY+0xe6> + // e0: ff c8 decl %eax + // e2: 89 06 movl %eax, (%rsi) + // e4: 74 27 je 0x10d <_JIT_ENTRY+0x10d> + // e6: 49 83 c5 f8 addq $-0x8, %r13 + // ea: 48 83 c4 28 addq $0x28, %rsp + // ee: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf5 <_JIT_ENTRY+0xf5> + // 00000000000000f1: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // f5: 48 89 f1 movq %rsi, %rcx + // f8: ff 15 00 00 00 00 callq *(%rip) # 0xfe <_JIT_ENTRY+0xfe> + // 00000000000000fa: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // fe: 49 83 c5 f8 addq $-0x8, %r13 + // 102: 48 83 c4 28 addq $0x28, %rsp + // 106: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x10d <_JIT_ENTRY+0x10d> + // 0000000000000109: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 10d: 48 89 f1 movq %rsi, %rcx + // 110: ff 15 00 00 00 00 callq *(%rip) # 0x116 <_JIT_ENTRY+0x116> + // 0000000000000112: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 116: 49 83 c5 f8 addq $-0x8, %r13 + // 11a: 48 83 c4 28 addq $0x28, %rsp + // 11e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x125 <_JIT_ENTRY+0x125> + // 0000000000000121: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[293] = { + 0x48, 0x83, 0xec, 0x28, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x75, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x4c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf2, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1f, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x0a, 0xff, 0xc8, 0x89, + 0x06, 0x0f, 0x84, 0xa6, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x17, 0x4c, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x85, 0xc0, 0x74, 0x52, + 0x48, 0x8b, 0x46, 0x08, 0x48, 0x83, 0xb8, 0xd8, + 0x00, 0x00, 0x00, 0x00, 0x75, 0x44, 0x48, 0x89, + 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x75, 0x37, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x46, 0x08, 0x4c, 0x8b, 0x48, + 0x18, 0x48, 0x8b, 0x17, 0x4c, 0x8d, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x06, 0x74, 0x27, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: 'Value after * must be an iterable, not %.200s\x00' + // 2e: 00 00 + // 30: OPARG + // 38: &_PyList_Extend+0x0 + // 40: CONTINUE + // 48: &PyExc_TypeError+0x0 + // 50: &_PyErr_ExceptionMatches+0x0 + // 58: &PySequence_Check+0x0 + // 60: &_PyErr_Clear+0x0 + // 68: &_PyErr_Format+0x0 + // 70: ERROR_TARGET + // 78: &_Py_Dealloc+0x0 + const unsigned char data_body[128] = { + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, + 0x2e, 0x32, 0x30, 0x30, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, instruction->oparg); + patch_64(data + 0x38, (uintptr_t)&_PyList_Extend); + patch_64(data + 0x40, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x48, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x50, (uintptr_t)&_PyErr_ExceptionMatches); + patch_64(data + 0x58, (uintptr_t)&PySequence_Check); + patch_64(data + 0x60, (uintptr_t)&_PyErr_Clear); + patch_64(data + 0x68, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x70, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x78, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x5a, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x66, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x9b, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xbf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xc8, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xf1, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0xfa, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0x109, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x112, (uintptr_t)data + 0x74); + patch_x86_64_32rx(code + 0x121, (uintptr_t)data + 0x6c); +} + +void +emit__LOAD_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 ef movq %r13, %rdi + // 7: 8b 1d 00 00 00 00 movl (%rip), %ebx # 0xd <_JIT_ENTRY+0xd> + // 0000000000000009: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // d: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 11: 49 8b 04 24 movq (%r12), %rax + // 15: 48 8b 40 20 movq 0x20(%rax), %rax + // 19: 89 d9 movl %ebx, %ecx + // 1b: 81 e1 fe ff 00 00 andl $0xfffe, %ecx # imm = 0xFFFE + // 21: 48 8b 54 88 18 movq 0x18(%rax,%rcx,4), %rdx + // 26: 83 e3 01 andl $0x1, %ebx + // 29: 75 32 jne 0x5d <_JIT_ENTRY+0x5d> + // 2b: 49 89 7c 24 40 movq %rdi, 0x40(%r12) + // 30: 48 89 f1 movq %rsi, %rcx + // 33: ff 15 00 00 00 00 callq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: IMAGE_REL_AMD64_REL32 __imp_PyObject_GetAttr + // 39: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 47: 8b 0e movl (%rsi), %ecx + // 49: 85 c9 testl %ecx, %ecx + // 4b: 78 06 js 0x53 <_JIT_ENTRY+0x53> + // 4d: ff c9 decl %ecx + // 4f: 89 0e movl %ecx, (%rsi) + // 51: 74 79 je 0xcc <_JIT_ENTRY+0xcc> + // 53: 48 85 c0 testq %rax, %rax + // 56: 75 5e jne 0xb6 <_JIT_ENTRY+0xb6> + // 58: e9 83 00 00 00 jmp 0xe0 <_JIT_ENTRY+0xe0> + // 5d: 48 c7 44 24 20 00 00 00 00 movq $0x0, 0x20(%rsp) + // 66: 49 89 7c 24 40 movq %rdi, 0x40(%r12) + // 6b: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // 70: 48 89 f1 movq %rsi, %rcx + // 73: ff 15 00 00 00 00 callq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: IMAGE_REL_AMD64_REL32 __imp__PyObject_GetMethod + // 79: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 87: 85 c0 testl %eax, %eax + // 89: 74 07 je 0x92 <_JIT_ENTRY+0x92> + // 8b: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // 90: eb 21 jmp 0xb3 <_JIT_ENTRY+0xb3> + // 92: 8b 06 movl (%rsi), %eax + // 94: 85 c0 testl %eax, %eax + // 96: 78 0f js 0xa7 <_JIT_ENTRY+0xa7> + // 98: ff c8 decl %eax + // 9a: 89 06 movl %eax, (%rsi) + // 9c: 75 09 jne 0xa7 <_JIT_ENTRY+0xa7> + // 9e: 48 89 f1 movq %rsi, %rcx + // a1: ff 15 00 00 00 00 callq *(%rip) # 0xa7 <_JIT_ENTRY+0xa7> + // 00000000000000a3: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // a7: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // ac: 48 85 c0 testq %rax, %rax + // af: 74 2f je 0xe0 <_JIT_ENTRY+0xe0> + // b1: 31 f6 xorl %esi, %esi + // b3: 48 89 37 movq %rsi, (%rdi) + // b6: 49 89 45 f8 movq %rax, -0x8(%r13) + // ba: 89 d8 movl %ebx, %eax + // bc: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // c1: 48 83 c4 28 addq $0x28, %rsp + // c5: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000c8: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // cc: 48 89 f1 movq %rsi, %rcx + // cf: 48 89 c6 movq %rax, %rsi + // d2: ff 15 00 00 00 00 callq *(%rip) # 0xd8 <_JIT_ENTRY+0xd8> + // 00000000000000d4: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // d8: 48 89 f0 movq %rsi, %rax + // db: 48 85 c0 testq %rax, %rax + // de: 75 d6 jne 0xb6 <_JIT_ENTRY+0xb6> + // e0: 49 83 c5 f8 addq $-0x8, %r13 + // e4: 48 83 c4 28 addq $0x28, %rsp + // e8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xef <_JIT_ENTRY+0xef> + // 00000000000000eb: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[239] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xef, 0x8b, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, + 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, + 0x20, 0x89, 0xd9, 0x81, 0xe1, 0xfe, 0xff, 0x00, + 0x00, 0x48, 0x8b, 0x54, 0x88, 0x18, 0x83, 0xe3, + 0x01, 0x75, 0x32, 0x49, 0x89, 0x7c, 0x24, 0x40, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x0e, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, + 0x0e, 0x74, 0x79, 0x48, 0x85, 0xc0, 0x75, 0x5e, + 0xe9, 0x83, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x44, + 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x7c, 0x24, 0x40, 0x4c, 0x8d, 0x44, 0x24, 0x20, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x74, 0x07, 0x48, 0x8b, 0x44, 0x24, 0x20, + 0xeb, 0x21, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x06, 0x75, 0x09, 0x48, 0x89, + 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0x24, 0x20, 0x48, 0x85, 0xc0, 0x74, + 0x2f, 0x31, 0xf6, 0x48, 0x89, 0x37, 0x49, 0x89, + 0x45, 0xf8, 0x89, 0xd8, 0x4d, 0x8d, 0x6c, 0xc5, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x48, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf0, 0x48, 0x85, 0xc0, 0x75, 0xd6, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &PyObject_GetAttr+0x0 + // 10: &_PyObject_GetMethod+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_GetAttr); + patch_64(data + 0x10, (uintptr_t)&_PyObject_GetMethod); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x9, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa3, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc8, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd4, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xeb, (uintptr_t)data + 0x24); +} + +void +emit__LOAD_ATTR_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_CLASS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // f: 8b 06 movl (%rsi), %eax + // 11: 85 c0 testl %eax, %eax + // 13: 78 04 js 0x19 <_JIT_ENTRY+0x19> + // 15: ff c0 incl %eax + // 17: 89 06 movl %eax, (%rsi) + // 19: 8b 01 movl (%rcx), %eax + // 1b: 85 c0 testl %eax, %eax + // 1d: 78 06 js 0x25 <_JIT_ENTRY+0x25> + // 1f: ff c8 decl %eax + // 21: 89 01 movl %eax, (%rcx) + // 23: 74 0f je 0x34 <_JIT_ENTRY+0x34> + // 25: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 29: 48 83 c4 28 addq $0x28, %rsp + // 2d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 34: ff 15 00 00 00 00 callq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 3a: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 3e: 48 83 c4 28 addq $0x28, %rsp + // 42: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x49 <_JIT_ENTRY+0x49> + // 0000000000000045: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[66] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x35, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, + 0x06, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x01, 0x74, 0x0f, 0x49, 0x89, 0x75, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_INSTANCE_VALUE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // f: 48 8b 04 01 movq (%rcx,%rax), %rax + // 13: 48 85 c0 testq %rax, %rax + // 16: 74 38 je 0x50 <_JIT_ENTRY+0x50> + // 18: 8b 10 movl (%rax), %edx + // 1a: 85 d2 testl %edx, %edx + // 1c: 78 04 js 0x22 <_JIT_ENTRY+0x22> + // 1e: ff c2 incl %edx + // 20: 89 10 movl %edx, (%rax) + // 22: 49 89 45 f8 movq %rax, -0x8(%r13) + // 26: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2b: 8b 01 movl (%rcx), %eax + // 2d: 85 c0 testl %eax, %eax + // 2f: 78 06 js 0x37 <_JIT_ENTRY+0x37> + // 31: ff c8 decl %eax + // 33: 89 01 movl %eax, (%rcx) + // 35: 74 24 je 0x5b <_JIT_ENTRY+0x5b> + // 37: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 45: 48 83 c4 28 addq $0x28, %rsp + // 49: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 50: 48 83 c4 28 addq $0x28, %rsp + // 54: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5b <_JIT_ENTRY+0x5b> + // 0000000000000057: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 5b: ff 15 00 00 00 00 callq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 61: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 66: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6f: 48 83 c4 28 addq $0x28, %rsp + // 73: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[115] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x04, 0x01, 0x48, 0x85, 0xc0, 0x74, 0x38, + 0x8b, 0x10, 0x85, 0xd2, 0x78, 0x04, 0xff, 0xc2, + 0x89, 0x10, 0x49, 0x89, 0x45, 0xf8, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x01, 0x74, 0x24, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x57, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_METHOD_LAZY_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_LAZY_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // b: 8b 11 movl (%rcx), %edx + // d: 85 d2 testl %edx, %edx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c2 incl %edx + // 13: 89 11 movl %edx, (%rcx) + // 15: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 19: 49 89 45 00 movq %rax, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4d, + 0xf8, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_NO_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // b: 8b 11 movl (%rcx), %edx + // d: 85 d2 testl %edx, %edx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c2 incl %edx + // 13: 89 11 movl %edx, (%rcx) + // 15: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 19: 49 89 45 00 movq %rax, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4d, + 0xf8, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_METHOD_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_METHOD_WITH_VALUES.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // b: 8b 11 movl (%rcx), %edx + // d: 85 d2 testl %edx, %edx + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c2 incl %edx + // 13: 89 11 movl %edx, (%rcx) + // 15: 49 89 4d f8 movq %rcx, -0x8(%r13) + // 19: 49 89 45 00 movq %rax, (%r13) + // 1d: 49 83 c5 08 addq $0x8, %r13 + // 21: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[33] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x04, 0xff, 0xc2, 0x89, 0x11, 0x49, 0x89, 0x4d, + 0xf8, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_ATTR_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 48 8b 48 10 movq 0x10(%rax), %rcx + // c: 48 8b 51 20 movq 0x20(%rcx), %rdx + // 10: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 14: be 01 00 00 00 movl $0x1, %esi + // 19: 48 d3 e6 shlq %cl, %rsi + // 1c: 48 01 d6 addq %rdx, %rsi + // 1f: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 26: c1 e1 04 shll $0x4, %ecx + // 29: 48 8b 74 31 28 movq 0x28(%rcx,%rsi), %rsi + // 2e: 48 85 f6 testq %rsi, %rsi + // 31: 74 25 je 0x58 <_JIT_ENTRY+0x58> + // 33: 8b 0e movl (%rsi), %ecx + // 35: 85 c9 testl %ecx, %ecx + // 37: 78 04 js 0x3d <_JIT_ENTRY+0x3d> + // 39: ff c1 incl %ecx + // 3b: 89 0e movl %ecx, (%rsi) + // 3d: 8b 08 movl (%rax), %ecx + // 3f: 85 c9 testl %ecx, %ecx + // 41: 78 06 js 0x49 <_JIT_ENTRY+0x49> + // 43: ff c9 decl %ecx + // 45: 89 08 movl %ecx, (%rax) + // 47: 74 1a je 0x63 <_JIT_ENTRY+0x63> + // 49: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 4d: 48 83 c4 28 addq $0x28, %rsp + // 51: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 58: 48 83 c4 28 addq $0x28, %rsp + // 5c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 63: 48 89 c1 movq %rax, %rcx + // 66: ff 15 00 00 00 00 callq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6c: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7b <_JIT_ENTRY+0x7b> + // 0000000000000077: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[116] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x48, 0x8b, 0x48, 0x10, 0x48, 0x8b, 0x51, 0x20, + 0x0f, 0xb6, 0x4a, 0x09, 0xbe, 0x01, 0x00, 0x00, + 0x00, 0x48, 0xd3, 0xe6, 0x48, 0x01, 0xd6, 0x0f, + 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe1, + 0x04, 0x48, 0x8b, 0x74, 0x31, 0x28, 0x48, 0x85, + 0xf6, 0x74, 0x25, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x04, 0xff, 0xc1, 0x89, 0x0e, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x08, 0x74, + 0x1a, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xc1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x75, 0xf8, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x22, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x54, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_MODULE_FROM_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 e8 movq %r13, %rax + // 7: 49 83 c5 f8 addq $-0x8, %r13 + // b: 48 8b 50 f8 movq -0x8(%rax), %rdx + // f: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 13: be 01 00 00 00 movl $0x1, %esi + // 18: 48 d3 e6 shlq %cl, %rsi + // 1b: 48 01 d6 addq %rdx, %rsi + // 1e: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 25: c1 e1 04 shll $0x4, %ecx + // 28: 48 8b 54 31 28 movq 0x28(%rcx,%rsi), %rdx + // 2d: 48 85 d2 testq %rdx, %rdx + // 30: 74 3c je 0x6e <_JIT_ENTRY+0x6e> + // 32: 48 8b 48 f0 movq -0x10(%rax), %rcx + // 36: 8b 32 movl (%rdx), %esi + // 38: 85 f6 testl %esi, %esi + // 3a: 78 04 js 0x40 <_JIT_ENTRY+0x40> + // 3c: ff c6 incl %esi + // 3e: 89 32 movl %esi, (%rdx) + // 40: 48 89 50 f0 movq %rdx, -0x10(%rax) + // 44: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 49: 8b 01 movl (%rcx), %eax + // 4b: 85 c0 testl %eax, %eax + // 4d: 78 06 js 0x55 <_JIT_ENTRY+0x55> + // 4f: ff c8 decl %eax + // 51: 89 01 movl %eax, (%rcx) + // 53: 74 24 je 0x79 <_JIT_ENTRY+0x79> + // 55: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 63: 48 83 c4 28 addq $0x28, %rsp + // 67: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 6e: 48 83 c4 28 addq $0x28, %rsp + // 72: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 79: ff 15 00 00 00 00 callq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 84: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8d: 48 83 c4 28 addq $0x28, %rsp + // 91: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x98 <_JIT_ENTRY+0x98> + // 0000000000000094: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[145] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xe8, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x8b, 0x50, 0xf8, 0x0f, + 0xb6, 0x4a, 0x09, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0x48, 0xd3, 0xe6, 0x48, 0x01, 0xd6, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xe1, 0x04, + 0x48, 0x8b, 0x54, 0x31, 0x28, 0x48, 0x85, 0xd2, + 0x74, 0x3c, 0x48, 0x8b, 0x48, 0xf0, 0x8b, 0x32, + 0x85, 0xf6, 0x78, 0x04, 0xff, 0xc6, 0x89, 0x32, + 0x48, 0x89, 0x50, 0xf0, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, + 0xc8, 0x89, 0x01, 0x74, 0x24, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x28, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_NO_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 8b 01 movl (%rcx), %eax + // a: 85 c0 testl %eax, %eax + // c: 78 0c js 0x1a <_JIT_ENTRY+0x1a> + // e: ff c8 decl %eax + // 10: 89 01 movl %eax, (%rcx) + // 12: 75 06 jne 0x1a <_JIT_ENTRY+0x1a> + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 1a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 21: 8b 08 movl (%rax), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 04 js 0x2b <_JIT_ENTRY+0x2b> + // 27: ff c1 incl %ecx + // 29: 89 08 movl %ecx, (%rax) + // 2b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 2f: 48 83 c4 28 addq $0x28, %rsp + // 33: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[51] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0xf8, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); +} + +void +emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 8b 01 movl (%rcx), %eax + // a: 85 c0 testl %eax, %eax + // c: 78 0c js 0x1a <_JIT_ENTRY+0x1a> + // e: ff c8 decl %eax + // 10: 89 01 movl %eax, (%rcx) + // 12: 75 06 jne 0x1a <_JIT_ENTRY+0x1a> + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 1a: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 21: 8b 08 movl (%rax), %ecx + // 23: 85 c9 testl %ecx, %ecx + // 25: 78 04 js 0x2b <_JIT_ENTRY+0x2b> + // 27: ff c1 incl %ecx + // 29: 89 08 movl %ecx, (%rax) + // 2b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 2f: 48 83 c4 28 addq $0x28, %rsp + // 33: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[51] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0xf8, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + 0x4); +} + +void +emit__LOAD_ATTR_PROPERTY_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_PROPERTY_FRAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 7: 48 8b 42 30 movq 0x30(%rdx), %rax + // b: 8b 48 30 movl 0x30(%rax), %ecx + // e: 83 e1 0d andl $0xd, %ecx + // 11: 83 f9 01 cmpl $0x1, %ecx + // 14: 0f 85 e1 00 00 00 jne 0xfb <_JIT_ENTRY+0xfb> + // 1a: 83 78 3c 00 cmpl $0x0, 0x3c(%rax) + // 1e: 0f 85 d7 00 00 00 jne 0xfb <_JIT_ENTRY+0xfb> + // 24: 83 78 34 01 cmpl $0x1, 0x34(%rax) + // 28: 0f 85 cd 00 00 00 jne 0xfb <_JIT_ENTRY+0xfb> + // 2e: 49 8b 8e e8 00 00 00 movq 0xe8(%r14), %rcx + // 35: 48 85 c9 testq %rcx, %rcx + // 38: 0f 84 bd 00 00 00 je 0xfb <_JIT_ENTRY+0xfb> + // 3e: 48 63 78 4c movslq 0x4c(%rax), %rdi + // 42: 49 8b b6 f0 00 00 00 movq 0xf0(%r14), %rsi + // 49: 48 29 ce subq %rcx, %rsi + // 4c: 48 c1 fe 03 sarq $0x3, %rsi + // 50: 48 39 fe cmpq %rdi, %rsi + // 53: 0f 8e a2 00 00 00 jle 0xfb <_JIT_ENTRY+0xfb> + // 59: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 5d: 8b 1a movl (%rdx), %ebx + // 5f: 85 db testl %ebx, %ebx + // 61: 78 04 js 0x67 <_JIT_ENTRY+0x67> + // 63: ff c3 incl %ebx + // 65: 89 1a movl %ebx, (%rdx) + // 67: 48 8d 3c f9 leaq (%rcx,%rdi,8), %rdi + // 6b: 49 89 be e8 00 00 00 movq %rdi, 0xe8(%r14) + // 72: 4c 89 61 08 movq %r12, 0x8(%rcx) + // 76: 48 89 51 10 movq %rdx, 0x10(%rcx) + // 7a: 8b 38 movl (%rax), %edi + // 7c: 85 ff testl %edi, %edi + // 7e: 78 04 js 0x84 <_JIT_ENTRY+0x84> + // 80: ff c7 incl %edi + // 82: 89 38 movl %edi, (%rax) + // 84: 48 89 01 movq %rax, (%rcx) + // 87: 0f 10 42 10 movups 0x10(%rdx), %xmm0 + // 8b: 0f 11 41 18 movups %xmm0, 0x18(%rcx) + // 8f: 48 c7 41 28 00 00 00 00 movq $0x0, 0x28(%rcx) + // 97: 48 63 50 48 movslq 0x48(%rax), %rdx + // 9b: 48 8d 54 d1 50 leaq 0x50(%rcx,%rdx,8), %rdx + // a0: 48 89 51 40 movq %rdx, 0x40(%rcx) + // a4: 48 c7 41 30 00 00 00 00 movq $0x0, 0x30(%rcx) + // ac: 48 8d 90 d0 00 00 00 leaq 0xd0(%rax), %rdx + // b3: 48 89 51 38 movq %rdx, 0x38(%rcx) + // b7: c7 41 48 00 00 00 00 movl $0x0, 0x48(%rcx) + // be: 83 78 48 02 cmpl $0x2, 0x48(%rax) + // c2: 7c 28 jl 0xec <_JIT_ENTRY+0xec> + // c4: ba 0b 00 00 00 movl $0xb, %edx + // c9: 0f 1f 80 00 00 00 00 nopl (%rax) + // d0: 48 c7 04 d1 00 00 00 00 movq $0x0, (%rcx,%rdx,8) + // d8: 48 63 78 48 movslq 0x48(%rax), %rdi + // dc: 4c 8d 42 01 leaq 0x1(%rdx), %r8 + // e0: 48 83 c2 f7 addq $-0x9, %rdx + // e4: 48 39 fa cmpq %rdi, %rdx + // e7: 4c 89 c2 movq %r8, %rdx + // ea: 7c e4 jl 0xd0 <_JIT_ENTRY+0xd0> + // ec: 48 89 71 50 movq %rsi, 0x50(%rcx) + // f0: 49 89 4d f8 movq %rcx, -0x8(%r13) + // f4: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xfb <_JIT_ENTRY+0xfb> + // 00000000000000f7: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // fb: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x102 <_JIT_ENTRY+0x102> + // 00000000000000fe: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[258] = { + 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x42, 0x30, 0x8b, 0x48, 0x30, 0x83, 0xe1, + 0x0d, 0x83, 0xf9, 0x01, 0x0f, 0x85, 0xe1, 0x00, + 0x00, 0x00, 0x83, 0x78, 0x3c, 0x00, 0x0f, 0x85, + 0xd7, 0x00, 0x00, 0x00, 0x83, 0x78, 0x34, 0x01, + 0x0f, 0x85, 0xcd, 0x00, 0x00, 0x00, 0x49, 0x8b, + 0x8e, 0xe8, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc9, + 0x0f, 0x84, 0xbd, 0x00, 0x00, 0x00, 0x48, 0x63, + 0x78, 0x4c, 0x49, 0x8b, 0xb6, 0xf0, 0x00, 0x00, + 0x00, 0x48, 0x29, 0xce, 0x48, 0xc1, 0xfe, 0x03, + 0x48, 0x39, 0xfe, 0x0f, 0x8e, 0xa2, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf8, 0x8b, 0x1a, 0x85, + 0xdb, 0x78, 0x04, 0xff, 0xc3, 0x89, 0x1a, 0x48, + 0x8d, 0x3c, 0xf9, 0x49, 0x89, 0xbe, 0xe8, 0x00, + 0x00, 0x00, 0x4c, 0x89, 0x61, 0x08, 0x48, 0x89, + 0x51, 0x10, 0x8b, 0x38, 0x85, 0xff, 0x78, 0x04, + 0xff, 0xc7, 0x89, 0x38, 0x48, 0x89, 0x01, 0x0f, + 0x10, 0x42, 0x10, 0x0f, 0x11, 0x41, 0x18, 0x48, + 0xc7, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x63, 0x50, 0x48, 0x48, 0x8d, 0x54, 0xd1, 0x50, + 0x48, 0x89, 0x51, 0x40, 0x48, 0xc7, 0x41, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x90, 0xd0, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x51, 0x38, 0xc7, + 0x41, 0x48, 0x00, 0x00, 0x00, 0x00, 0x83, 0x78, + 0x48, 0x02, 0x7c, 0x28, 0xba, 0x0b, 0x00, 0x00, + 0x00, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xc7, 0x04, 0xd1, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x63, 0x78, 0x48, 0x4c, 0x8d, 0x42, 0x01, + 0x48, 0x83, 0xc2, 0xf7, 0x48, 0x39, 0xfa, 0x4c, + 0x89, 0xc2, 0x7c, 0xe4, 0x48, 0x89, 0x71, 0x50, + 0x49, 0x89, 0x4d, 0xf8, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf7, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xfe, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_SLOT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // f: 48 8b 34 01 movq (%rcx,%rax), %rsi + // 13: 48 85 f6 testq %rsi, %rsi + // 16: 74 25 je 0x3d <_JIT_ENTRY+0x3d> + // 18: 8b 06 movl (%rsi), %eax + // 1a: 85 c0 testl %eax, %eax + // 1c: 78 04 js 0x22 <_JIT_ENTRY+0x22> + // 1e: ff c0 incl %eax + // 20: 89 06 movl %eax, (%rsi) + // 22: 8b 01 movl (%rcx), %eax + // 24: 85 c0 testl %eax, %eax + // 26: 78 06 js 0x2e <_JIT_ENTRY+0x2e> + // 28: ff c8 decl %eax + // 2a: 89 01 movl %eax, (%rcx) + // 2c: 74 1a je 0x48 <_JIT_ENTRY+0x48> + // 2e: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 32: 48 83 c4 28 addq $0x28, %rsp + // 36: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 3d: 48 83 c4 28 addq $0x28, %rsp + // 41: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x48 <_JIT_ENTRY+0x48> + // 0000000000000044: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 48: ff 15 00 00 00 00 callq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4e: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 52: 48 83 c4 28 addq $0x28, %rsp + // 56: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[86] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x34, 0x01, 0x48, 0x85, 0xf6, 0x74, 0x25, + 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, + 0x89, 0x06, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, + 0xff, 0xc8, 0x89, 0x01, 0x74, 0x1a, 0x49, 0x89, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x44, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_ATTR_WITH_HINT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 ee movq %r13, %rsi + // 7: 49 83 c5 f8 addq $-0x8, %r13 + // b: 48 8b 4e f8 movq -0x8(%rsi), %rcx + // f: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 16: 48 8b 51 20 movq 0x20(%rcx), %rdx + // 1a: 48 39 42 18 cmpq %rax, 0x18(%rdx) + // 1e: 76 38 jbe 0x58 <_JIT_ENTRY+0x58> + // 20: 80 7a 0a 01 cmpb $0x1, 0xa(%rdx) + // 24: 75 32 jne 0x58 <_JIT_ENTRY+0x58> + // 26: 49 8b 0c 24 movq (%r12), %rcx + // 2a: 4c 8b 41 20 movq 0x20(%rcx), %r8 + // 2e: 44 0f b7 0d 00 00 00 00 movzwl (%rip), %r9d # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 36: 41 83 e1 fe andl $-0x2, %r9d + // 3a: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 3e: bf 01 00 00 00 movl $0x1, %edi + // 43: 48 d3 e7 shlq %cl, %rdi + // 46: 48 01 d7 addq %rdx, %rdi + // 49: c1 e0 04 shll $0x4, %eax + // 4c: 48 8b 4c 38 20 movq 0x20(%rax,%rdi), %rcx + // 51: 4b 3b 4c 88 18 cmpq 0x18(%r8,%r9,4), %rcx + // 56: 74 0b je 0x63 <_JIT_ENTRY+0x63> + // 58: 48 83 c4 28 addq $0x28, %rsp + // 5c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 63: 48 01 f8 addq %rdi, %rax + // 66: 48 83 c0 20 addq $0x20, %rax + // 6a: 48 8b 78 08 movq 0x8(%rax), %rdi + // 6e: 48 85 ff testq %rdi, %rdi + // 71: 74 e5 je 0x58 <_JIT_ENTRY+0x58> + // 73: 48 8b 4e f0 movq -0x10(%rsi), %rcx + // 77: 8b 07 movl (%rdi), %eax + // 79: 85 c0 testl %eax, %eax + // 7b: 78 04 js 0x81 <_JIT_ENTRY+0x81> + // 7d: ff c0 incl %eax + // 7f: 89 07 movl %eax, (%rdi) + // 81: 8b 01 movl (%rcx), %eax + // 83: 85 c0 testl %eax, %eax + // 85: 78 0c js 0x93 <_JIT_ENTRY+0x93> + // 87: ff c8 decl %eax + // 89: 89 01 movl %eax, (%rcx) + // 8b: 75 06 jne 0x93 <_JIT_ENTRY+0x93> + // 8d: ff 15 00 00 00 00 callq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 93: 48 89 7e f0 movq %rdi, -0x10(%rsi) + // 97: 48 83 c4 28 addq $0x28, %rsp + // 9b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa2 <_JIT_ENTRY+0xa2> + // 000000000000009e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[155] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xee, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x8b, 0x4e, 0xf8, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x51, 0x20, 0x48, 0x39, 0x42, 0x18, 0x76, 0x38, + 0x80, 0x7a, 0x0a, 0x01, 0x75, 0x32, 0x49, 0x8b, + 0x0c, 0x24, 0x4c, 0x8b, 0x41, 0x20, 0x44, 0x0f, + 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, + 0xe1, 0xfe, 0x0f, 0xb6, 0x4a, 0x09, 0xbf, 0x01, + 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe7, 0x48, 0x01, + 0xd7, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x4c, 0x38, + 0x20, 0x4b, 0x3b, 0x4c, 0x88, 0x18, 0x74, 0x0b, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x01, 0xf8, 0x48, 0x83, + 0xc0, 0x20, 0x48, 0x8b, 0x78, 0x08, 0x48, 0x85, + 0xff, 0x74, 0xe5, 0x48, 0x8b, 0x4e, 0xf0, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, + 0x07, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0x7e, 0xf0, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_BUILD_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_BUILD_CLASS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9: 49 8b 4c 24 20 movq 0x20(%r12), %rcx + // e: ba d8 8e 00 00 movl $0x8ed8, %edx # imm = 0x8ED8 + // 13: 48 03 15 00 00 00 00 addq (%rip), %rdx # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 1a: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // 1f: ff 15 00 00 00 00 callq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp_PyMapping_GetOptionalItem + // 25: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 33: 85 c0 testl %eax, %eax + // 35: 78 1d js 0x54 <_JIT_ENTRY+0x54> + // 37: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // 3c: 48 85 c0 testq %rax, %rax + // 3f: 74 1e je 0x5f <_JIT_ENTRY+0x5f> + // 41: 49 89 45 00 movq %rax, (%r13) + // 45: 49 83 c5 08 addq $0x8, %r13 + // 49: 48 83 c4 28 addq $0x28, %rsp + // 4d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x54 <_JIT_ENTRY+0x54> + // 0000000000000050: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 54: 48 83 c4 28 addq $0x28, %rsp + // 58: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5f <_JIT_ENTRY+0x5f> + // 000000000000005b: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 5f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 64: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: IMAGE_REL_AMD64_REL32 __imp_PyExc_NameError + // 6b: 48 8b 10 movq (%rax), %rdx + // 6e: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x75 <_JIT_ENTRY+0x75> + // 0000000000000071: IMAGE_REL_AMD64_REL32 ??_C@_0BK@IAGNFEAN@__build_class__?5not?5found?$AA@ + // 75: 4c 89 f1 movq %r14, %rcx + // 78: ff 15 00 00 00 00 callq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__PyErr_SetString + // 7e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 83: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8c: 48 83 c4 28 addq $0x28, %rsp + // 90: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x97 <_JIT_ENTRY+0x97> + // 0000000000000093: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[151] = { + 0x48, 0x83, 0xec, 0x28, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x49, 0x8b, 0x4c, 0x24, 0x20, 0xba, 0xd8, + 0x8e, 0x00, 0x00, 0x48, 0x03, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x8d, 0x44, 0x24, 0x20, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x85, 0xc0, 0x78, 0x1d, 0x48, + 0x8b, 0x44, 0x24, 0x20, 0x48, 0x85, 0xc0, 0x74, + 0x1e, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x8d, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: '__build_class__ not found\x00' + // 1a: 00 00 00 00 00 00 + // 20: &_PyRuntime+0x0 + // 28: &PyMapping_GetOptionalItem+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + // 40: &PyExc_NameError+0x0 + // 48: &_PyErr_SetString+0x0 + const unsigned char data_body[80] = { + 0x5f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x5f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, (uintptr_t)&_PyRuntime); + patch_64(data + 0x28, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x40, (uintptr_t)&PyExc_NameError); + patch_64(data + 0x48, (uintptr_t)&_PyErr_SetString); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x50, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x5b, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x71, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x93, (uintptr_t)data + 0x34); +} + +void +emit__LOAD_COMMON_CONSTANT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_COMMON_CONSTANT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 66 85 c0 testw %ax, %ax + // a: 75 19 jne 0x25 <_JIT_ENTRY+0x25> + // c: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyExc_AssertionError + // 13: 48 8b 00 movq (%rax), %rax + // 16: 49 89 45 00 movq %rax, (%r13) + // 1a: 49 83 c5 08 addq $0x8, %r13 + // 1e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 25: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp_PyExc_NotImplementedError + // 2c: 48 8b 00 movq (%rax), %rax + // 2f: 49 89 45 00 movq %rax, (%r13) + // 33: 49 83 c5 08 addq $0x8, %r13 + // 37: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[55] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x85, 0xc0, 0x75, 0x19, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x00, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + // 8: &PyExc_AssertionError+0x0 + // 10: CONTINUE + // 18: &PyExc_NotImplementedError+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyExc_AssertionError); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&PyExc_NotImplementedError); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x21, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_CONST_IMMORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_IMMORTAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 04 24 movq (%r12), %rax + // 4: 48 8b 40 18 movq 0x18(%rax), %rax + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 14: 49 89 45 00 movq %rax, (%r13) + // 18: 49 83 c5 08 addq $0x8, %r13 + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[28] = { + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x18, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0xc8, 0x18, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_INLINE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 7: 8b 08 movl (%rax), %ecx + // 9: 85 c9 testl %ecx, %ecx + // b: 78 04 js 0x11 <_JIT_ENTRY+0x11> + // d: ff c1 incl %ecx + // f: 89 08 movl %ecx, (%rax) + // 11: 49 89 45 00 movq %rax, (%r13) + // 15: 49 83 c5 08 addq $0x8, %r13 + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[25] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, + 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_INLINE_BORROW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 7: 49 89 45 00 movq %rax, (%r13) + // b: 49 83 c5 08 addq $0x8, %r13 + // f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[15] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_CONST_MORTAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_CONST_MORTAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 04 24 movq (%r12), %rax + // 4: 48 8b 40 18 movq 0x18(%rax), %rax + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f: 48 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %rax + // 14: 8b 08 movl (%rax), %ecx + // 16: 85 c9 testl %ecx, %ecx + // 18: 78 04 js 0x1e <_JIT_ENTRY+0x1e> + // 1a: ff c1 incl %ecx + // 1c: 89 08 movl %ecx, (%rax) + // 1e: 49 89 45 00 movq %rax, (%r13) + // 22: 49 83 c5 08 addq $0x8, %r13 + // 26: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[38] = { + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x18, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x44, 0xc8, 0x18, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_DEREF.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 10: 48 8b 40 10 movq 0x10(%rax), %rax + // 14: 48 85 c0 testq %rax, %rax + // 17: 74 1d je 0x36 <_JIT_ENTRY+0x36> + // 19: 8b 08 movl (%rax), %ecx + // 1b: 85 c9 testl %ecx, %ecx + // 1d: 78 04 js 0x23 <_JIT_ENTRY+0x23> + // 1f: ff c1 incl %ecx + // 21: 89 08 movl %ecx, (%rax) + // 23: 49 89 45 00 movq %rax, (%r13) + // 27: 49 83 c5 08 addq $0x8, %r13 + // 2b: 48 83 c4 28 addq $0x28, %rsp + // 2f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 36: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d # 0x3e <_JIT_ENTRY+0x3e> + // 000000000000003a: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 3e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 43: 49 8b 14 24 movq (%r12), %rdx + // 47: 4c 89 f1 movq %r14, %rcx + // 4a: ff 15 00 00 00 00 callq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcUnbound + // 50: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 55: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5e: 48 83 c4 28 addq $0x28, %rsp + // 62: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[105] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x44, 0xc4, 0x50, + 0x48, 0x8b, 0x40, 0x10, 0x48, 0x85, 0xc0, 0x74, + 0x1d, 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, + 0xc1, 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, + 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x44, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x14, 0x24, 0x4c, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_PyEval_FormatExcUnbound+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_PyEval_FormatExcUnbound); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3a, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // c: 8b 08 movl (%rax), %ecx + // e: 85 c9 testl %ecx, %ecx + // 10: 78 04 js 0x16 <_JIT_ENTRY+0x16> + // 12: ff c1 incl %ecx + // 14: 89 08 movl %ecx, (%rax) + // 16: 49 89 45 00 movq %rax, (%r13) + // 1a: 49 83 c5 08 addq $0x8, %r13 + // 1e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[30] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x44, 0xc4, 0x50, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_0.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 50 movq 0x50(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x50, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 58 movq 0x58(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x58, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_2.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 60 movq 0x60(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x60, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_3.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 68 movq 0x68(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x68, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_4.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 70 movq 0x70(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x70, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_5.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 78 movq 0x78(%r12), %rax + // 5: 8b 08 movl (%rax), %ecx + // 7: 85 c9 testl %ecx, %ecx + // 9: 78 04 js 0xf <_JIT_ENTRY+0xf> + // b: ff c1 incl %ecx + // d: 89 08 movl %ecx, (%rax) + // f: 49 89 45 00 movq %rax, (%r13) + // 13: 49 83 c5 08 addq $0x8, %r13 + // 17: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e <_JIT_ENTRY+0x1e> + // 000000000000001a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[23] = { + 0x49, 0x8b, 0x44, 0x24, 0x78, 0x8b, 0x08, 0x85, + 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_6.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 84 24 80 00 00 00 movq 0x80(%r12), %rax + // 8: 8b 08 movl (%rax), %ecx + // a: 85 c9 testl %ecx, %ecx + // c: 78 04 js 0x12 <_JIT_ENTRY+0x12> + // e: ff c1 incl %ecx + // 10: 89 08 movl %ecx, (%rax) + // 12: 49 89 45 00 movq %rax, (%r13) + // 16: 49 83 c5 08 addq $0x8, %r13 + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[26] = { + 0x49, 0x8b, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_7.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 84 24 88 00 00 00 movq 0x88(%r12), %rax + // 8: 8b 08 movl (%rax), %ecx + // a: 85 c9 testl %ecx, %ecx + // c: 78 04 js 0x12 <_JIT_ENTRY+0x12> + // e: ff c1 incl %ecx + // 10: 89 08 movl %ecx, (%rax) + // 12: 49 89 45 00 movq %rax, (%r13) + // 16: 49 83 c5 08 addq $0x8, %r13 + // 1a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[26] = { + 0x49, 0x8b, 0x84, 0x24, 0x88, 0x00, 0x00, 0x00, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__LOAD_FAST_AND_CLEAR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_AND_CLEAR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 49 8b 4c c4 50 movq 0x50(%r12,%rax,8), %rcx + // c: 49 c7 44 c4 50 00 00 00 00 movq $0x0, 0x50(%r12,%rax,8) + // 15: 49 89 4d 00 movq %rcx, (%r13) + // 19: 49 83 c5 08 addq $0x8, %r13 + // 1d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[29] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x4c, 0xc4, 0x50, 0x49, 0xc7, 0x44, 0xc4, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, + 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_FAST_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FAST_CHECK.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 0f b7 c1 movzwl %cx, %eax + // e: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 13: 48 85 c0 testq %rax, %rax + // 16: 74 1d je 0x35 <_JIT_ENTRY+0x35> + // 18: 8b 08 movl (%rax), %ecx + // 1a: 85 c9 testl %ecx, %ecx + // 1c: 78 04 js 0x22 <_JIT_ENTRY+0x22> + // 1e: ff c1 incl %ecx + // 20: 89 08 movl %ecx, (%rax) + // 22: 49 89 45 00 movq %rax, (%r13) + // 26: 49 83 c5 08 addq $0x8, %r13 + // 2a: 48 83 c4 28 addq $0x28, %rsp + // 2e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x35 <_JIT_ENTRY+0x35> + // 0000000000000031: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 35: 0f b7 d1 movzwl %cx, %edx + // 38: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 3d: 49 8b 04 24 movq (%r12), %rax + // 41: 48 8b 48 60 movq 0x60(%rax), %rcx + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp_PyTuple_GetItem + // 4b: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp_PyExc_UnboundLocalError + // 52: 48 8b 11 movq (%rcx), %rdx + // 55: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: IMAGE_REL_AMD64_REL32 ??_C@_0EK@CHGBBAMA@cannot?5access?5local?5variable?5?8?$CFs@ + // 5c: 4c 89 f1 movq %r14, %rcx + // 5f: 49 89 c1 movq %rax, %r9 + // 62: ff 15 00 00 00 00 callq *(%rip) # 0x68 <_JIT_ENTRY+0x68> + // 0000000000000064: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcCheckArg + // 68: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 76: 48 83 c4 28 addq $0x28, %rsp + // 7a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x81 <_JIT_ENTRY+0x81> + // 000000000000007d: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[129] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc1, 0x49, 0x8b, + 0x44, 0xc4, 0x50, 0x48, 0x85, 0xc0, 0x74, 0x1d, + 0x8b, 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, + 0x89, 0x08, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xd1, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x04, + 0x24, 0x48, 0x8b, 0x48, 0x60, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x11, 0x4c, 0x8d, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, 0x49, + 0x89, 0xc1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: "cannot access local variable '%s' where it is not associated with a value\x00" + // 4a: 00 00 00 00 00 00 + // 50: OPARG + // 58: CONTINUE + // 60: &PyTuple_GetItem+0x0 + // 68: &PyExc_UnboundLocalError+0x0 + // 70: &_PyEval_FormatExcCheckArg+0x0 + // 78: ERROR_TARGET + const unsigned char data_body[128] = { + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x27, 0x25, 0x73, + 0x27, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x50, instruction->oparg); + patch_64(data + 0x58, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x60, (uintptr_t)&PyTuple_GetItem); + patch_64(data + 0x68, (uintptr_t)&PyExc_UnboundLocalError); + patch_64(data + 0x70, (uintptr_t)&_PyEval_FormatExcCheckArg); + patch_64(data + 0x78, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x31, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x64, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0x7d, (uintptr_t)data + 0x74); +} + +void +emit__LOAD_FROM_DICT_OR_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_FROM_DICT_OR_DEREF.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 48 8b 40 60 movq 0x60(%rax), %rax + // 10: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 17: 0f b7 cf movzwl %di, %ecx + // 1a: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 1f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 24: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // 29: 48 89 f1 movq %rsi, %rcx + // 2c: ff 15 00 00 00 00 callq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: IMAGE_REL_AMD64_REL32 __imp_PyMapping_GetOptionalItem + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 85 c0 testl %eax, %eax + // 42: 78 6e js 0xb2 <_JIT_ENTRY+0xb2> + // 44: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // 49: 48 85 c0 testq %rax, %rax + // 4c: 75 20 jne 0x6e <_JIT_ENTRY+0x6e> + // 4e: 0f b7 c7 movzwl %di, %eax + // 51: 49 8b 44 c4 50 movq 0x50(%r12,%rax,8), %rax + // 56: 48 8b 40 10 movq 0x10(%rax), %rax + // 5a: 48 85 c0 testq %rax, %rax + // 5d: 74 5e je 0xbd <_JIT_ENTRY+0xbd> + // 5f: 8b 08 movl (%rax), %ecx + // 61: 85 c9 testl %ecx, %ecx + // 63: 78 04 js 0x69 <_JIT_ENTRY+0x69> + // 65: ff c1 incl %ecx + // 67: 89 08 movl %ecx, (%rax) + // 69: 48 89 44 24 20 movq %rax, 0x20(%rsp) + // 6e: 49 83 c5 f8 addq $-0x8, %r13 + // 72: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 77: 8b 0e movl (%rsi), %ecx + // 79: 85 c9 testl %ecx, %ecx + // 7b: 78 14 js 0x91 <_JIT_ENTRY+0x91> + // 7d: ff c9 decl %ecx + // 7f: 89 0e movl %ecx, (%rsi) + // 81: 75 0e jne 0x91 <_JIT_ENTRY+0x91> + // 83: 48 89 f1 movq %rsi, %rcx + // 86: ff 15 00 00 00 00 callq *(%rip) # 0x8c <_JIT_ENTRY+0x8c> + // 0000000000000088: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 8c: 48 8b 44 24 20 movq 0x20(%rsp), %rax + // 91: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 96: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9f: 49 89 45 00 movq %rax, (%r13) + // a3: 49 83 c5 08 addq $0x8, %r13 + // a7: 48 83 c4 28 addq $0x28, %rsp + // ab: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // b2: 48 83 c4 28 addq $0x28, %rsp + // b6: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbd <_JIT_ENTRY+0xbd> + // 00000000000000b9: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // bd: 48 c7 44 24 20 00 00 00 00 movq $0x0, 0x20(%rsp) + // c6: 44 0f b7 05 00 00 00 00 movzwl (%rip), %r8d # 0xce <_JIT_ENTRY+0xce> + // 00000000000000ca: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // ce: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d3: 49 8b 14 24 movq (%r12), %rdx + // d7: 4c 89 f1 movq %r14, %rcx + // da: ff 15 00 00 00 00 callq *(%rip) # 0xe0 <_JIT_ENTRY+0xe0> + // 00000000000000dc: IMAGE_REL_AMD64_REL32 __imp__PyEval_FormatExcUnbound + // e0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // e5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ee: 48 83 c4 28 addq $0x28, %rsp + // f2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf9 <_JIT_ENTRY+0xf9> + // 00000000000000f5: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[249] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, 0x60, + 0x48, 0x8b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xb7, 0xcf, 0x48, 0x8b, 0x54, 0xc8, 0x18, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x8d, 0x44, 0x24, + 0x20, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x6e, 0x48, 0x8b, 0x44, 0x24, + 0x20, 0x48, 0x85, 0xc0, 0x75, 0x20, 0x0f, 0xb7, + 0xc7, 0x49, 0x8b, 0x44, 0xc4, 0x50, 0x48, 0x8b, + 0x40, 0x10, 0x48, 0x85, 0xc0, 0x74, 0x5e, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x48, 0x89, 0x44, 0x24, 0x20, 0x49, 0x83, + 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x0e, 0x85, 0xc9, 0x78, 0x14, 0xff, 0xc9, 0x89, + 0x0e, 0x75, 0x0e, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x44, 0x24, + 0x20, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x44, + 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x44, 0x0f, + 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x14, 0x24, 0x4c, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &PyMapping_GetOptionalItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + // 28: &_PyEval_FormatExcUnbound+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&_PyEval_FormatExcUnbound); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x88, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xae, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb9, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xca, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xdc, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xf5, (uintptr_t)data + 0x1c); +} + +void +emit__LOAD_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 ee movq %r13, %rsi + // 7: 49 8b 04 24 movq (%r12), %rax + // b: 49 8b 4c 24 18 movq 0x18(%r12), %rcx + // 10: 48 8b 40 20 movq 0x20(%rax), %rax + // 14: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1b: 83 e2 fe andl $-0x2, %edx + // 1e: 4c 8b 44 90 18 movq 0x18(%rax,%rdx,4), %r8 + // 23: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 28: 49 8b 54 24 20 movq 0x20(%r12), %rdx + // 2d: 4d 89 e9 movq %r13, %r9 + // 30: ff 15 00 00 00 00 callq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__PyEval_LoadGlobalStackRef + // 36: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 44: 48 83 3e 00 cmpq $0x0, (%rsi) + // 48: 74 0f je 0x59 <_JIT_ENTRY+0x59> + // 4a: 49 83 c5 08 addq $0x8, %r13 + // 4e: 48 83 c4 28 addq $0x28, %rsp + // 52: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[100] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xee, 0x49, + 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x4c, 0x24, 0x18, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x83, 0xe2, 0xfe, 0x4c, 0x8b, + 0x44, 0x90, 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x49, 0x8b, 0x54, 0x24, 0x20, 0x4d, 0x89, 0xe9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0x3e, 0x00, + 0x74, 0x0f, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_LoadGlobalStackRef+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_LoadGlobalStackRef); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_GLOBAL_BUILTINS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 20 movq 0x20(%r12), %rax + // 5: 48 8b 40 20 movq 0x20(%rax), %rax + // 9: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // d: ba 01 00 00 00 movl $0x1, %edx + // 12: 48 d3 e2 shlq %cl, %rdx + // 15: 48 01 c2 addq %rax, %rdx + // 18: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1f: c1 e0 04 shll $0x4, %eax + // 22: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 27: 48 85 c0 testq %rax, %rax + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 8b 08 movl (%rax), %ecx + // 2e: 85 c9 testl %ecx, %ecx + // 30: 78 04 js 0x36 <_JIT_ENTRY+0x36> + // 32: ff c1 incl %ecx + // 34: 89 08 movl %ecx, (%rax) + // 36: 49 89 45 00 movq %rax, (%r13) + // 3a: 49 83 c5 08 addq $0x8, %r13 + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[76] = { + 0x49, 0x8b, 0x44, 0x24, 0x20, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb6, 0x48, 0x09, 0xba, 0x01, 0x00, + 0x00, 0x00, 0x48, 0xd3, 0xe2, 0x48, 0x01, 0xc2, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x04, 0x48, 0x8b, 0x44, 0x10, 0x28, 0x48, + 0x85, 0xc0, 0x74, 0x19, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_BUILTINS_FROM_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 8: ba 01 00 00 00 movl $0x1, %edx + // d: 48 d3 e2 shlq %cl, %rdx + // 10: 48 01 c2 addq %rax, %rdx + // 13: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1a: c1 e0 04 shll $0x4, %eax + // 1d: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 15 je 0x3c <_JIT_ENTRY+0x3c> + // 27: 8b 08 movl (%rax), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 04 js 0x31 <_JIT_ENTRY+0x31> + // 2d: ff c1 incl %ecx + // 2f: 89 08 movl %ecx, (%rax) + // 31: 49 89 45 f8 movq %rax, -0x8(%r13) + // 35: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3c <_JIT_ENTRY+0x3c> + // 0000000000000038: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 3c: 49 83 c5 f8 addq $-0x8, %r13 + // 40: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[71] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb6, 0x48, 0x09, + 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe2, + 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x44, + 0x10, 0x28, 0x48, 0x85, 0xc0, 0x74, 0x15, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0xf8, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_GLOBAL_MODULE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 44 24 18 movq 0x18(%r12), %rax + // 5: 48 8b 40 20 movq 0x20(%rax), %rax + // 9: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // d: ba 01 00 00 00 movl $0x1, %edx + // 12: 48 d3 e2 shlq %cl, %rdx + // 15: 48 01 c2 addq %rax, %rdx + // 18: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1f: c1 e0 04 shll $0x4, %eax + // 22: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 27: 48 85 c0 testq %rax, %rax + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 8b 08 movl (%rax), %ecx + // 2e: 85 c9 testl %ecx, %ecx + // 30: 78 04 js 0x36 <_JIT_ENTRY+0x36> + // 32: ff c1 incl %ecx + // 34: 89 08 movl %ecx, (%rax) + // 36: 49 89 45 00 movq %rax, (%r13) + // 3a: 49 83 c5 08 addq $0x8, %r13 + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[76] = { + 0x49, 0x8b, 0x44, 0x24, 0x18, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb6, 0x48, 0x09, 0xba, 0x01, 0x00, + 0x00, 0x00, 0x48, 0xd3, 0xe2, 0x48, 0x01, 0xc2, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x04, 0x48, 0x8b, 0x44, 0x10, 0x28, 0x48, + 0x85, 0xc0, 0x74, 0x19, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_GLOBAL_MODULE_FROM_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_GLOBAL_MODULE_FROM_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 0f b6 48 09 movzbl 0x9(%rax), %ecx + // 8: ba 01 00 00 00 movl $0x1, %edx + // d: 48 d3 e2 shlq %cl, %rdx + // 10: 48 01 c2 addq %rax, %rdx + // 13: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 1a: c1 e0 04 shll $0x4, %eax + // 1d: 48 8b 44 10 28 movq 0x28(%rax,%rdx), %rax + // 22: 48 85 c0 testq %rax, %rax + // 25: 74 15 je 0x3c <_JIT_ENTRY+0x3c> + // 27: 8b 08 movl (%rax), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 04 js 0x31 <_JIT_ENTRY+0x31> + // 2d: ff c1 incl %ecx + // 2f: 89 08 movl %ecx, (%rax) + // 31: 49 89 45 f8 movq %rax, -0x8(%r13) + // 35: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3c <_JIT_ENTRY+0x3c> + // 0000000000000038: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 3c: 49 83 c5 f8 addq $-0x8, %r13 + // 40: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x47 <_JIT_ENTRY+0x47> + // 0000000000000043: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[71] = { + 0x49, 0x8b, 0x45, 0xf8, 0x0f, 0xb6, 0x48, 0x09, + 0xba, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe2, + 0x48, 0x01, 0xc2, 0x0f, 0xb7, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0xe0, 0x04, 0x48, 0x8b, 0x44, + 0x10, 0x28, 0x48, 0x85, 0xc0, 0x74, 0x15, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, + 0x08, 0x49, 0x89, 0x45, 0xf8, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPERAND0 + // 8: CONTINUE + // 10: JUMP_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x43, (uintptr_t)data + 0xc); +} + +void +emit__LOAD_LOCALS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_LOCALS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 44 24 28 movq 0x28(%r12), %rax + // 9: 48 85 c0 testq %rax, %rax + // c: 74 1d je 0x2b <_JIT_ENTRY+0x2b> + // e: 8b 08 movl (%rax), %ecx + // 10: 85 c9 testl %ecx, %ecx + // 12: 78 04 js 0x18 <_JIT_ENTRY+0x18> + // 14: ff c1 incl %ecx + // 16: 89 08 movl %ecx, (%rax) + // 18: 49 89 45 00 movq %rax, (%r13) + // 1c: 49 83 c5 08 addq $0x8, %r13 + // 20: 48 83 c4 28 addq $0x28, %rsp + // 24: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 2b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 30: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp_PyExc_SystemError + // 37: 48 8b 10 movq (%rax), %rdx + // 3a: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: IMAGE_REL_AMD64_REL32 ??_C@_0BA@GFAKPHCI@no?5locals?5found?$AA@ + // 41: 4c 89 f1 movq %r14, %rcx + // 44: ff 15 00 00 00 00 callq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: IMAGE_REL_AMD64_REL32 __imp__PyErr_SetString + // 4a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 58: 48 83 c4 28 addq $0x28, %rsp + // 5c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[99] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x44, 0x24, + 0x28, 0x48, 0x85, 0xc0, 0x74, 0x1d, 0x8b, 0x08, + 0x85, 0xc9, 0x78, 0x04, 0xff, 0xc1, 0x89, 0x08, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x10, 0x4c, 0x8d, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: 'no locals found\x00' + // 10: CONTINUE + // 18: &PyExc_SystemError+0x0 + // 20: &_PyErr_SetString+0x0 + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x20, (uintptr_t)&_PyErr_SetString); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x27, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0x24); +} + +void +emit__LOAD_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_NAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 04 24 movq (%r12), %rax + // 8: 48 8b 40 20 movq 0x20(%rax), %rax + // c: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 13: 4c 8b 44 c8 18 movq 0x18(%rax,%rcx,8), %r8 + // 18: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1d: 4c 89 f1 movq %r14, %rcx + // 20: 4c 89 e2 movq %r12, %rdx + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__PyEval_LoadName + // 29: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 37: 48 85 c0 testq %rax, %rax + // 3a: 74 13 je 0x4f <_JIT_ENTRY+0x4f> + // 3c: 49 89 45 00 movq %rax, (%r13) + // 40: 49 83 c5 08 addq $0x8, %r13 + // 44: 48 83 c4 28 addq $0x28, %rsp + // 48: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4f: 48 83 c4 28 addq $0x28, %rsp + // 53: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[90] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x44, 0xc8, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, 0xf1, + 0x4c, 0x89, 0xe2, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_LoadName+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_LoadName); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x14); +} + +void +emit__LOAD_SMALL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: c1 e0 05 shll $0x5, %eax + // a: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x11 <_JIT_ENTRY+0x11> + // 000000000000000d: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 11: 48 01 c8 addq %rcx, %rax + // 14: 48 05 d0 33 00 00 addq $0x33d0, %rax # imm = 0x33D0 + // 1a: 49 89 45 00 movq %rax, (%r13) + // 1e: 49 83 c5 08 addq $0x8, %r13 + // 22: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[34] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x05, 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x01, 0xc8, 0x48, 0x05, 0xd0, 0x33, + 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, + 0xc5, 0x08, + }; + // 0: OPARG + // 8: &_PyRuntime+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xd, (uintptr_t)data + 0x4); +} + +void +emit__LOAD_SMALL_INT_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_0.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 d0 33 00 00 movl $0x33d0, %eax # imm = 0x33D0 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[20] = { + 0xb8, 0xd0, 0x33, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 f0 33 00 00 movl $0x33f0, %eax # imm = 0x33F0 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[20] = { + 0xb8, 0xf0, 0x33, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_2.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 10 34 00 00 movl $0x3410, %eax # imm = 0x3410 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[20] = { + 0xb8, 0x10, 0x34, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SMALL_INT_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SMALL_INT_3.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: b8 30 34 00 00 movl $0x3430, %eax # imm = 0x3430 + // 5: 48 03 05 00 00 00 00 addq (%rip), %rax # 0xc <_JIT_ENTRY+0xc> + // 0000000000000008: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // c: 49 89 45 00 movq %rax, (%r13) + // 10: 49 83 c5 08 addq $0x8, %r13 + // 14: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[20] = { + 0xb8, 0x30, 0x34, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_PyRuntime+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyRuntime); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x8, (uintptr_t)data + -0x4); +} + +void +emit__LOAD_SPECIAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SPECIAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 0f b7 1d 00 00 00 00 movzwl (%rip), %ebx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 13: c1 e3 04 shll $0x4, %ebx + // 16: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__Py_SpecialMethods + // 1d: 48 8b 14 1f movq (%rdi,%rbx), %rdx + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // 2b: 48 89 f1 movq %rsi, %rcx + // 2e: ff 15 00 00 00 00 callq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__PyObject_LookupSpecialMethod + // 34: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 39: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 42: 48 85 c0 testq %rax, %rax + // 45: 74 1c je 0x63 <_JIT_ENTRY+0x63> + // 47: 48 8b 4c 24 20 movq 0x20(%rsp), %rcx + // 4c: 49 89 45 00 movq %rax, (%r13) + // 50: 49 89 4d 08 movq %rcx, 0x8(%r13) + // 54: 49 83 c5 10 addq $0x10, %r13 + // 58: 48 83 c4 28 addq $0x28, %rsp + // 5c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x63 <_JIT_ENTRY+0x63> + // 000000000000005f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 63: 49 8b 46 70 movq 0x70(%r14), %rax + // 67: 48 85 c0 testq %rax, %rax + // 6a: 74 12 je 0x7e <_JIT_ENTRY+0x7e> + // 6c: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // 71: 74 0b je 0x7e <_JIT_ENTRY+0x7e> + // 73: 48 83 c4 28 addq $0x28, %rsp + // 77: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 7e: 48 01 df addq %rbx, %rdi + // 81: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 86: 48 8b 46 08 movq 0x8(%rsi), %rax + // 8a: 4c 8b 48 18 movq 0x18(%rax), %r9 + // 8e: 4c 8b 47 08 movq 0x8(%rdi), %r8 + // 92: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x99 <_JIT_ENTRY+0x99> + // 0000000000000095: IMAGE_REL_AMD64_REL32 __imp_PyExc_TypeError + // 99: 48 8b 10 movq (%rax), %rdx + // 9c: 4c 89 f1 movq %r14, %rcx + // 9f: ff 15 00 00 00 00 callq *(%rip) # 0xa5 <_JIT_ENTRY+0xa5> + // 00000000000000a1: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // a5: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // aa: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b3: 48 83 c4 28 addq $0x28, %rsp + // b7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbe <_JIT_ENTRY+0xbe> + // 00000000000000ba: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[190] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x0f, 0xb7, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xc1, 0xe3, 0x04, 0x48, 0x8b, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x14, + 0x1f, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x8d, + 0x44, 0x24, 0x20, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x1c, 0x48, + 0x8b, 0x4c, 0x24, 0x20, 0x49, 0x89, 0x45, 0x00, + 0x49, 0x89, 0x4d, 0x08, 0x49, 0x83, 0xc5, 0x10, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x46, 0x70, 0x48, + 0x85, 0xc0, 0x74, 0x12, 0x48, 0x83, 0x78, 0x08, + 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, + 0xdf, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, + 0x46, 0x08, 0x4c, 0x8b, 0x48, 0x18, 0x4c, 0x8b, + 0x47, 0x08, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_Py_SpecialMethods+0x0 + // 10: &_PyObject_LookupSpecialMethod+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + // 28: &PyExc_TypeError+0x0 + // 30: &_PyErr_Format+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_SpecialMethods); + patch_64(data + 0x10, (uintptr_t)&_PyObject_LookupSpecialMethod); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x28, (uintptr_t)&PyExc_TypeError); + patch_64(data + 0x30, (uintptr_t)&_PyErr_Format); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x30, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x95, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xa1, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xba, (uintptr_t)data + 0x1c); +} + +void +emit__LOAD_SUPER_ATTR_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_ATTR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 e8 movq -0x18(%r13), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PySuper_Type + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 15: 48 8b 43 08 movq 0x8(%rbx), %rax + // 19: 83 b8 a8 00 00 00 00 cmpl $0x0, 0xa8(%rax) + // 20: 78 0b js 0x2d <_JIT_ENTRY+0x2d> + // 22: 48 83 c4 28 addq $0x28, %rsp + // 26: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 2d: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 31: 49 8b 04 24 movq (%r12), %rax + // 35: 48 8b 40 20 movq 0x20(%rax), %rax + // 39: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 40: 83 e1 fc andl $-0x4, %ecx + // 43: 4c 8b 44 48 18 movq 0x18(%rax,%rcx,2), %r8 + // 48: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4d: 48 89 d9 movq %rbx, %rcx + // 50: 48 89 f2 movq %rsi, %rdx + // 53: 45 31 c9 xorl %r9d, %r9d + // 56: ff 15 00 00 00 00 callq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: IMAGE_REL_AMD64_REL32 __imp__PySuper_Lookup + // 5c: 48 89 c7 movq %rax, %rdi + // 5f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 64: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: IMAGE_REL_AMD64_REL32 __imp_PySuper_Type + // 74: 8b 08 movl (%rax), %ecx + // 76: 85 c9 testl %ecx, %ecx + // 78: 78 13 js 0x8d <_JIT_ENTRY+0x8d> + // 7a: ff c9 decl %ecx + // 7c: 89 08 movl %ecx, (%rax) + // 7e: 75 0d jne 0x8d <_JIT_ENTRY+0x8d> + // 80: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: IMAGE_REL_AMD64_REL32 __imp_PySuper_Type + // 87: ff 15 00 00 00 00 callq *(%rip) # 0x8d <_JIT_ENTRY+0x8d> + // 0000000000000089: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 8d: 8b 03 movl (%rbx), %eax + // 8f: 85 c0 testl %eax, %eax + // 91: 78 0f js 0xa2 <_JIT_ENTRY+0xa2> + // 93: ff c8 decl %eax + // 95: 89 03 movl %eax, (%rbx) + // 97: 75 09 jne 0xa2 <_JIT_ENTRY+0xa2> + // 99: 48 89 d9 movq %rbx, %rcx + // 9c: ff 15 00 00 00 00 callq *(%rip) # 0xa2 <_JIT_ENTRY+0xa2> + // 000000000000009e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // a2: 8b 06 movl (%rsi), %eax + // a4: 85 c0 testl %eax, %eax + // a6: 78 0f js 0xb7 <_JIT_ENTRY+0xb7> + // a8: ff c8 decl %eax + // aa: 89 06 movl %eax, (%rsi) + // ac: 75 09 jne 0xb7 <_JIT_ENTRY+0xb7> + // ae: 48 89 f1 movq %rsi, %rcx + // b1: ff 15 00 00 00 00 callq *(%rip) # 0xb7 <_JIT_ENTRY+0xb7> + // 00000000000000b3: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b7: 48 85 ff testq %rdi, %rdi + // ba: 74 13 je 0xcf <_JIT_ENTRY+0xcf> + // bc: 49 89 7d e8 movq %rdi, -0x18(%r13) + // c0: 49 83 c5 f0 addq $-0x10, %r13 + // c4: 48 83 c4 28 addq $0x28, %rsp + // c8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xcf <_JIT_ENTRY+0xcf> + // 00000000000000cb: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // cf: 49 83 c5 e8 addq $-0x18, %r13 + // d3: 48 83 c4 28 addq $0x28, %rsp + // d7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xde <_JIT_ENTRY+0xde> + // 00000000000000da: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[222] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xe8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x5d, 0xf0, 0x48, 0x8b, 0x43, + 0x08, 0x83, 0xb8, 0xa8, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x0b, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, + 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xe1, 0xfc, 0x4c, 0x8b, 0x44, 0x48, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xd9, + 0x48, 0x89, 0xf2, 0x45, 0x31, 0xc9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xc7, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x08, 0x85, 0xc9, + 0x78, 0x13, 0xff, 0xc9, 0x89, 0x08, 0x75, 0x0d, + 0x48, 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, + 0x09, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x06, 0x75, 0x09, 0x48, 0x89, + 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xff, 0x74, 0x13, 0x49, 0x89, 0x7d, 0xe8, + 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0xe8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: JUMP_TARGET + // 10: OPARG + // 18: &_PySuper_Lookup+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: ERROR_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x89, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x9e, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb3, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xda, (uintptr_t)data + 0x2c); +} + +void +emit__LOAD_SUPER_ATTR_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _LOAD_SUPER_ATTR_METHOD.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 e8 movq -0x18(%r13), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PySuper_Type + // f: 75 11 jne 0x22 <_JIT_ENTRY+0x22> + // 11: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 15: 48 8b 46 08 movq 0x8(%rsi), %rax + // 19: 83 b8 a8 00 00 00 00 cmpl $0x0, 0xa8(%rax) + // 20: 78 0b js 0x2d <_JIT_ENTRY+0x2d> + // 22: 48 83 c4 28 addq $0x28, %rsp + // 26: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 2d: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 31: 49 8b 04 24 movq (%r12), %rax + // 35: 48 8b 40 20 movq 0x20(%rax), %rax + // 39: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 40: 83 e1 fc andl $-0x4, %ecx + // 43: 4c 8b 44 48 18 movq 0x18(%rax,%rcx,2), %r8 + // 48: c7 44 24 24 00 00 00 00 movl $0x0, 0x24(%rsp) + // 50: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 55: 48 8b 47 08 movq 0x8(%rdi), %rax + // 59: 48 8b 80 90 00 00 00 movq 0x90(%rax), %rax + // 60: 31 c9 xorl %ecx, %ecx + // 62: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp_PyObject_GenericGetAttr + // 69: 4c 8d 4c 24 24 leaq 0x24(%rsp), %r9 + // 6e: 4c 0f 45 c9 cmovneq %rcx, %r9 + // 72: 48 89 f1 movq %rsi, %rcx + // 75: 48 89 fa movq %rdi, %rdx + // 78: ff 15 00 00 00 00 callq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__PySuper_Lookup + // 7e: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 83: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 8c: 48 85 c0 testq %rax, %rax + // 8f: 0f 84 97 00 00 00 je 0x12c <_JIT_ENTRY+0x12c> + // 95: 83 7c 24 24 00 cmpl $0x0, 0x24(%rsp) + // 9a: 75 38 jne 0xd4 <_JIT_ENTRY+0xd4> + // 9c: 49 83 c5 f8 addq $-0x8, %r13 + // a0: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a5: 8b 0f movl (%rdi), %ecx + // a7: 85 c9 testl %ecx, %ecx + // a9: 78 15 js 0xc0 <_JIT_ENTRY+0xc0> + // ab: ff c9 decl %ecx + // ad: 89 0f movl %ecx, (%rdi) + // af: 75 0f jne 0xc0 <_JIT_ENTRY+0xc0> + // b1: 48 89 f9 movq %rdi, %rcx + // b4: 48 89 c7 movq %rax, %rdi + // b7: ff 15 00 00 00 00 callq *(%rip) # 0xbd <_JIT_ENTRY+0xbd> + // 00000000000000b9: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // bd: 48 89 f8 movq %rdi, %rax + // c0: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // c5: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // ce: 49 83 c5 08 addq $0x8, %r13 + // d2: 31 ff xorl %edi, %edi + // d4: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xdb <_JIT_ENTRY+0xdb> + // 00000000000000d7: IMAGE_REL_AMD64_REL32 __imp_PySuper_Type + // db: 8b 11 movl (%rcx), %edx + // dd: 85 d2 testl %edx, %edx + // df: 78 19 js 0xfa <_JIT_ENTRY+0xfa> + // e1: ff ca decl %edx + // e3: 89 11 movl %edx, (%rcx) + // e5: 75 13 jne 0xfa <_JIT_ENTRY+0xfa> + // e7: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0xee <_JIT_ENTRY+0xee> + // 00000000000000ea: IMAGE_REL_AMD64_REL32 __imp_PySuper_Type + // ee: 48 89 c3 movq %rax, %rbx + // f1: ff 15 00 00 00 00 callq *(%rip) # 0xf7 <_JIT_ENTRY+0xf7> + // 00000000000000f3: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // f7: 48 89 d8 movq %rbx, %rax + // fa: 8b 0e movl (%rsi), %ecx + // fc: 85 c9 testl %ecx, %ecx + // fe: 78 15 js 0x115 <_JIT_ENTRY+0x115> + // 100: ff c9 decl %ecx + // 102: 89 0e movl %ecx, (%rsi) + // 104: 75 0f jne 0x115 <_JIT_ENTRY+0x115> + // 106: 48 89 f1 movq %rsi, %rcx + // 109: 48 89 c6 movq %rax, %rsi + // 10c: ff 15 00 00 00 00 callq *(%rip) # 0x112 <_JIT_ENTRY+0x112> + // 000000000000010e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 112: 48 89 f0 movq %rsi, %rax + // 115: 49 89 45 e8 movq %rax, -0x18(%r13) + // 119: 49 89 7d f0 movq %rdi, -0x10(%r13) + // 11d: 49 83 c5 f8 addq $-0x8, %r13 + // 121: 48 83 c4 28 addq $0x28, %rsp + // 125: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x12c <_JIT_ENTRY+0x12c> + // 0000000000000128: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 12c: 48 83 c4 28 addq $0x28, %rsp + // 130: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x137 <_JIT_ENTRY+0x137> + // 0000000000000133: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[311] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xe8, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x75, + 0x11, 0x49, 0x8b, 0x75, 0xf0, 0x48, 0x8b, 0x46, + 0x08, 0x83, 0xb8, 0xa8, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x0b, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x7d, + 0xf8, 0x49, 0x8b, 0x04, 0x24, 0x48, 0x8b, 0x40, + 0x20, 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xe1, 0xfc, 0x4c, 0x8b, 0x44, 0x48, 0x18, + 0xc7, 0x44, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x47, + 0x08, 0x48, 0x8b, 0x80, 0x90, 0x00, 0x00, 0x00, + 0x31, 0xc9, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8d, 0x4c, 0x24, 0x24, 0x4c, 0x0f, + 0x45, 0xc9, 0x48, 0x89, 0xf1, 0x48, 0x89, 0xfa, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x0f, + 0x84, 0x97, 0x00, 0x00, 0x00, 0x83, 0x7c, 0x24, + 0x24, 0x00, 0x75, 0x38, 0x49, 0x83, 0xc5, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x0f, 0x85, + 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0f, 0x75, + 0x0f, 0x48, 0x89, 0xf9, 0x48, 0x89, 0xc7, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf8, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0x08, 0x31, 0xff, 0x48, 0x8b, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x19, 0xff, 0xca, 0x89, 0x11, 0x75, 0x13, 0x48, + 0x8b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xc3, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xd8, 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x15, + 0xff, 0xc9, 0x89, 0x0e, 0x75, 0x0f, 0x48, 0x89, + 0xf1, 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xf0, 0x49, 0x89, 0x45, + 0xe8, 0x49, 0x89, 0x7d, 0xf0, 0x49, 0x83, 0xc5, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PySuper_Type+0x0 + // 8: JUMP_TARGET + // 10: OPARG + // 18: &PyObject_GenericGetAttr+0x0 + // 20: &_PySuper_Lookup+0x0 + // 28: &_Py_Dealloc+0x0 + // 30: CONTINUE + // 38: ERROR_TARGET + const unsigned char data_body[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PySuper_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, instruction->oparg); + patch_64(data + 0x18, (uintptr_t)&PyObject_GenericGetAttr); + patch_64(data + 0x20, (uintptr_t)&_PySuper_Lookup); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x30, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x38, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb9, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xd7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xea, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0xf3, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x10e, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x128, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x133, (uintptr_t)data + 0x34); +} + +void +emit__MAKE_CALLARGS_A_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CALLARGS_A_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 8: 49 8b 7d f8 movq -0x8(%r13), %rdi + // c: 48 8b 46 08 movq 0x8(%rsi), %rax + // 10: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: IMAGE_REL_AMD64_REL32 __imp_PyTuple_Type + // 17: 0f 84 81 00 00 00 je 0x9e <_JIT_ENTRY+0x9e> + // 1d: 49 8b 55 e0 movq -0x20(%r13), %rdx + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 4c 89 f1 movq %r14, %rcx + // 29: 49 89 f0 movq %rsi, %r8 + // 2c: ff 15 00 00 00 00 callq *(%rip) # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: IMAGE_REL_AMD64_REL32 __imp__Py_Check_ArgsIterable + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 85 c0 testl %eax, %eax + // 42: 78 6d js 0xb1 <_JIT_ENTRY+0xb1> + // 44: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 49: 48 89 f1 movq %rsi, %rcx + // 4c: ff 15 00 00 00 00 callq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp_PySequence_Tuple + // 52: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 57: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 60: 48 85 c0 testq %rax, %rax + // 63: 74 4c je 0xb1 <_JIT_ENTRY+0xb1> + // 65: 49 83 c5 f0 addq $-0x10, %r13 + // 69: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6e: 8b 0e movl (%rsi), %ecx + // 70: 85 c9 testl %ecx, %ecx + // 72: 78 15 js 0x89 <_JIT_ENTRY+0x89> + // 74: ff c9 decl %ecx + // 76: 89 0e movl %ecx, (%rsi) + // 78: 75 0f jne 0x89 <_JIT_ENTRY+0x89> + // 7a: 48 89 f1 movq %rsi, %rcx + // 7d: 48 89 c6 movq %rax, %rsi + // 80: ff 15 00 00 00 00 callq *(%rip) # 0x86 <_JIT_ENTRY+0x86> + // 0000000000000082: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 86: 48 89 f0 movq %rsi, %rax + // 89: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 8e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 97: 49 83 c5 10 addq $0x10, %r13 + // 9b: 48 89 c6 movq %rax, %rsi + // 9e: 49 89 75 f0 movq %rsi, -0x10(%r13) + // a2: 49 89 7d f8 movq %rdi, -0x8(%r13) + // a6: 48 83 c4 28 addq $0x28, %rsp + // aa: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb1 <_JIT_ENTRY+0xb1> + // 00000000000000ad: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // b1: 48 83 c4 28 addq $0x28, %rsp + // b5: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbc <_JIT_ENTRY+0xbc> + // 00000000000000b8: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[188] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf0, + 0x49, 0x8b, 0x7d, 0xf8, 0x48, 0x8b, 0x46, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x84, 0x81, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x55, + 0xe0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x89, + 0xf1, 0x49, 0x89, 0xf0, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x6d, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x4c, 0x49, 0x83, 0xc5, + 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x0e, + 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, 0x0e, + 0x75, 0x0f, 0x48, 0x89, 0xf1, 0x48, 0x89, 0xc6, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, + 0xf0, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x83, 0xc5, 0x10, 0x48, 0x89, 0xc6, 0x49, 0x89, + 0x75, 0xf0, 0x49, 0x89, 0x7d, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: &_Py_Check_ArgsIterable+0x0 + // 10: &PySequence_Tuple+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Check_ArgsIterable); + patch_64(data + 0x10, (uintptr_t)&PySequence_Tuple); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x82, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xad, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xb8, (uintptr_t)data + 0x24); +} + +void +emit__MAKE_CELL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_CELL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 0f b7 c6 movzwl %si, %eax + // e: 49 8b 4c c4 50 movq 0x50(%r12,%rax,8), %rcx + // 13: ff 15 00 00 00 00 callq *(%rip) # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: IMAGE_REL_AMD64_REL32 __imp_PyCell_New + // 19: 48 85 c0 testq %rax, %rax + // 1c: 74 3c je 0x5a <_JIT_ENTRY+0x5a> + // 1e: 0f b7 d6 movzwl %si, %edx + // 21: 49 8b 4c d4 50 movq 0x50(%r12,%rdx,8), %rcx + // 26: 49 89 44 d4 50 movq %rax, 0x50(%r12,%rdx,8) + // 2b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 30: 48 85 c9 testq %rcx, %rcx + // 33: 74 0c je 0x41 <_JIT_ENTRY+0x41> + // 35: 8b 01 movl (%rcx), %eax + // 37: 85 c0 testl %eax, %eax + // 39: 78 06 js 0x41 <_JIT_ENTRY+0x41> + // 3b: ff c8 decl %eax + // 3d: 89 01 movl %eax, (%rcx) + // 3f: 74 24 je 0x65 <_JIT_ENTRY+0x65> + // 41: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 46: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4f: 48 83 c4 28 addq $0x28, %rsp + // 53: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 5a: 48 83 c4 28 addq $0x28, %rsp + // 5e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 65: ff 15 00 00 00 00 callq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 70: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 79: 48 83 c4 28 addq $0x28, %rsp + // 7d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x84 <_JIT_ENTRY+0x84> + // 0000000000000080: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[125] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc6, 0x49, 0x8b, + 0x4c, 0xc4, 0x50, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x3c, 0x0f, 0xb7, + 0xd6, 0x49, 0x8b, 0x4c, 0xd4, 0x50, 0x49, 0x89, + 0x44, 0xd4, 0x50, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x85, 0xc9, 0x74, 0x0c, 0x8b, 0x01, 0x85, + 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, 0x74, + 0x24, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: &PyCell_New+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyCell_New); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + 0x1c); +} + +void +emit__MAKE_FUNCTION( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_FUNCTION.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 49 8b 54 24 18 movq 0x18(%r12), %rdx + // 12: 48 89 f1 movq %rsi, %rcx + // 15: ff 15 00 00 00 00 callq *(%rip) # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp_PyFunction_New + // 1b: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 21: 48 89 c7 movq %rax, %rdi + // 24: 8b 06 movl (%rsi), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c8 decl %eax + // 2c: 89 06 movl %eax, (%rsi) + // 2e: 74 32 je 0x62 <_JIT_ENTRY+0x62> + // 30: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 35: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3e: 48 85 ff testq %rdi, %rdi + // 41: 74 3b je 0x7e <_JIT_ENTRY+0x7e> + // 43: 8b 56 5c movl 0x5c(%rsi), %edx + // 46: 48 89 f9 movq %rdi, %rcx + // 49: ff 15 00 00 00 00 callq *(%rip) # 0x4f <_JIT_ENTRY+0x4f> + // 000000000000004b: IMAGE_REL_AMD64_REL32 __imp__PyFunction_SetVersion + // 4f: 49 89 7d 00 movq %rdi, (%r13) + // 53: 49 83 c5 08 addq $0x8, %r13 + // 57: 48 83 c4 28 addq $0x28, %rsp + // 5b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 62: 48 89 f1 movq %rsi, %rcx + // 65: ff 15 00 00 00 00 callq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 70: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 79: 48 85 ff testq %rdi, %rdi + // 7c: 75 c5 jne 0x43 <_JIT_ENTRY+0x43> + // 7e: 48 83 c4 28 addq $0x28, %rsp + // 82: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x89 <_JIT_ENTRY+0x89> + // 0000000000000085: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[137] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x54, + 0x24, 0x18, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, 0x24, 0x40, + 0xf8, 0x48, 0x89, 0xc7, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x32, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xff, 0x74, 0x3b, 0x8b, 0x56, 0x5c, 0x48, 0x89, + 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xff, 0x75, 0xc5, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &PyFunction_New+0x0 + // 8: &_PyFunction_SetVersion+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyFunction_New); + patch_64(data + 0x8, (uintptr_t)&_PyFunction_SetVersion); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x85, (uintptr_t)data + 0x1c); +} + +void +emit__MAKE_WARM( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAKE_WARM.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_EXECUTOR + // 7: c6 40 23 01 movb $0x1, 0x23(%rax) + // b: 49 8b 46 10 movq 0x10(%r14), %rax + // f: 48 ff 88 60 66 03 00 decq 0x36660(%rax) + // 16: 74 07 je 0x1f <_JIT_ENTRY+0x1f> + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1f: f0 lock + // 20: 49 81 4e 18 80 00 00 00 orq $0x80, 0x18(%r14) + // 28: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[40] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc6, + 0x40, 0x23, 0x01, 0x49, 0x8b, 0x46, 0x10, 0x48, + 0xff, 0x88, 0x60, 0x66, 0x03, 0x00, 0x74, 0x07, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x49, 0x81, 0x4e, 0x18, 0x80, 0x00, 0x00, 0x00, + }; + // 0: EXECUTOR + // 8: CONTINUE + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)executor); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); +} + +void +emit__MAP_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAP_ADD.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 49 8b 55 f0 movq -0x10(%r13), %rdx + // f: 4d 8b 45 f8 movq -0x8(%r13), %r8 + // 13: 48 c7 c1 fe ff ff ff movq $-0x2, %rcx + // 1a: 48 29 c1 subq %rax, %rcx + // 1d: 49 8b 4c cd 00 movq (%r13,%rcx,8), %rcx + // 22: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 27: ff 15 00 00 00 00 callq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__PyDict_SetItem_Take2 + // 2d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 32: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3b: 49 83 c5 f0 addq $-0x10, %r13 + // 3f: 48 83 c4 28 addq $0x28, %rsp + // 43: 85 c0 testl %eax, %eax + // 45: 74 07 je 0x4e <_JIT_ENTRY+0x4e> + // 47: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4e <_JIT_ENTRY+0x4e> + // 000000000000004a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 4e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[78] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x55, 0xf0, 0x4d, + 0x8b, 0x45, 0xf8, 0x48, 0xc7, 0xc1, 0xfe, 0xff, + 0xff, 0xff, 0x48, 0x29, 0xc1, 0x49, 0x8b, 0x4c, + 0xcd, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf0, 0x48, + 0x83, 0xc4, 0x28, 0x85, 0xc0, 0x74, 0x07, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyDict_SetItem_Take2+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4a, (uintptr_t)data + 0xc); +} + +void +emit__MATCH_CLASS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_CLASS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 4d 8b 7d e8 movq -0x18(%r13), %r15 + // c: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: 44 0f b7 0d 00 00 00 00 movzwl (%rip), %r9d # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1d: 48 89 7c 24 20 movq %rdi, 0x20(%rsp) + // 22: 4c 89 f1 movq %r14, %rcx + // 25: 4c 89 fa movq %r15, %rdx + // 28: 49 89 d8 movq %rbx, %r8 + // 2b: ff 15 00 00 00 00 callq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: IMAGE_REL_AMD64_REL32 __imp__PyEval_MatchClass + // 31: 48 89 c6 movq %rax, %rsi + // 34: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 39: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 42: 41 8b 07 movl (%r15), %eax + // 45: 85 c0 testl %eax, %eax + // 47: 78 10 js 0x59 <_JIT_ENTRY+0x59> + // 49: ff c8 decl %eax + // 4b: 41 89 07 movl %eax, (%r15) + // 4e: 75 09 jne 0x59 <_JIT_ENTRY+0x59> + // 50: 4c 89 f9 movq %r15, %rcx + // 53: ff 15 00 00 00 00 callq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 59: 8b 03 movl (%rbx), %eax + // 5b: 85 c0 testl %eax, %eax + // 5d: 78 0f js 0x6e <_JIT_ENTRY+0x6e> + // 5f: ff c8 decl %eax + // 61: 89 03 movl %eax, (%rbx) + // 63: 75 09 jne 0x6e <_JIT_ENTRY+0x6e> + // 65: 48 89 d9 movq %rbx, %rcx + // 68: ff 15 00 00 00 00 callq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6e: 8b 07 movl (%rdi), %eax + // 70: 85 c0 testl %eax, %eax + // 72: 78 06 js 0x7a <_JIT_ENTRY+0x7a> + // 74: ff c8 decl %eax + // 76: 89 07 movl %eax, (%rdi) + // 78: 74 18 je 0x92 <_JIT_ENTRY+0x92> + // 7a: 48 85 f6 testq %rsi, %rsi + // 7d: 74 21 je 0xa0 <_JIT_ENTRY+0xa0> + // 7f: 49 89 75 e8 movq %rsi, -0x18(%r13) + // 83: 49 83 c5 f0 addq $-0x10, %r13 + // 87: 48 83 c4 28 addq $0x28, %rsp + // 8b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x92 <_JIT_ENTRY+0x92> + // 000000000000008e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 92: 48 89 f9 movq %rdi, %rcx + // 95: ff 15 00 00 00 00 callq *(%rip) # 0x9b <_JIT_ENTRY+0x9b> + // 0000000000000097: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 9b: 48 85 f6 testq %rsi, %rsi + // 9e: 75 df jne 0x7f <_JIT_ENTRY+0x7f> + // a0: 49 8b 46 70 movq 0x70(%r14), %rax + // a4: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0xab <_JIT_ENTRY+0xab> + // 00000000000000a7: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // ab: 48 85 c0 testq %rax, %rax + // ae: 74 cf je 0x7f <_JIT_ENTRY+0x7f> + // b0: 48 83 78 08 00 cmpq $0x0, 0x8(%rax) + // b5: 74 c8 je 0x7f <_JIT_ENTRY+0x7f> + // b7: 49 83 c5 e8 addq $-0x18, %r13 + // bb: 48 83 c4 28 addq $0x28, %rsp + // bf: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[198] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x7d, 0xf8, + 0x4d, 0x8b, 0x7d, 0xe8, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x44, 0x0f, 0xb7, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x7c, + 0x24, 0x20, 0x4c, 0x89, 0xf1, 0x4c, 0x89, 0xfa, + 0x49, 0x89, 0xd8, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xc6, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, 0xc0, 0x78, + 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, 0x75, 0x09, + 0x4c, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xd9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x07, + 0x74, 0x18, 0x48, 0x85, 0xf6, 0x74, 0x21, 0x49, + 0x89, 0x75, 0xe8, 0x49, 0x83, 0xc5, 0xf0, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xf6, 0x75, 0xdf, + 0x49, 0x8b, 0x46, 0x70, 0x48, 0x8b, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0xcf, + 0x48, 0x83, 0x78, 0x08, 0x00, 0x74, 0xc8, 0x49, + 0x83, 0xc5, 0xe8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_MatchClass+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: &_Py_NoneStruct+0x0 + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_MatchClass); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8e, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x97, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa7, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x24); +} + +void +emit__MATCH_KEYS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_KEYS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 55 f0 movq -0x10(%r13), %rdx + // 8: 4d 8b 45 f8 movq -0x8(%r13), %r8 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 4c 89 f1 movq %r14, %rcx + // 14: ff 15 00 00 00 00 callq *(%rip) # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__PyEval_MatchKeys + // 1a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 28: 48 85 c0 testq %rax, %rax + // 2b: 74 13 je 0x40 <_JIT_ENTRY+0x40> + // 2d: 49 89 45 00 movq %rax, (%r13) + // 31: 49 83 c5 08 addq $0x8, %r13 + // 35: 48 83 c4 28 addq $0x28, %rsp + // 39: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x40 <_JIT_ENTRY+0x40> + // 000000000000003c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[75] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x55, 0xf0, + 0x4d, 0x8b, 0x45, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: &_PyEval_MatchKeys+0x0 + // 8: CONTINUE + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_MatchKeys); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0xc); +} + +void +emit__MATCH_MAPPING( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_MAPPING.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: f6 80 a8 00 00 00 40 testb $0x40, 0xa8(%rax) + // f: 75 16 jne 0x27 <_JIT_ENTRY+0x27> + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 18: 49 89 45 00 movq %rax, (%r13) + // 1c: 49 83 c5 08 addq $0x8, %r13 + // 20: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 27: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 2e: 49 89 45 00 movq %rax, (%r13) + // 32: 49 83 c5 08 addq $0x8, %r13 + // 36: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[54] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0xf6, 0x80, 0xa8, 0x00, 0x00, 0x00, 0x40, 0x75, + 0x16, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: CONTINUE + // 10: &_Py_TrueStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0xc); +} + +void +emit__MATCH_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MATCH_SEQUENCE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: f6 80 a8 00 00 00 20 testb $0x20, 0xa8(%rax) + // f: 75 16 jne 0x27 <_JIT_ENTRY+0x27> + // 11: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 18: 49 89 45 00 movq %rax, (%r13) + // 1c: 49 83 c5 08 addq $0x8, %r13 + // 20: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x27 <_JIT_ENTRY+0x27> + // 0000000000000023: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 27: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2e <_JIT_ENTRY+0x2e> + // 000000000000002a: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 2e: 49 89 45 00 movq %rax, (%r13) + // 32: 49 83 c5 08 addq $0x8, %r13 + // 36: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[54] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0xf6, 0x80, 0xa8, 0x00, 0x00, 0x00, 0x20, 0x75, + 0x16, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: CONTINUE + // 10: &_Py_TrueStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x23, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2a, (uintptr_t)data + 0xc); +} + +void +emit__MAYBE_EXPAND_METHOD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: b8 fe ff ff ff movl $0xfffffffe, %eax # imm = 0xFFFFFFFE + // 10: 29 d0 subl %edx, %eax + // 12: 48 98 cltq + // 14: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 19: 48 8b 71 08 movq 0x8(%rcx), %rsi + // 1d: 48 3b 35 00 00 00 00 cmpq (%rip), %rsi # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 24: 74 0b je 0x31 <_JIT_ENTRY+0x31> + // 26: 48 83 c4 28 addq $0x28, %rsp + // 2a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 31: f7 d2 notl %edx + // 33: 48 63 d2 movslq %edx, %rdx + // 36: 49 83 7c d5 00 00 cmpq $0x0, (%r13,%rdx,8) + // 3c: 75 e8 jne 0x26 <_JIT_ENTRY+0x26> + // 3e: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 42: 8b 3e movl (%rsi), %edi + // 44: 85 ff testl %edi, %edi + // 46: 78 04 js 0x4c <_JIT_ENTRY+0x4c> + // 48: ff c7 incl %edi + // 4a: 89 3e movl %edi, (%rsi) + // 4c: 49 89 74 d5 00 movq %rsi, (%r13,%rdx,8) + // 51: 48 8b 51 10 movq 0x10(%rcx), %rdx + // 55: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 5a: 8b 32 movl (%rdx), %esi + // 5c: 85 f6 testl %esi, %esi + // 5e: 78 04 js 0x64 <_JIT_ENTRY+0x64> + // 60: ff c6 incl %esi + // 62: 89 32 movl %esi, (%rdx) + // 64: 49 89 54 c5 00 movq %rdx, (%r13,%rax,8) + // 69: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 6e: 8b 01 movl (%rcx), %eax + // 70: 85 c0 testl %eax, %eax + // 72: 78 06 js 0x7a <_JIT_ENTRY+0x7a> + // 74: ff c8 decl %eax + // 76: 89 01 movl %eax, (%rcx) + // 78: 74 19 je 0x93 <_JIT_ENTRY+0x93> + // 7a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 7f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 88: 48 83 c4 28 addq $0x28, %rsp + // 8c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 93: ff 15 00 00 00 00 callq *(%rip) # 0x99 <_JIT_ENTRY+0x99> + // 0000000000000095: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 99: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 9e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a7: 48 83 c4 28 addq $0x28, %rsp + // ab: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xb2 <_JIT_ENTRY+0xb2> + // 00000000000000ae: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[171] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xb8, 0xfe, 0xff, 0xff, 0xff, + 0x29, 0xd0, 0x48, 0x98, 0x49, 0x8b, 0x4c, 0xc5, + 0x00, 0x48, 0x8b, 0x71, 0x08, 0x48, 0x3b, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xf7, 0xd2, 0x48, 0x63, 0xd2, 0x49, 0x83, + 0x7c, 0xd5, 0x00, 0x00, 0x75, 0xe8, 0x48, 0x8b, + 0x71, 0x18, 0x8b, 0x3e, 0x85, 0xff, 0x78, 0x04, + 0xff, 0xc7, 0x89, 0x3e, 0x49, 0x89, 0x74, 0xd5, + 0x00, 0x48, 0x8b, 0x51, 0x10, 0x49, 0x8b, 0x4c, + 0xc5, 0x00, 0x8b, 0x32, 0x85, 0xf6, 0x78, 0x04, + 0xff, 0xc6, 0x89, 0x32, 0x49, 0x89, 0x54, 0xc5, + 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, + 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x95, (uintptr_t)data + 0x14); +} + +void +emit__MAYBE_EXPAND_METHOD_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _MAYBE_EXPAND_METHOD_KW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 49 8b 75 f8 movq -0x8(%r13), %rsi + // f: b8 fd ff ff ff movl $0xfffffffd, %eax # imm = 0xFFFFFFFD + // 14: 29 c8 subl %ecx, %eax + // 16: 48 98 cltq + // 18: 49 8b 54 c5 00 movq (%r13,%rax,8), %rdx + // 1d: 48 8b 7a 08 movq 0x8(%rdx), %rdi + // 21: 48 3b 3d 00 00 00 00 cmpq (%rip), %rdi # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp_PyMethod_Type + // 28: 74 0f je 0x39 <_JIT_ENTRY+0x39> + // 2a: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 2e: 48 83 c4 28 addq $0x28, %rsp + // 32: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x39 <_JIT_ENTRY+0x39> + // 0000000000000035: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 39: bf fe ff ff ff movl $0xfffffffe, %edi # imm = 0xFFFFFFFE + // 3e: 29 cf subl %ecx, %edi + // 40: 48 63 ff movslq %edi, %rdi + // 43: 49 83 7c fd 00 00 cmpq $0x0, (%r13,%rdi,8) + // 49: 75 df jne 0x2a <_JIT_ENTRY+0x2a> + // 4b: 4c 8b 42 18 movq 0x18(%rdx), %r8 + // 4f: 41 8b 18 movl (%r8), %ebx + // 52: 48 89 d1 movq %rdx, %rcx + // 55: 85 db testl %ebx, %ebx + // 57: 78 0a js 0x63 <_JIT_ENTRY+0x63> + // 59: ff c3 incl %ebx + // 5b: 41 89 18 movl %ebx, (%r8) + // 5e: 49 8b 4c c5 00 movq (%r13,%rax,8), %rcx + // 63: 4d 89 44 fd 00 movq %r8, (%r13,%rdi,8) + // 68: 48 8b 52 10 movq 0x10(%rdx), %rdx + // 6c: 8b 3a movl (%rdx), %edi + // 6e: 85 ff testl %edi, %edi + // 70: 78 04 js 0x76 <_JIT_ENTRY+0x76> + // 72: ff c7 incl %edi + // 74: 89 3a movl %edi, (%rdx) + // 76: 49 89 54 c5 00 movq %rdx, (%r13,%rax,8) + // 7b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 80: 8b 01 movl (%rcx), %eax + // 82: 85 c0 testl %eax, %eax + // 84: 78 0c js 0x92 <_JIT_ENTRY+0x92> + // 86: ff c8 decl %eax + // 88: 89 01 movl %eax, (%rcx) + // 8a: 75 06 jne 0x92 <_JIT_ENTRY+0x92> + // 8c: ff 15 00 00 00 00 callq *(%rip) # 0x92 <_JIT_ENTRY+0x92> + // 000000000000008e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 92: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 97: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a0: 49 89 75 f8 movq %rsi, -0x8(%r13) + // a4: 48 83 c4 28 addq $0x28, %rsp + // a8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xaf <_JIT_ENTRY+0xaf> + // 00000000000000ab: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[168] = { + 0x48, 0x83, 0xec, 0x28, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x75, 0xf8, 0xb8, + 0xfd, 0xff, 0xff, 0xff, 0x29, 0xc8, 0x48, 0x98, + 0x49, 0x8b, 0x54, 0xc5, 0x00, 0x48, 0x8b, 0x7a, + 0x08, 0x48, 0x3b, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x0f, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0x29, 0xcf, + 0x48, 0x63, 0xff, 0x49, 0x83, 0x7c, 0xfd, 0x00, + 0x00, 0x75, 0xdf, 0x4c, 0x8b, 0x42, 0x18, 0x41, + 0x8b, 0x18, 0x48, 0x89, 0xd1, 0x85, 0xdb, 0x78, + 0x0a, 0xff, 0xc3, 0x41, 0x89, 0x18, 0x49, 0x8b, + 0x4c, 0xc5, 0x00, 0x4d, 0x89, 0x44, 0xfd, 0x00, + 0x48, 0x8b, 0x52, 0x10, 0x8b, 0x3a, 0x85, 0xff, + 0x78, 0x04, 0xff, 0xc7, 0x89, 0x3a, 0x49, 0x89, + 0x54, 0xc5, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: &PyMethod_Type+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyMethod_Type); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x35, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8e, (uintptr_t)data + 0x14); +} + +void +emit__NOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _NOP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE +} + +void +emit__POP_EXCEPT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_EXCEPT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 8b 56 78 movq 0x78(%r14), %rdx + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 48 8b 0a movq (%rdx), %rcx + // 14: 31 f6 xorl %esi, %esi + // 16: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 1d: 48 0f 45 f0 cmovneq %rax, %rsi + // 21: 48 89 32 movq %rsi, (%rdx) + // 24: 48 85 c9 testq %rcx, %rcx + // 27: 74 12 je 0x3b <_JIT_ENTRY+0x3b> + // 29: 8b 01 movl (%rcx), %eax + // 2b: 85 c0 testl %eax, %eax + // 2d: 78 0c js 0x3b <_JIT_ENTRY+0x3b> + // 2f: ff c8 decl %eax + // 31: 89 01 movl %eax, (%rcx) + // 33: 75 06 jne 0x3b <_JIT_ENTRY+0x3b> + // 35: ff 15 00 00 00 00 callq *(%rip) # 0x3b <_JIT_ENTRY+0x3b> + // 0000000000000037: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 3b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 40: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 49: 49 83 c5 f8 addq $-0x8, %r13 + // 4d: 48 83 c4 28 addq $0x28, %rsp + // 51: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x58 <_JIT_ENTRY+0x58> + // 0000000000000054: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[81] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x8b, 0x56, 0x78, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x0a, 0x31, 0xf6, 0x48, 0x3b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0f, 0x45, + 0xf0, 0x48, 0x89, 0x32, 0x48, 0x85, 0xc9, 0x74, + 0x12, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x37, (uintptr_t)data + 0x4); +} + +void +emit__POP_TOP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 8b 01 movl (%rcx), %eax + // e: 85 c0 testl %eax, %eax + // 10: 78 06 js 0x18 <_JIT_ENTRY+0x18> + // 12: ff c8 decl %eax + // 14: 89 01 movl %eax, (%rcx) + // 16: 74 0b je 0x23 <_JIT_ENTRY+0x23> + // 18: 48 83 c4 28 addq $0x28, %rsp + // 1c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 23: ff 15 00 00 00 00 callq *(%rip) # 0x29 <_JIT_ENTRY+0x29> + // 0000000000000025: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 29: 48 83 c4 28 addq $0x28, %rsp + // 2d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x34 <_JIT_ENTRY+0x34> + // 0000000000000030: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[45] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, 0x74, 0x0b, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x25, (uintptr_t)data + 0x4); +} + +void +emit__POP_TOP_LOAD_CONST_INLINE_BORROW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _POP_TOP_LOAD_CONST_INLINE_BORROW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 11: 8b 01 movl (%rcx), %eax + // 13: 85 c0 testl %eax, %eax + // 15: 78 0c js 0x23 <_JIT_ENTRY+0x23> + // 17: ff c8 decl %eax + // 19: 89 01 movl %eax, (%rcx) + // 1b: 75 06 jne 0x23 <_JIT_ENTRY+0x23> + // 1d: ff 15 00 00 00 00 callq *(%rip) # 0x23 <_JIT_ENTRY+0x23> + // 000000000000001f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 23: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 28: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 31: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 38: 49 89 45 00 movq %rax, (%r13) + // 3c: 49 83 c5 08 addq $0x8, %r13 + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[68] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, + 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &_Py_Dealloc+0x0 + // 8: OPERAND0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x8, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1f, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); +} + +void +emit__PUSH_EXC_INFO( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_EXC_INFO.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 8: 48 8b 11 movq (%rcx), %rdx + // b: 8b 30 movl (%rax), %esi + // d: 85 f6 testl %esi, %esi + // f: 78 04 js 0x15 <_JIT_ENTRY+0x15> + // 11: ff c6 incl %esi + // 13: 89 30 movl %esi, (%rax) + // 15: 48 85 d2 testq %rdx, %rdx + // 18: 75 07 jne 0x21 <_JIT_ENTRY+0x21> + // 1a: 48 8b 15 00 00 00 00 movq (%rip), %rdx # 0x21 <_JIT_ENTRY+0x21> + // 000000000000001d: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 21: 48 89 01 movq %rax, (%rcx) + // 24: 49 89 55 f8 movq %rdx, -0x8(%r13) + // 28: 49 89 45 00 movq %rax, (%r13) + // 2c: 49 83 c5 08 addq $0x8, %r13 + // 30: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[48] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x8b, 0x4e, 0x78, + 0x48, 0x8b, 0x11, 0x8b, 0x30, 0x85, 0xf6, 0x78, + 0x04, 0xff, 0xc6, 0x89, 0x30, 0x48, 0x85, 0xd2, + 0x75, 0x07, 0x48, 0x8b, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x01, 0x49, 0x89, 0x55, 0xf8, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + }; + // 0: &_Py_NoneStruct+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1d, (uintptr_t)data + -0x4); +} + +void +emit__PUSH_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_FRAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 49 83 c5 f8 addq $-0x8, %r13 + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 49 89 46 48 movq %rax, 0x48(%r14) + // 11: 41 ff 4e 2c decl 0x2c(%r14) + // 15: 4c 8b 68 40 movq 0x40(%rax), %r13 + // 19: 48 c7 40 40 00 00 00 00 movq $0x0, 0x40(%rax) + // 21: 49 89 c4 movq %rax, %r12 + // 24: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2b <_JIT_ENTRY+0x2b> + // 0000000000000027: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[36] = { + 0x49, 0x8b, 0x45, 0xf8, 0x49, 0x83, 0xc5, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x89, 0x46, + 0x48, 0x41, 0xff, 0x4e, 0x2c, 0x4c, 0x8b, 0x68, + 0x40, 0x48, 0xc7, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x89, 0xc4, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 c7 45 00 00 00 00 00 movq $0x0, (%r13) + // 8: 49 83 c5 08 addq $0x8, %r13 + // c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[12] = { + 0x49, 0xc7, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0x08, + }; + memcpy(code, code_body, sizeof(code_body)); +} + +void +emit__PUSH_NULL_CONDITIONAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PUSH_NULL_CONDITIONAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 66 83 e0 01 andw $0x1, %ax + // b: 74 08 je 0x15 <_JIT_ENTRY+0x15> + // d: 49 c7 45 00 00 00 00 00 movq $0x0, (%r13) + // 15: 0f b7 c0 movzwl %ax, %eax + // 18: 4d 8d 6c c5 00 leaq (%r13,%rax,8), %r13 + // 1d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[29] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x83, 0xe0, 0x01, 0x74, 0x08, 0x49, 0xc7, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xb7, 0xc0, + 0x4d, 0x8d, 0x6c, 0xc5, 0x00, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__PY_FRAME_GENERAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_GENERAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 38 subq $0x38, %rsp + // 4: 4c 89 e8 movq %r13, %rax + // 7: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0xe <_JIT_ENTRY+0xe> + // 000000000000000a: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // e: 8d 0c f5 00 00 00 00 leal (,%rsi,8), %ecx + // 15: 4c 89 ef movq %r13, %rdi + // 18: 48 29 cf subq %rcx, %rdi + // 1b: 89 f1 movl %esi, %ecx + // 1d: f7 d1 notl %ecx + // 1f: 48 63 d1 movslq %ecx, %rdx + // 22: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 27: 29 f1 subl %esi, %ecx + // 29: 4c 63 e9 movslq %ecx, %r13 + // 2c: 45 31 c0 xorl %r8d, %r8d + // 2f: 31 c9 xorl %ecx, %ecx + // 31: 48 83 3c d0 00 cmpq $0x0, (%rax,%rdx,8) + // 36: 4a 8b 14 e8 movq (%rax,%r13,8), %rdx + // 3a: 41 0f 94 c0 sete %r8b + // 3e: 0f 95 c1 setne %cl + // 41: 01 f1 addl %esi, %ecx + // 43: 4e 8d 0c c7 leaq (%rdi,%r8,8), %r9 + // 47: 49 83 c1 f8 addq $-0x8, %r9 + // 4b: 48 8b 72 30 movq 0x30(%rdx), %rsi + // 4f: f6 46 30 01 testb $0x1, 0x30(%rsi) + // 53: 75 12 jne 0x67 <_JIT_ENTRY+0x67> + // 55: 4c 8b 42 10 movq 0x10(%rdx), %r8 + // 59: 41 8b 10 movl (%r8), %edx + // 5c: 85 d2 testl %edx, %edx + // 5e: 78 0a js 0x6a <_JIT_ENTRY+0x6a> + // 60: ff c2 incl %edx + // 62: 41 89 10 movl %edx, (%r8) + // 65: eb 03 jmp 0x6a <_JIT_ENTRY+0x6a> + // 67: 45 31 c0 xorl %r8d, %r8d + // 6a: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 6f: 89 c9 movl %ecx, %ecx + // 71: 4a 8b 14 e8 movq (%rax,%r13,8), %rdx + // 75: 49 c1 e5 03 shlq $0x3, %r13 + // 79: 4c 89 64 24 30 movq %r12, 0x30(%rsp) + // 7e: 48 89 4c 24 20 movq %rcx, 0x20(%rsp) + // 83: 48 c7 44 24 28 00 00 00 00 movq $0x0, 0x28(%rsp) + // 8c: 4c 89 f1 movq %r14, %rcx + // 8f: ff 15 00 00 00 00 callq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: IMAGE_REL_AMD64_REL32 __imp__PyEvalFramePushAndInit + // 95: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // 9a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a3: 48 85 c0 testq %rax, %rax + // a6: 74 13 je 0xbb <_JIT_ENTRY+0xbb> + // a8: 49 89 45 00 movq %rax, (%r13) + // ac: 49 83 c5 08 addq $0x8, %r13 + // b0: 48 83 c4 38 addq $0x38, %rsp + // b4: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbb <_JIT_ENTRY+0xbb> + // 00000000000000b7: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // bb: 48 83 c4 38 addq $0x38, %rsp + // bf: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc6 <_JIT_ENTRY+0xc6> + // 00000000000000c2: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[198] = { + 0x48, 0x83, 0xec, 0x38, 0x4c, 0x89, 0xe8, 0x0f, + 0xb7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x0c, + 0xf5, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xef, + 0x48, 0x29, 0xcf, 0x89, 0xf1, 0xf7, 0xd1, 0x48, + 0x63, 0xd1, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0x29, + 0xf1, 0x4c, 0x63, 0xe9, 0x45, 0x31, 0xc0, 0x31, + 0xc9, 0x48, 0x83, 0x3c, 0xd0, 0x00, 0x4a, 0x8b, + 0x14, 0xe8, 0x41, 0x0f, 0x94, 0xc0, 0x0f, 0x95, + 0xc1, 0x01, 0xf1, 0x4e, 0x8d, 0x0c, 0xc7, 0x49, + 0x83, 0xc1, 0xf8, 0x48, 0x8b, 0x72, 0x30, 0xf6, + 0x46, 0x30, 0x01, 0x75, 0x12, 0x4c, 0x8b, 0x42, + 0x10, 0x41, 0x8b, 0x10, 0x85, 0xd2, 0x78, 0x0a, + 0xff, 0xc2, 0x41, 0x89, 0x10, 0xeb, 0x03, 0x45, + 0x31, 0xc0, 0x49, 0x89, 0x44, 0x24, 0x40, 0x89, + 0xc9, 0x4a, 0x8b, 0x14, 0xe8, 0x49, 0xc1, 0xe5, + 0x03, 0x4c, 0x89, 0x64, 0x24, 0x30, 0x48, 0x89, + 0x4c, 0x24, 0x20, 0x48, 0xc7, 0x44, 0x24, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x03, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x13, + 0x49, 0x89, 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0x83, 0xc4, 0x38, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x38, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xb7, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xc2, (uintptr_t)data + 0x14); +} + +void +emit__PY_FRAME_KW( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _PY_FRAME_KW.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 38 subq $0x38, %rsp + // 4: 4c 89 e8 movq %r13, %rax + // 7: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0xe <_JIT_ENTRY+0xe> + // 000000000000000a: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // e: b9 fe ff ff ff movl $0xfffffffe, %ecx # imm = 0xFFFFFFFE + // 13: 29 d1 subl %edx, %ecx + // 15: 4c 63 e9 movslq %ecx, %r13 + // 18: bf fd ff ff ff movl $0xfffffffd, %edi # imm = 0xFFFFFFFD + // 1d: 29 d7 subl %edx, %edi + // 1f: 31 c9 xorl %ecx, %ecx + // 21: 45 31 c0 xorl %r8d, %r8d + // 24: 4a 83 3c e8 00 cmpq $0x0, (%rax,%r13,8) + // 29: 48 8b 70 f8 movq -0x8(%rax), %rsi + // 2d: 0f 95 c1 setne %cl + // 30: 41 0f 94 c0 sete %r8b + // 34: 01 d1 addl %edx, %ecx + // 36: f7 d2 notl %edx + // 38: 48 63 d2 movslq %edx, %rdx + // 3b: 4c 8d 0c d0 leaq (%rax,%rdx,8), %r9 + // 3f: 48 63 d7 movslq %edi, %rdx + // 42: 48 8b 3c d0 movq (%rax,%rdx,8), %rdi + // 46: 4f 8d 0c c1 leaq (%r9,%r8,8), %r9 + // 4a: 49 83 c1 f8 addq $-0x8, %r9 + // 4e: 4c 8b 47 30 movq 0x30(%rdi), %r8 + // 52: 2b 4e 10 subl 0x10(%rsi), %ecx + // 55: 41 f6 40 30 01 testb $0x1, 0x30(%r8) + // 5a: 75 12 jne 0x6e <_JIT_ENTRY+0x6e> + // 5c: 4c 8b 47 10 movq 0x10(%rdi), %r8 + // 60: 41 8b 38 movl (%r8), %edi + // 63: 85 ff testl %edi, %edi + // 65: 78 0a js 0x71 <_JIT_ENTRY+0x71> + // 67: ff c7 incl %edi + // 69: 41 89 38 movl %edi, (%r8) + // 6c: eb 03 jmp 0x71 <_JIT_ENTRY+0x71> + // 6e: 45 31 c0 xorl %r8d, %r8d + // 71: 49 89 44 24 40 movq %rax, 0x40(%r12) + // 76: 48 63 c9 movslq %ecx, %rcx + // 79: 48 8b 14 d0 movq (%rax,%rdx,8), %rdx + // 7d: 4c 89 64 24 30 movq %r12, 0x30(%rsp) + // 82: 48 89 74 24 28 movq %rsi, 0x28(%rsp) + // 87: 48 89 4c 24 20 movq %rcx, 0x20(%rsp) + // 8c: 4c 89 f1 movq %r14, %rcx + // 8f: ff 15 00 00 00 00 callq *(%rip) # 0x95 <_JIT_ENTRY+0x95> + // 0000000000000091: IMAGE_REL_AMD64_REL32 __imp__PyEvalFramePushAndInit + // 95: 49 83 44 24 40 f8 addq $-0x8, 0x40(%r12) + // 9b: 8b 0e movl (%rsi), %ecx + // 9d: 85 c9 testl %ecx, %ecx + // 9f: 78 15 js 0xb6 <_JIT_ENTRY+0xb6> + // a1: ff c9 decl %ecx + // a3: 89 0e movl %ecx, (%rsi) + // a5: 75 0f jne 0xb6 <_JIT_ENTRY+0xb6> + // a7: 48 89 f1 movq %rsi, %rcx + // aa: 48 89 c6 movq %rax, %rsi + // ad: ff 15 00 00 00 00 callq *(%rip) # 0xb3 <_JIT_ENTRY+0xb3> + // 00000000000000af: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b3: 48 89 f0 movq %rsi, %rax + // b6: 49 c1 e5 03 shlq $0x3, %r13 + // ba: 4d 03 6c 24 40 addq 0x40(%r12), %r13 + // bf: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c8: 48 85 c0 testq %rax, %rax + // cb: 74 13 je 0xe0 <_JIT_ENTRY+0xe0> + // cd: 49 89 45 00 movq %rax, (%r13) + // d1: 49 83 c5 08 addq $0x8, %r13 + // d5: 48 83 c4 38 addq $0x38, %rsp + // d9: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe0 <_JIT_ENTRY+0xe0> + // 00000000000000dc: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // e0: 48 83 c4 38 addq $0x38, %rsp + // e4: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xeb <_JIT_ENTRY+0xeb> + // 00000000000000e7: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[235] = { + 0x48, 0x83, 0xec, 0x38, 0x4c, 0x89, 0xe8, 0x0f, + 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xfe, + 0xff, 0xff, 0xff, 0x29, 0xd1, 0x4c, 0x63, 0xe9, + 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x29, 0xd7, 0x31, + 0xc9, 0x45, 0x31, 0xc0, 0x4a, 0x83, 0x3c, 0xe8, + 0x00, 0x48, 0x8b, 0x70, 0xf8, 0x0f, 0x95, 0xc1, + 0x41, 0x0f, 0x94, 0xc0, 0x01, 0xd1, 0xf7, 0xd2, + 0x48, 0x63, 0xd2, 0x4c, 0x8d, 0x0c, 0xd0, 0x48, + 0x63, 0xd7, 0x48, 0x8b, 0x3c, 0xd0, 0x4f, 0x8d, + 0x0c, 0xc1, 0x49, 0x83, 0xc1, 0xf8, 0x4c, 0x8b, + 0x47, 0x30, 0x2b, 0x4e, 0x10, 0x41, 0xf6, 0x40, + 0x30, 0x01, 0x75, 0x12, 0x4c, 0x8b, 0x47, 0x10, + 0x41, 0x8b, 0x38, 0x85, 0xff, 0x78, 0x0a, 0xff, + 0xc7, 0x41, 0x89, 0x38, 0xeb, 0x03, 0x45, 0x31, + 0xc0, 0x49, 0x89, 0x44, 0x24, 0x40, 0x48, 0x63, + 0xc9, 0x48, 0x8b, 0x14, 0xd0, 0x4c, 0x89, 0x64, + 0x24, 0x30, 0x48, 0x89, 0x74, 0x24, 0x28, 0x48, + 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0x44, + 0x24, 0x40, 0xf8, 0x8b, 0x0e, 0x85, 0xc9, 0x78, + 0x15, 0xff, 0xc9, 0x89, 0x0e, 0x75, 0x0f, 0x48, + 0x89, 0xf1, 0x48, 0x89, 0xc6, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf0, 0x49, 0xc1, + 0xe5, 0x03, 0x4d, 0x03, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, 0x45, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, 0xc4, + 0x38, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x38, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEvalFramePushAndInit+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEvalFramePushAndInit); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xa, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x91, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0xaf, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xdc, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xe7, (uintptr_t)data + 0x1c); +} + +void +emit__REPLACE_WITH_TRUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _REPLACE_WITH_TRUE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 8b 01 movl (%rcx), %eax + // a: 85 c0 testl %eax, %eax + // c: 78 06 js 0x14 <_JIT_ENTRY+0x14> + // e: ff c8 decl %eax + // 10: 89 01 movl %eax, (%rcx) + // 12: 74 16 je 0x2a <_JIT_ENTRY+0x2a> + // 14: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 1b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1f: 48 83 c4 28 addq $0x28, %rsp + // 23: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 2a: ff 15 00 00 00 00 callq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 30: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 37: 49 89 45 f8 movq %rax, -0x8(%r13) + // 3b: 48 83 c4 28 addq $0x28, %rsp + // 3f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x46 <_JIT_ENTRY+0x46> + // 0000000000000042: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[63] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x16, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x45, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &_Py_TrueStruct+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + -0x4); +} + +void +emit__RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RESUME_CHECK.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 46 18 movq 0x18(%r14), %rax + // 4: 49 8b 0c 24 movq (%r12), %rcx + // 8: 48 3b 81 a8 00 00 00 cmpq 0xa8(%rcx), %rax + // f: 75 07 jne 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[31] = { + 0x49, 0x8b, 0x46, 0x18, 0x49, 0x8b, 0x0c, 0x24, + 0x48, 0x3b, 0x81, 0xa8, 0x00, 0x00, 0x00, 0x75, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: CONTINUE + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x4); +} + +void +emit__RETURN_GENERATOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_GENERATOR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4c 24 10 movq 0x10(%r12), %rcx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: ff 15 00 00 00 00 callq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__Py_MakeCoro + // 14: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 19: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 22: 48 85 c0 testq %rax, %rax + // 25: 0f 84 b3 01 00 00 je 0x1de <_JIT_ENTRY+0x1de> + // 2b: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 30: 49 83 44 24 38 02 addq $0x2, 0x38(%r12) + // 36: 49 8b 4c 24 50 movq 0x50(%r12), %rcx + // 3b: 48 89 88 98 00 00 00 movq %rcx, 0x98(%rax) + // 42: 41 0f 10 04 24 movups (%r12), %xmm0 + // 47: 41 0f 10 4c 24 10 movups 0x10(%r12), %xmm1 + // 4d: 41 0f 10 54 24 20 movups 0x20(%r12), %xmm2 + // 53: 0f 11 50 68 movups %xmm2, 0x68(%rax) + // 57: 0f 11 48 58 movups %xmm1, 0x58(%rax) + // 5b: 0f 11 40 48 movups %xmm0, 0x48(%rax) + // 5f: 41 0f 10 44 24 40 movups 0x40(%r12), %xmm0 + // 65: 0f 11 80 88 00 00 00 movups %xmm0, 0x88(%rax) + // 6c: 41 0f 10 44 24 30 movups 0x30(%r12), %xmm0 + // 72: 0f 11 40 78 movups %xmm0, 0x78(%rax) + // 76: 49 8d 54 24 50 leaq 0x50(%r12), %rdx + // 7b: 49 8b 74 24 40 movq 0x40(%r12), %rsi + // 80: 48 29 d6 subq %rdx, %rsi + // 83: 48 c1 ee 03 shrq $0x3, %rsi + // 87: 48 63 ce movslq %esi, %rcx + // 8a: 48 8d 3c c8 leaq (%rax,%rcx,8), %rdi + // 8e: 48 81 c7 98 00 00 00 addq $0x98, %rdi + // 95: 48 89 b8 88 00 00 00 movq %rdi, 0x88(%rax) + // 9c: 83 f9 02 cmpl $0x2, %ecx + // 9f: 0f 8c e8 00 00 00 jl 0x18d <_JIT_ENTRY+0x18d> + // a5: 89 f1 movl %esi, %ecx + // a7: 81 e1 ff ff ff 7f andl $0x7fffffff, %ecx # imm = 0x7FFFFFFF + // ad: 4c 8d 41 ff leaq -0x1(%rcx), %r8 + // b1: bf 01 00 00 00 movl $0x1, %edi + // b6: 49 83 f8 08 cmpq $0x8, %r8 + // ba: 72 54 jb 0x110 <_JIT_ENTRY+0x110> + // bc: 49 89 c1 movq %rax, %r9 + // bf: 4d 29 e1 subq %r12, %r9 + // c2: 49 83 c1 48 addq $0x48, %r9 + // c6: 49 83 f9 20 cmpq $0x20, %r9 + // ca: 72 44 jb 0x110 <_JIT_ENTRY+0x110> + // cc: 4d 89 c1 movq %r8, %r9 + // cf: 49 83 e1 fc andq $-0x4, %r9 + // d3: 49 8d 79 01 leaq 0x1(%r9), %rdi + // d7: 45 31 d2 xorl %r10d, %r10d + // da: 66 0f 1f 44 00 00 nopw (%rax,%rax) + // e0: 43 0f 10 44 d4 58 movups 0x58(%r12,%r10,8), %xmm0 + // e6: 43 0f 10 4c d4 68 movups 0x68(%r12,%r10,8), %xmm1 + // ec: 42 0f 11 84 d0 a0 00 00 00 movups %xmm0, 0xa0(%rax,%r10,8) + // f5: 42 0f 11 8c d0 b0 00 00 00 movups %xmm1, 0xb0(%rax,%r10,8) + // fe: 49 83 c2 04 addq $0x4, %r10 + // 102: 4d 39 d1 cmpq %r10, %r9 + // 105: 75 d9 jne 0xe0 <_JIT_ENTRY+0xe0> + // 107: 4d 39 c8 cmpq %r9, %r8 + // 10a: 0f 84 7d 00 00 00 je 0x18d <_JIT_ENTRY+0x18d> + // 110: 29 fe subl %edi, %esi + // 112: 49 89 f8 movq %rdi, %r8 + // 115: 83 e6 03 andl $0x3, %esi + // 118: 74 26 je 0x140 <_JIT_ENTRY+0x140> + // 11a: 49 89 c1 movq %rax, %r9 + // 11d: 49 81 c1 98 00 00 00 addq $0x98, %r9 + // 124: 49 89 f8 movq %rdi, %r8 + // 127: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) + // 130: 4e 8b 14 c2 movq (%rdx,%r8,8), %r10 + // 134: 4f 89 14 c1 movq %r10, (%r9,%r8,8) + // 138: 49 ff c0 incq %r8 + // 13b: 48 ff ce decq %rsi + // 13e: 75 f0 jne 0x130 <_JIT_ENTRY+0x130> + // 140: 48 29 cf subq %rcx, %rdi + // 143: 48 83 ff fc cmpq $-0x4, %rdi + // 147: 77 44 ja 0x18d <_JIT_ENTRY+0x18d> + // 149: 0f 1f 80 00 00 00 00 nopl (%rax) + // 150: 4b 8b 54 c4 50 movq 0x50(%r12,%r8,8), %rdx + // 155: 4a 89 94 c0 98 00 00 00 movq %rdx, 0x98(%rax,%r8,8) + // 15d: 4b 8b 54 c4 58 movq 0x58(%r12,%r8,8), %rdx + // 162: 4a 89 94 c0 a0 00 00 00 movq %rdx, 0xa0(%rax,%r8,8) + // 16a: 4b 8b 54 c4 60 movq 0x60(%r12,%r8,8), %rdx + // 16f: 4a 89 94 c0 a8 00 00 00 movq %rdx, 0xa8(%rax,%r8,8) + // 177: 4b 8b 54 c4 68 movq 0x68(%r12,%r8,8), %rdx + // 17c: 4a 89 94 c0 b0 00 00 00 movq %rdx, 0xb0(%rax,%r8,8) + // 184: 49 83 c0 04 addq $0x4, %r8 + // 188: 4c 39 c1 cmpq %r8, %rcx + // 18b: 75 c3 jne 0x150 <_JIT_ENTRY+0x150> + // 18d: 48 c7 40 50 00 00 00 00 movq $0x0, 0x50(%rax) + // 195: c6 40 43 fd movb $-0x3, 0x43(%rax) + // 199: c6 80 92 00 00 00 01 movb $0x1, 0x92(%rax) + // 1a0: 41 ff 46 2c incl 0x2c(%r14) + // 1a4: 49 8b 74 24 08 movq 0x8(%r12), %rsi + // 1a9: 4c 89 f1 movq %r14, %rcx + // 1ac: 4c 89 e2 movq %r12, %rdx + // 1af: 48 89 c7 movq %rax, %rdi + // 1b2: ff 15 00 00 00 00 callq *(%rip) # 0x1b8 <_JIT_ENTRY+0x1b8> + // 00000000000001b4: IMAGE_REL_AMD64_REL32 __imp__PyThreadState_PopFrame + // 1b8: 49 89 76 48 movq %rsi, 0x48(%r14) + // 1bc: 4c 8b 6e 40 movq 0x40(%rsi), %r13 + // 1c0: 48 c7 46 40 00 00 00 00 movq $0x0, 0x40(%rsi) + // 1c8: 49 89 7d 00 movq %rdi, (%r13) + // 1cc: 49 83 c5 08 addq $0x8, %r13 + // 1d0: 49 89 f4 movq %rsi, %r12 + // 1d3: 48 83 c4 28 addq $0x28, %rsp + // 1d7: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1de <_JIT_ENTRY+0x1de> + // 00000000000001da: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 1de: 48 83 c4 28 addq $0x28, %rsp + // 1e2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1e9 <_JIT_ENTRY+0x1e9> + // 00000000000001e5: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[489] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4c, 0x24, + 0x10, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x0f, 0x84, 0xb3, + 0x01, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x49, 0x83, 0x44, 0x24, 0x38, 0x02, 0x49, 0x8b, + 0x4c, 0x24, 0x50, 0x48, 0x89, 0x88, 0x98, 0x00, + 0x00, 0x00, 0x41, 0x0f, 0x10, 0x04, 0x24, 0x41, + 0x0f, 0x10, 0x4c, 0x24, 0x10, 0x41, 0x0f, 0x10, + 0x54, 0x24, 0x20, 0x0f, 0x11, 0x50, 0x68, 0x0f, + 0x11, 0x48, 0x58, 0x0f, 0x11, 0x40, 0x48, 0x41, + 0x0f, 0x10, 0x44, 0x24, 0x40, 0x0f, 0x11, 0x80, + 0x88, 0x00, 0x00, 0x00, 0x41, 0x0f, 0x10, 0x44, + 0x24, 0x30, 0x0f, 0x11, 0x40, 0x78, 0x49, 0x8d, + 0x54, 0x24, 0x50, 0x49, 0x8b, 0x74, 0x24, 0x40, + 0x48, 0x29, 0xd6, 0x48, 0xc1, 0xee, 0x03, 0x48, + 0x63, 0xce, 0x48, 0x8d, 0x3c, 0xc8, 0x48, 0x81, + 0xc7, 0x98, 0x00, 0x00, 0x00, 0x48, 0x89, 0xb8, + 0x88, 0x00, 0x00, 0x00, 0x83, 0xf9, 0x02, 0x0f, + 0x8c, 0xe8, 0x00, 0x00, 0x00, 0x89, 0xf1, 0x81, + 0xe1, 0xff, 0xff, 0xff, 0x7f, 0x4c, 0x8d, 0x41, + 0xff, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xf8, 0x08, 0x72, 0x54, 0x49, 0x89, 0xc1, 0x4d, + 0x29, 0xe1, 0x49, 0x83, 0xc1, 0x48, 0x49, 0x83, + 0xf9, 0x20, 0x72, 0x44, 0x4d, 0x89, 0xc1, 0x49, + 0x83, 0xe1, 0xfc, 0x49, 0x8d, 0x79, 0x01, 0x45, + 0x31, 0xd2, 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x43, 0x0f, 0x10, 0x44, 0xd4, 0x58, 0x43, 0x0f, + 0x10, 0x4c, 0xd4, 0x68, 0x42, 0x0f, 0x11, 0x84, + 0xd0, 0xa0, 0x00, 0x00, 0x00, 0x42, 0x0f, 0x11, + 0x8c, 0xd0, 0xb0, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc2, 0x04, 0x4d, 0x39, 0xd1, 0x75, 0xd9, 0x4d, + 0x39, 0xc8, 0x0f, 0x84, 0x7d, 0x00, 0x00, 0x00, + 0x29, 0xfe, 0x49, 0x89, 0xf8, 0x83, 0xe6, 0x03, + 0x74, 0x26, 0x49, 0x89, 0xc1, 0x49, 0x81, 0xc1, + 0x98, 0x00, 0x00, 0x00, 0x49, 0x89, 0xf8, 0x66, + 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x8b, 0x14, 0xc2, 0x4f, 0x89, 0x14, 0xc1, + 0x49, 0xff, 0xc0, 0x48, 0xff, 0xce, 0x75, 0xf0, + 0x48, 0x29, 0xcf, 0x48, 0x83, 0xff, 0xfc, 0x77, + 0x44, 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x8b, 0x54, 0xc4, 0x50, 0x4a, 0x89, 0x94, + 0xc0, 0x98, 0x00, 0x00, 0x00, 0x4b, 0x8b, 0x54, + 0xc4, 0x58, 0x4a, 0x89, 0x94, 0xc0, 0xa0, 0x00, + 0x00, 0x00, 0x4b, 0x8b, 0x54, 0xc4, 0x60, 0x4a, + 0x89, 0x94, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0x4b, + 0x8b, 0x54, 0xc4, 0x68, 0x4a, 0x89, 0x94, 0xc0, + 0xb0, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc0, 0x04, + 0x4c, 0x39, 0xc1, 0x75, 0xc3, 0x48, 0xc7, 0x40, + 0x50, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x40, 0x43, + 0xfd, 0xc6, 0x80, 0x92, 0x00, 0x00, 0x00, 0x01, + 0x41, 0xff, 0x46, 0x2c, 0x49, 0x8b, 0x74, 0x24, + 0x08, 0x4c, 0x89, 0xf1, 0x4c, 0x89, 0xe2, 0x48, + 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x76, 0x48, 0x4c, 0x8b, 0x6e, 0x40, + 0x48, 0xc7, 0x46, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x7d, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x49, 0x89, 0xf4, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: &_Py_MakeCoro+0x0 + // 8: &_PyThreadState_PopFrame+0x0 + // 10: CONTINUE + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_MakeCoro); + patch_64(data + 0x8, (uintptr_t)&_PyThreadState_PopFrame); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1b4, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x1da, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x1e5, (uintptr_t)data + 0x14); +} + +void +emit__RETURN_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _RETURN_VALUE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4c 89 e2 movq %r12, %rdx + // 7: 49 8b 75 f8 movq -0x8(%r13), %rsi + // b: 49 83 c5 f8 addq $-0x8, %r13 + // f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 14: 41 ff 46 2c incl 0x2c(%r14) + // 18: 4d 8b 64 24 08 movq 0x8(%r12), %r12 + // 1d: 4d 89 66 48 movq %r12, 0x48(%r14) + // 21: 4c 89 f1 movq %r14, %rcx + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp__PyEval_FrameClearAndPop + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 49 89 75 00 movq %rsi, (%r13) + // 3c: 49 83 c5 08 addq $0x8, %r13 + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[68] = { + 0x48, 0x83, 0xec, 0x28, 0x4c, 0x89, 0xe2, 0x49, + 0x8b, 0x75, 0xf8, 0x49, 0x83, 0xc5, 0xf8, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x41, 0xff, 0x46, 0x2c, + 0x4d, 0x8b, 0x64, 0x24, 0x08, 0x4d, 0x89, 0x66, + 0x48, 0x4c, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x89, 0x75, 0x00, 0x49, 0x83, 0xc5, 0x08, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &_PyEval_FrameClearAndPop+0x0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyEval_FrameClearAndPop); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + -0x4); +} + +void +emit__SAVE_RETURN_OFFSET( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SAVE_RETURN_OFFSET.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: 66 41 89 44 24 48 movw %ax, 0x48(%r12) + // d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[13] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x41, 0x89, 0x44, 0x24, 0x48, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__SEND_GEN_FRAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SEND_GEN_FRAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f0 movq -0x10(%r13), %rax + // 4: 48 8b 48 08 movq 0x8(%rax), %rcx + // 8: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyGen_Type + // f: 0f 94 c2 sete %dl + // 12: 48 3b 0d 00 00 00 00 cmpq (%rip), %rcx # 0x19 <_JIT_ENTRY+0x19> + // 0000000000000015: IMAGE_REL_AMD64_REL32 __imp_PyCoro_Type + // 19: 0f 94 c1 sete %cl + // 1c: 08 d1 orb %dl, %cl + // 1e: 74 06 je 0x26 <_JIT_ENTRY+0x26> + // 20: 80 78 43 00 cmpb $0x0, 0x43(%rax) + // 24: 78 07 js 0x2d <_JIT_ENTRY+0x2d> + // 26: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x2d <_JIT_ENTRY+0x2d> + // 0000000000000029: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 2d: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 31: 48 8d 50 48 leaq 0x48(%rax), %rdx + // 35: 48 8b b0 88 00 00 00 movq 0x88(%rax), %rsi + // 3c: 48 89 0e movq %rcx, (%rsi) + // 3f: 48 83 80 88 00 00 00 08 addq $0x8, 0x88(%rax) + // 47: c6 40 43 00 movb $0x0, 0x43(%rax) + // 4b: 49 8b 4e 78 movq 0x78(%r14), %rcx + // 4f: 48 8d 70 28 leaq 0x28(%rax), %rsi + // 53: 48 89 48 30 movq %rcx, 0x30(%rax) + // 57: 49 89 76 78 movq %rsi, 0x78(%r14) + // 5b: 8b 0d 00 00 00 00 movl (%rip), %ecx # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 61: 83 c1 02 addl $0x2, %ecx + // 64: 66 41 89 4c 24 48 movw %cx, 0x48(%r12) + // 6a: 4c 89 60 50 movq %r12, 0x50(%rax) + // 6e: 49 89 55 f8 movq %rdx, -0x8(%r13) + // 72: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[114] = { + 0x49, 0x8b, 0x45, 0xf0, 0x48, 0x8b, 0x48, 0x08, + 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x94, 0xc2, 0x48, 0x3b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x94, 0xc1, 0x08, 0xd1, 0x74, 0x06, + 0x80, 0x78, 0x43, 0x00, 0x78, 0x07, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4d, + 0xf8, 0x48, 0x8d, 0x50, 0x48, 0x48, 0x8b, 0xb0, + 0x88, 0x00, 0x00, 0x00, 0x48, 0x89, 0x0e, 0x48, + 0x83, 0x80, 0x88, 0x00, 0x00, 0x00, 0x08, 0xc6, + 0x40, 0x43, 0x00, 0x49, 0x8b, 0x4e, 0x78, 0x48, + 0x8d, 0x70, 0x28, 0x48, 0x89, 0x48, 0x30, 0x49, + 0x89, 0x76, 0x78, 0x8b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x83, 0xc1, 0x02, 0x66, 0x41, 0x89, 0x4c, + 0x24, 0x48, 0x4c, 0x89, 0x60, 0x50, 0x49, 0x89, + 0x55, 0xf8, + }; + // 0: &PyGen_Type+0x0 + // 8: &PyCoro_Type+0x0 + // 10: JUMP_TARGET + // 18: OPARG + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyGen_Type); + patch_64(data + 0x8, (uintptr_t)&PyCoro_Type); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x15, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x29, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0x14); +} + +void +emit__SETUP_ANNOTATIONS( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SETUP_ANNOTATIONS.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4c 24 28 movq 0x28(%r12), %rcx + // 9: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // e: 48 85 c9 testq %rcx, %rcx + // 11: 74 63 je 0x76 <_JIT_ENTRY+0x76> + // 13: ba 88 8d 00 00 movl $0x8d88, %edx # imm = 0x8D88 + // 18: 48 03 15 00 00 00 00 addq (%rip), %rdx # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 1f: 4c 8d 44 24 20 leaq 0x20(%rsp), %r8 + // 24: ff 15 00 00 00 00 callq *(%rip) # 0x2a <_JIT_ENTRY+0x2a> + // 0000000000000026: IMAGE_REL_AMD64_REL32 __imp_PyMapping_GetOptionalItem + // 2a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 38: 85 c0 testl %eax, %eax + // 3a: 78 62 js 0x9e <_JIT_ENTRY+0x9e> + // 3c: 48 8b 4c 24 20 movq 0x20(%rsp), %rcx + // 41: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 46: 48 85 c9 testq %rcx, %rcx + // 49: 74 5e je 0xa9 <_JIT_ENTRY+0xa9> + // 4b: 8b 01 movl (%rcx), %eax + // 4d: 85 c0 testl %eax, %eax + // 4f: 78 0c js 0x5d <_JIT_ENTRY+0x5d> + // 51: ff c8 decl %eax + // 53: 89 01 movl %eax, (%rcx) + // 55: 75 06 jne 0x5d <_JIT_ENTRY+0x5d> + // 57: ff 15 00 00 00 00 callq *(%rip) # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 5d: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 62: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 6b: 48 83 c4 28 addq $0x28, %rsp + // 6f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 76: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7d <_JIT_ENTRY+0x7d> + // 0000000000000079: IMAGE_REL_AMD64_REL32 __imp_PyExc_SystemError + // 7d: 48 8b 10 movq (%rax), %rdx + // 80: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x87 <_JIT_ENTRY+0x87> + // 0000000000000083: IMAGE_REL_AMD64_REL32 ??_C@_0CM@CAADNNCE@no?5locals?5found?5when?5setting?5up?5@ + // 87: 4c 89 f1 movq %r14, %rcx + // 8a: ff 15 00 00 00 00 callq *(%rip) # 0x90 <_JIT_ENTRY+0x90> + // 000000000000008c: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // 90: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 95: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 9e: 48 83 c4 28 addq $0x28, %rsp + // a2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa9 <_JIT_ENTRY+0xa9> + // 00000000000000a5: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // a9: ff 15 00 00 00 00 callq *(%rip) # 0xaf <_JIT_ENTRY+0xaf> + // 00000000000000ab: IMAGE_REL_AMD64_REL32 __imp_PyDict_New + // af: 48 89 44 24 20 movq %rax, 0x20(%rsp) + // b4: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // b9: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // c2: 48 85 c0 testq %rax, %rax + // c5: 74 d7 je 0x9e <_JIT_ENTRY+0x9e> + // c7: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // cc: 49 8b 4c 24 28 movq 0x28(%r12), %rcx + // d1: ba 88 8d 00 00 movl $0x8d88, %edx # imm = 0x8D88 + // d6: 48 03 15 00 00 00 00 addq (%rip), %rdx # 0xdd <_JIT_ENTRY+0xdd> + // 00000000000000d9: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // dd: 49 89 c0 movq %rax, %r8 + // e0: ff 15 00 00 00 00 callq *(%rip) # 0xe6 <_JIT_ENTRY+0xe6> + // 00000000000000e2: IMAGE_REL_AMD64_REL32 __imp_PyObject_SetItem + // e6: 48 8b 4c 24 20 movq 0x20(%rsp), %rcx + // eb: 8b 11 movl (%rcx), %edx + // ed: 85 d2 testl %edx, %edx + // ef: 78 10 js 0x101 <_JIT_ENTRY+0x101> + // f1: ff ca decl %edx + // f3: 89 11 movl %edx, (%rcx) + // f5: 75 0a jne 0x101 <_JIT_ENTRY+0x101> + // f7: 89 c6 movl %eax, %esi + // f9: ff 15 00 00 00 00 callq *(%rip) # 0xff <_JIT_ENTRY+0xff> + // 00000000000000fb: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ff: 89 f0 movl %esi, %eax + // 101: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 106: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 10f: 85 c0 testl %eax, %eax + // 111: 0f 84 54 ff ff ff je 0x6b <_JIT_ENTRY+0x6b> + // 117: 48 83 c4 28 addq $0x28, %rsp + // 11b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x122 <_JIT_ENTRY+0x122> + // 000000000000011e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[290] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4c, 0x24, + 0x28, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, + 0xc9, 0x74, 0x63, 0xba, 0x88, 0x8d, 0x00, 0x00, + 0x48, 0x03, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x8d, 0x44, 0x24, 0x20, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x85, 0xc0, 0x78, 0x62, 0x48, 0x8b, 0x4c, 0x24, + 0x20, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, + 0xc9, 0x74, 0x5e, 0x8b, 0x01, 0x85, 0xc0, 0x78, + 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x10, + 0x4c, 0x8d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0x44, 0x24, 0x20, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0xd7, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x49, 0x8b, 0x4c, 0x24, + 0x28, 0xba, 0x88, 0x8d, 0x00, 0x00, 0x48, 0x03, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0xc0, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x4c, 0x24, 0x20, 0x8b, 0x11, 0x85, 0xd2, 0x78, + 0x10, 0xff, 0xca, 0x89, 0x11, 0x75, 0x0a, 0x89, + 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x85, + 0xc0, 0x0f, 0x84, 0x54, 0xff, 0xff, 0xff, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: 'no locals found when setting up annotations\x00' + // 2c: 00 00 00 00 + // 30: &_PyRuntime+0x0 + // 38: &PyMapping_GetOptionalItem+0x0 + // 40: &_Py_Dealloc+0x0 + // 48: CONTINUE + // 50: &PyExc_SystemError+0x0 + // 58: &_PyErr_Format+0x0 + // 60: ERROR_TARGET + // 68: &PyDict_New+0x0 + // 70: &PyObject_SetItem+0x0 + const unsigned char data_body[120] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x30, (uintptr_t)&_PyRuntime); + patch_64(data + 0x38, (uintptr_t)&PyMapping_GetOptionalItem); + patch_64(data + 0x40, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x48, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x50, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x58, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x60, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x68, (uintptr_t)&PyDict_New); + patch_64(data + 0x70, (uintptr_t)&PyObject_SetItem); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x26, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x79, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0x83, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xa5, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xab, (uintptr_t)data + 0x64); + patch_x86_64_32rx(code + 0xd9, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0xe2, (uintptr_t)data + 0x6c); + patch_x86_64_32rx(code + 0xfb, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x11e, (uintptr_t)data + 0x5c); +} + +void +emit__SET_ADD( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_ADD.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax # 0xa <_JIT_ENTRY+0xa> + // 0000000000000006: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // a: f7 d0 notl %eax + // c: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 19: 49 8b 4c 05 00 movq (%r13,%rax), %rcx + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 f2 movq %rsi, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp_PySet_Add + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 8b 0e movl (%rsi), %ecx + // 3c: 85 c9 testl %ecx, %ecx + // 3e: 78 06 js 0x46 <_JIT_ENTRY+0x46> + // 40: ff c9 decl %ecx + // 42: 89 0e movl %ecx, (%rsi) + // 44: 74 13 je 0x59 <_JIT_ENTRY+0x59> + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 48 83 c4 28 addq $0x28, %rsp + // 4e: 85 c0 testl %eax, %eax + // 50: 74 20 je 0x72 <_JIT_ENTRY+0x72> + // 52: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 59: 48 89 f1 movq %rsi, %rcx + // 5c: 89 c6 movl %eax, %esi + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 64: 89 f0 movl %esi, %eax + // 66: 49 83 c5 f8 addq $-0x8, %r13 + // 6a: 48 83 c4 28 addq $0x28, %rsp + // 6e: 85 c0 testl %eax, %eax + // 70: 75 e0 jne 0x52 <_JIT_ENTRY+0x52> + // 72: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[114] = { + 0x48, 0x83, 0xec, 0x28, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x75, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x4c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf2, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x13, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, + 0x74, 0x20, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, + 0x75, 0xe0, + }; + // 0: OPARG + // 8: &PySet_Add+0x0 + // 10: ERROR_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PySet_Add); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x14); +} + +void +emit__SET_FUNCTION_ATTRIBUTE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_FUNCTION_ATTRIBUTE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 4: 49 8b 4d f0 movq -0x10(%r13), %rcx + // 8: 49 8b 55 f8 movq -0x8(%r13), %rdx + // c: 0f b7 35 00 00 00 00 movzwl (%rip), %esi # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 13: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0x1a <_JIT_ENTRY+0x1a> + // 0000000000000016: IMAGE_REL_AMD64_REL32 __imp__Py_FunctionAttributeOffsets + // 1a: 48 8b 34 f7 movq (%rdi,%rsi,8), %rsi + // 1e: 48 89 0c 32 movq %rcx, (%rdx,%rsi) + // 22: 49 89 55 f0 movq %rdx, -0x10(%r13) + // 26: 49 89 c5 movq %rax, %r13 + // 29: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x30 <_JIT_ENTRY+0x30> + // 000000000000002c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[41] = { + 0x49, 0x8d, 0x45, 0xf8, 0x49, 0x8b, 0x4d, 0xf0, + 0x49, 0x8b, 0x55, 0xf8, 0x0f, 0xb7, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x3d, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x34, 0xf7, 0x48, 0x89, + 0x0c, 0x32, 0x49, 0x89, 0x55, 0xf0, 0x49, 0x89, + 0xc5, + }; + // 0: OPARG + // 8: &_Py_FunctionAttributeOffsets+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_FunctionAttributeOffsets); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x16, (uintptr_t)data + 0x4); +} + +void +emit__SET_IP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_IP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 7: 49 89 44 24 38 movq %rax, 0x38(%r12) + // c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[12] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x44, 0x24, 0x38, + }; + // 0: OPERAND0 + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__SET_UPDATE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SET_UPDATE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax # 0xa <_JIT_ENTRY+0xa> + // 0000000000000006: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // a: f7 d0 notl %eax + // c: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 10: c1 e0 03 shll $0x3, %eax + // 13: 48 0d 00 00 f8 ff orq $-0x80000, %rax # imm = 0xFFF80000 + // 19: 49 8b 4c 05 00 movq (%r13,%rax), %rcx + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 f2 movq %rsi, %rdx + // 26: ff 15 00 00 00 00 callq *(%rip) # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__PySet_Update + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 8b 0e movl (%rsi), %ecx + // 3c: 85 c9 testl %ecx, %ecx + // 3e: 78 06 js 0x46 <_JIT_ENTRY+0x46> + // 40: ff c9 decl %ecx + // 42: 89 0e movl %ecx, (%rsi) + // 44: 74 13 je 0x59 <_JIT_ENTRY+0x59> + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 48 83 c4 28 addq $0x28, %rsp + // 4e: 85 c0 testl %eax, %eax + // 50: 78 20 js 0x72 <_JIT_ENTRY+0x72> + // 52: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x59 <_JIT_ENTRY+0x59> + // 0000000000000055: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 59: 48 89 f1 movq %rsi, %rcx + // 5c: 89 c6 movl %eax, %esi + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 64: 89 f0 movl %esi, %eax + // 66: 49 83 c5 f8 addq $-0x8, %r13 + // 6a: 48 83 c4 28 addq $0x28, %rsp + // 6e: 85 c0 testl %eax, %eax + // 70: 79 e0 jns 0x52 <_JIT_ENTRY+0x52> + // 72: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[121] = { + 0x48, 0x83, 0xec, 0x28, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xf7, 0xd0, 0x49, 0x8b, 0x75, 0xf8, + 0xc1, 0xe0, 0x03, 0x48, 0x0d, 0x00, 0x00, 0xf8, + 0xff, 0x49, 0x8b, 0x4c, 0x05, 0x00, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf2, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x13, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, + 0x78, 0x20, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, + 0x79, 0xe0, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: OPARG + // 8: &_PySet_Update+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PySet_Update); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x55, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x75, (uintptr_t)data + 0x1c); +} + +void +emit__START_EXECUTOR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _START_EXECUTOR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9: 49 8b 8e 08 01 00 00 movq 0x108(%r14), %rcx + // 10: 48 85 c9 testq %rcx, %rcx + // 13: 74 17 je 0x2c <_JIT_ENTRY+0x2c> + // 15: 49 c7 86 08 01 00 00 00 00 00 00 movq $0x0, 0x108(%r14) + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x49, 0x8b, 0x8e, 0x08, 0x01, 0x00, 0x00, + 0x48, 0x85, 0xc9, 0x74, 0x17, 0x49, 0xc7, 0x86, + 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_ATTR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 8: 49 8b 75 f8 movq -0x8(%r13), %rsi + // c: 49 8b 04 24 movq (%r12), %rax + // 10: 48 8b 40 20 movq 0x20(%rax), %rax + // 14: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1b: 48 8b 54 c8 18 movq 0x18(%rax,%rcx,8), %rdx + // 20: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 25: 48 89 f1 movq %rsi, %rcx + // 28: 49 89 d8 movq %rbx, %r8 + // 2b: ff 15 00 00 00 00 callq *(%rip) # 0x31 <_JIT_ENTRY+0x31> + // 000000000000002d: IMAGE_REL_AMD64_REL32 __imp_PyObject_SetAttr + // 31: 89 c7 movl %eax, %edi + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 8b 03 movl (%rbx), %eax + // 43: 85 c0 testl %eax, %eax + // 45: 78 0f js 0x56 <_JIT_ENTRY+0x56> + // 47: ff c8 decl %eax + // 49: 89 03 movl %eax, (%rbx) + // 4b: 75 09 jne 0x56 <_JIT_ENTRY+0x56> + // 4d: 48 89 d9 movq %rbx, %rcx + // 50: ff 15 00 00 00 00 callq *(%rip) # 0x56 <_JIT_ENTRY+0x56> + // 0000000000000052: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 56: 8b 06 movl (%rsi), %eax + // 58: 85 c0 testl %eax, %eax + // 5a: 78 06 js 0x62 <_JIT_ENTRY+0x62> + // 5c: ff c8 decl %eax + // 5e: 89 06 movl %eax, (%rsi) + // 60: 74 13 je 0x75 <_JIT_ENTRY+0x75> + // 62: 49 83 c5 f0 addq $-0x10, %r13 + // 66: 48 83 c4 28 addq $0x28, %rsp + // 6a: 85 ff testl %edi, %edi + // 6c: 74 1c je 0x8a <_JIT_ENTRY+0x8a> + // 6e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x75 <_JIT_ENTRY+0x75> + // 0000000000000071: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 75: 48 89 f1 movq %rsi, %rcx + // 78: ff 15 00 00 00 00 callq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7e: 49 83 c5 f0 addq $-0x10, %r13 + // 82: 48 83 c4 28 addq $0x28, %rsp + // 86: 85 ff testl %edi, %edi + // 88: 75 e4 jne 0x6e <_JIT_ENTRY+0x6e> + // 8a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x91 <_JIT_ENTRY+0x91> + // 000000000000008d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[138] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf0, + 0x49, 0x8b, 0x75, 0xf8, 0x49, 0x8b, 0x04, 0x24, + 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x54, 0xc8, 0x18, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0x49, 0x89, 0xd8, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x89, 0xc7, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x0f, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, 0x89, 0xd9, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, + 0x74, 0x13, 0x49, 0x83, 0xc5, 0xf0, 0x48, 0x83, + 0xc4, 0x28, 0x85, 0xff, 0x74, 0x1c, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf0, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xff, + 0x75, 0xe4, + }; + // 0: OPARG + // 8: &PyObject_SetAttr+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetAttr); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2d, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x52, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x71, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x7a, (uintptr_t)data + 0xc); +} + +void +emit__STORE_ATTR_INSTANCE_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_INSTANCE_VALUE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 55 f0 movq -0x10(%r13), %rdx + // 8: 49 8b 4d f8 movq -0x8(%r13), %rcx + // c: 49 83 c5 f0 addq $-0x10, %r13 + // 10: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 17: 48 8b 34 01 movq (%rcx,%rax), %rsi + // 1b: 48 89 14 01 movq %rdx, (%rcx,%rax) + // 1f: 48 85 f6 testq %rsi, %rsi + // 22: 75 3c jne 0x60 <_JIT_ENTRY+0x60> + // 24: 48 01 c8 addq %rcx, %rax + // 27: 48 8b 51 08 movq 0x8(%rcx), %rdx + // 2b: 48 8b 52 20 movq 0x20(%rdx), %rdx + // 2f: 48 8d 3c 11 leaq (%rcx,%rdx), %rdi + // 33: 4c 8d 04 11 leaq (%rcx,%rdx), %r8 + // 37: 49 83 c0 08 addq $0x8, %r8 + // 3b: 44 29 c0 subl %r8d, %eax + // 3e: c1 e8 03 shrl $0x3, %eax + // 41: 44 0f b6 44 11 01 movzbl 0x1(%rcx,%rdx), %r8d + // 47: 44 0f b6 0c 11 movzbl (%rcx,%rdx), %r9d + // 4c: 4a 8d 3c cf leaq (%rdi,%r9,8), %rdi + // 50: 48 83 c7 08 addq $0x8, %rdi + // 54: 41 88 04 38 movb %al, (%r8,%rdi) + // 58: 41 8d 40 01 leal 0x1(%r8), %eax + // 5c: 88 44 11 01 movb %al, 0x1(%rcx,%rdx) + // 60: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 65: 8b 01 movl (%rcx), %eax + // 67: 85 c0 testl %eax, %eax + // 69: 78 0c js 0x77 <_JIT_ENTRY+0x77> + // 6b: ff c8 decl %eax + // 6d: 89 01 movl %eax, (%rcx) + // 6f: 75 06 jne 0x77 <_JIT_ENTRY+0x77> + // 71: ff 15 00 00 00 00 callq *(%rip) # 0x77 <_JIT_ENTRY+0x77> + // 0000000000000073: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 77: 48 85 f6 testq %rsi, %rsi + // 7a: 74 0c je 0x88 <_JIT_ENTRY+0x88> + // 7c: 8b 06 movl (%rsi), %eax + // 7e: 85 c0 testl %eax, %eax + // 80: 78 06 js 0x88 <_JIT_ENTRY+0x88> + // 82: ff c8 decl %eax + // 84: 89 06 movl %eax, (%rsi) + // 86: 74 19 je 0xa1 <_JIT_ENTRY+0xa1> + // 88: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 8d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 96: 48 83 c4 28 addq $0x28, %rsp + // 9a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa1 <_JIT_ENTRY+0xa1> + // 000000000000009d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // a1: 48 89 f1 movq %rsi, %rcx + // a4: ff 15 00 00 00 00 callq *(%rip) # 0xaa <_JIT_ENTRY+0xaa> + // 00000000000000a6: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // aa: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // af: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b8: 48 83 c4 28 addq $0x28, %rsp + // bc: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc3 <_JIT_ENTRY+0xc3> + // 00000000000000bf: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[188] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x55, 0xf0, + 0x49, 0x8b, 0x4d, 0xf8, 0x49, 0x83, 0xc5, 0xf0, + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x34, 0x01, 0x48, 0x89, 0x14, 0x01, 0x48, + 0x85, 0xf6, 0x75, 0x3c, 0x48, 0x01, 0xc8, 0x48, + 0x8b, 0x51, 0x08, 0x48, 0x8b, 0x52, 0x20, 0x48, + 0x8d, 0x3c, 0x11, 0x4c, 0x8d, 0x04, 0x11, 0x49, + 0x83, 0xc0, 0x08, 0x44, 0x29, 0xc0, 0xc1, 0xe8, + 0x03, 0x44, 0x0f, 0xb6, 0x44, 0x11, 0x01, 0x44, + 0x0f, 0xb6, 0x0c, 0x11, 0x4a, 0x8d, 0x3c, 0xcf, + 0x48, 0x83, 0xc7, 0x08, 0x41, 0x88, 0x04, 0x38, + 0x41, 0x8d, 0x40, 0x01, 0x88, 0x44, 0x11, 0x01, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x01, 0x85, + 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, + 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x85, 0xf6, 0x74, 0x0c, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x19, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x73, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x9d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xa6, (uintptr_t)data + 0x4); +} + +void +emit__STORE_ATTR_SLOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_SLOT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f0 movq -0x10(%r13), %rax + // 8: 49 8b 4d f8 movq -0x8(%r13), %rcx + // c: 49 83 c5 f0 addq $-0x10, %r13 + // 10: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x17 <_JIT_ENTRY+0x17> + // 0000000000000013: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 17: 48 8b 34 11 movq (%rcx,%rdx), %rsi + // 1b: 48 89 04 11 movq %rax, (%rcx,%rdx) + // 1f: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 24: 8b 01 movl (%rcx), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 0c js 0x36 <_JIT_ENTRY+0x36> + // 2a: ff c8 decl %eax + // 2c: 89 01 movl %eax, (%rcx) + // 2e: 75 06 jne 0x36 <_JIT_ENTRY+0x36> + // 30: ff 15 00 00 00 00 callq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 36: 48 85 f6 testq %rsi, %rsi + // 39: 74 0c je 0x47 <_JIT_ENTRY+0x47> + // 3b: 8b 06 movl (%rsi), %eax + // 3d: 85 c0 testl %eax, %eax + // 3f: 78 06 js 0x47 <_JIT_ENTRY+0x47> + // 41: ff c8 decl %eax + // 43: 89 06 movl %eax, (%rsi) + // 45: 74 19 je 0x60 <_JIT_ENTRY+0x60> + // 47: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 4c: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 55: 48 83 c4 28 addq $0x28, %rsp + // 59: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 60: 48 89 f1 movq %rsi, %rcx + // 63: ff 15 00 00 00 00 callq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 69: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6e: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 77: 48 83 c4 28 addq $0x28, %rsp + // 7b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[123] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf0, + 0x49, 0x8b, 0x4d, 0xf8, 0x49, 0x83, 0xc5, 0xf0, + 0x0f, 0xb7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x8b, 0x34, 0x11, 0x48, 0x89, 0x04, 0x11, 0x4d, + 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, 0x75, 0x06, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, + 0xf6, 0x74, 0x0c, 0x8b, 0x06, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x19, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: OPERAND0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x13, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x4); +} + +void +emit__STORE_ATTR_WITH_HINT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_ATTR_WITH_HINT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4c 8b 46 e8 movq -0x18(%rsi), %r8 + // c: 4d 85 c0 testq %r8, %r8 + // f: 74 44 je 0x55 <_JIT_ENTRY+0x55> + // 11: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_OPERAND0 + // 18: 49 8b 50 20 movq 0x20(%r8), %rdx + // 1c: 48 39 42 18 cmpq %rax, 0x18(%rdx) + // 20: 76 33 jbe 0x55 <_JIT_ENTRY+0x55> + // 22: 80 7a 0a 00 cmpb $0x0, 0xa(%rdx) + // 26: 74 2d je 0x55 <_JIT_ENTRY+0x55> + // 28: 49 8b 0c 24 movq (%r12), %rcx + // 2c: 48 8b 49 20 movq 0x20(%rcx), %rcx + // 30: 0f b7 3d 00 00 00 00 movzwl (%rip), %edi # 0x37 <_JIT_ENTRY+0x37> + // 0000000000000033: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 37: 4c 8b 4c f9 18 movq 0x18(%rcx,%rdi,8), %r9 + // 3c: 0f b6 4a 09 movzbl 0x9(%rdx), %ecx + // 40: bf 01 00 00 00 movl $0x1, %edi + // 45: 48 d3 e7 shlq %cl, %rdi + // 48: 48 01 d7 addq %rdx, %rdi + // 4b: c1 e0 04 shll $0x4, %eax + // 4e: 4c 39 4c 38 20 cmpq %r9, 0x20(%rax,%rdi) + // 53: 74 0b je 0x60 <_JIT_ENTRY+0x60> + // 55: 48 83 c4 28 addq $0x28, %rsp + // 59: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 60: 48 8d 1c 38 leaq (%rax,%rdi), %rbx + // 64: 48 83 c3 20 addq $0x20, %rbx + // 68: 48 8b 7b 08 movq 0x8(%rbx), %rdi + // 6c: 48 85 ff testq %rdi, %rdi + // 6f: 74 e4 je 0x55 <_JIT_ENTRY+0x55> + // 71: 4d 8b 7d f0 movq -0x10(%r13), %r15 + // 75: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 7a: 41 0f b6 48 18 movzbl 0x18(%r8), %ecx + // 7f: 85 c9 testl %ecx, %ecx + // 81: 74 15 je 0x98 <_JIT_ENTRY+0x98> + // 83: 4c 89 7c 24 20 movq %r15, 0x20(%rsp) + // 88: ba 01 00 00 00 movl $0x1, %edx + // 8d: ff 15 00 00 00 00 callq *(%rip) # 0x93 <_JIT_ENTRY+0x93> + // 000000000000008f: IMAGE_REL_AMD64_REL32 __imp__PyDict_SendEvent + // 93: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 98: 4c 89 7b 08 movq %r15, 0x8(%rbx) + // 9c: 49 83 c5 f0 addq $-0x10, %r13 + // a0: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // a5: 8b 06 movl (%rsi), %eax + // a7: 85 c0 testl %eax, %eax + // a9: 78 0f js 0xba <_JIT_ENTRY+0xba> + // ab: ff c8 decl %eax + // ad: 89 06 movl %eax, (%rsi) + // af: 75 09 jne 0xba <_JIT_ENTRY+0xba> + // b1: 48 89 f1 movq %rsi, %rcx + // b4: ff 15 00 00 00 00 callq *(%rip) # 0xba <_JIT_ENTRY+0xba> + // 00000000000000b6: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ba: 8b 07 movl (%rdi), %eax + // bc: 85 c0 testl %eax, %eax + // be: 78 0f js 0xcf <_JIT_ENTRY+0xcf> + // c0: ff c8 decl %eax + // c2: 89 07 movl %eax, (%rdi) + // c4: 75 09 jne 0xcf <_JIT_ENTRY+0xcf> + // c6: 48 89 f9 movq %rdi, %rcx + // c9: ff 15 00 00 00 00 callq *(%rip) # 0xcf <_JIT_ENTRY+0xcf> + // 00000000000000cb: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // cf: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // d4: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // dd: 48 83 c4 28 addq $0x28, %rsp + // e1: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe8 <_JIT_ENTRY+0xe8> + // 00000000000000e4: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[225] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4c, 0x8b, 0x46, 0xe8, 0x4d, 0x85, 0xc0, 0x74, + 0x44, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x50, 0x20, 0x48, 0x39, 0x42, 0x18, + 0x76, 0x33, 0x80, 0x7a, 0x0a, 0x00, 0x74, 0x2d, + 0x49, 0x8b, 0x0c, 0x24, 0x48, 0x8b, 0x49, 0x20, + 0x0f, 0xb7, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x4c, 0xf9, 0x18, 0x0f, 0xb6, 0x4a, 0x09, + 0xbf, 0x01, 0x00, 0x00, 0x00, 0x48, 0xd3, 0xe7, + 0x48, 0x01, 0xd7, 0xc1, 0xe0, 0x04, 0x4c, 0x39, + 0x4c, 0x38, 0x20, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8d, 0x1c, 0x38, 0x48, 0x83, 0xc3, 0x20, + 0x48, 0x8b, 0x7b, 0x08, 0x48, 0x85, 0xff, 0x74, + 0xe4, 0x4d, 0x8b, 0x7d, 0xf0, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x41, 0x0f, 0xb6, 0x48, 0x18, 0x85, + 0xc9, 0x74, 0x15, 0x4c, 0x89, 0x7c, 0x24, 0x20, + 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x4c, 0x89, 0x7b, 0x08, 0x49, 0x83, 0xc5, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, 0x06, 0x85, + 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x06, 0x75, + 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, 0x78, 0x0f, + 0xff, 0xc8, 0x89, 0x07, 0x75, 0x09, 0x48, 0x89, + 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, + 0x28, + }; + // 0: OPERAND0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: &_PyDict_SendEvent+0x0 + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->operand0); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)&_PyDict_SendEvent); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x33, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x8f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb6, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xcb, (uintptr_t)data + 0x1c); +} + +void +emit__STORE_DEREF( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_DEREF.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 0f b7 0d 00 00 00 00 movzwl (%rip), %ecx # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // f: 49 8b 54 cc 50 movq 0x50(%r12,%rcx,8), %rdx + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: 48 8b 4a 10 movq 0x10(%rdx), %rcx + // 1d: 48 89 42 10 movq %rax, 0x10(%rdx) + // 21: 48 85 c9 testq %rcx, %rcx + // 24: 74 12 je 0x38 <_JIT_ENTRY+0x38> + // 26: 8b 01 movl (%rcx), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 0c js 0x38 <_JIT_ENTRY+0x38> + // 2c: ff c8 decl %eax + // 2e: 89 01 movl %eax, (%rcx) + // 30: 75 06 jne 0x38 <_JIT_ENTRY+0x38> + // 32: ff 15 00 00 00 00 callq *(%rip) # 0x38 <_JIT_ENTRY+0x38> + // 0000000000000034: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 38: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3d: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 46: 49 83 c5 f8 addq $-0x8, %r13 + // 4a: 48 83 c4 28 addq $0x28, %rsp + // 4e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x55 <_JIT_ENTRY+0x55> + // 0000000000000051: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[78] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x0f, 0xb7, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0x54, 0xcc, 0x50, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x8b, 0x4a, 0x10, 0x48, 0x89, 0x42, + 0x10, 0x48, 0x85, 0xc9, 0x74, 0x12, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, 0x89, 0x01, + 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, + 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x34, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 13: 49 8b 4c d4 50 movq 0x50(%r12,%rdx,8), %rcx + // 18: 49 89 44 d4 50 movq %rax, 0x50(%r12,%rdx,8) + // 1d: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 22: 48 85 c9 testq %rcx, %rcx + // 25: 74 0c je 0x33 <_JIT_ENTRY+0x33> + // 27: 8b 01 movl (%rcx), %eax + // 29: 85 c0 testl %eax, %eax + // 2b: 78 06 js 0x33 <_JIT_ENTRY+0x33> + // 2d: ff c8 decl %eax + // 2f: 89 01 movl %eax, (%rcx) + // 31: 74 19 je 0x4c <_JIT_ENTRY+0x4c> + // 33: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 38: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 41: 48 83 c4 28 addq $0x28, %rsp + // 45: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4c: ff 15 00 00 00 00 callq *(%rip) # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 52: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 57: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 60: 48 83 c4 28 addq $0x28, %rsp + // 64: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[100] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x0f, 0xb7, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4c, 0xd4, 0x50, + 0x49, 0x89, 0x44, 0xd4, 0x50, 0x4d, 0x89, 0x6c, + 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, 0x8b, + 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, + 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, + }; + // 0: OPARG + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0xc); +} + +void +emit__STORE_FAST_0( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_0.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 4c 24 50 movq 0x50(%r12), %rcx + // 11: 49 89 44 24 50 movq %rax, 0x50(%r12) + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 85 c9 testq %rcx, %rcx + // 1e: 74 0c je 0x2c <_JIT_ENTRY+0x2c> + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x4c, 0x24, + 0x50, 0x49, 0x89, 0x44, 0x24, 0x50, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_1( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_1.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 4c 24 58 movq 0x58(%r12), %rcx + // 11: 49 89 44 24 58 movq %rax, 0x58(%r12) + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 85 c9 testq %rcx, %rcx + // 1e: 74 0c je 0x2c <_JIT_ENTRY+0x2c> + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x4c, 0x24, + 0x58, 0x49, 0x89, 0x44, 0x24, 0x58, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_2( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_2.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 4c 24 60 movq 0x60(%r12), %rcx + // 11: 49 89 44 24 60 movq %rax, 0x60(%r12) + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 85 c9 testq %rcx, %rcx + // 1e: 74 0c je 0x2c <_JIT_ENTRY+0x2c> + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x4c, 0x24, + 0x60, 0x49, 0x89, 0x44, 0x24, 0x60, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_3( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_3.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 4c 24 68 movq 0x68(%r12), %rcx + // 11: 49 89 44 24 68 movq %rax, 0x68(%r12) + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 85 c9 testq %rcx, %rcx + // 1e: 74 0c je 0x2c <_JIT_ENTRY+0x2c> + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x4c, 0x24, + 0x68, 0x49, 0x89, 0x44, 0x24, 0x68, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_4( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_4.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 4c 24 70 movq 0x70(%r12), %rcx + // 11: 49 89 44 24 70 movq %rax, 0x70(%r12) + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 85 c9 testq %rcx, %rcx + // 1e: 74 0c je 0x2c <_JIT_ENTRY+0x2c> + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x4c, 0x24, + 0x70, 0x49, 0x89, 0x44, 0x24, 0x70, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_5( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_5.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 4c 24 78 movq 0x78(%r12), %rcx + // 11: 49 89 44 24 78 movq %rax, 0x78(%r12) + // 16: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 1b: 48 85 c9 testq %rcx, %rcx + // 1e: 74 0c je 0x2c <_JIT_ENTRY+0x2c> + // 20: 8b 01 movl (%rcx), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 06 js 0x2c <_JIT_ENTRY+0x2c> + // 26: ff c8 decl %eax + // 28: 89 01 movl %eax, (%rcx) + // 2a: 74 19 je 0x45 <_JIT_ENTRY+0x45> + // 2c: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 31: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3a: 48 83 c4 28 addq $0x28, %rsp + // 3e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x45 <_JIT_ENTRY+0x45> + // 0000000000000041: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 50: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 59: 48 83 c4 28 addq $0x28, %rsp + // 5d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[93] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x4c, 0x24, + 0x78, 0x49, 0x89, 0x44, 0x24, 0x78, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x41, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_6( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_6.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 8c 24 80 00 00 00 movq 0x80(%r12), %rcx + // 14: 49 89 84 24 80 00 00 00 movq %rax, 0x80(%r12) + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 48 85 c9 testq %rcx, %rcx + // 24: 74 0c je 0x32 <_JIT_ENTRY+0x32> + // 26: 8b 01 movl (%rcx), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 06 js 0x32 <_JIT_ENTRY+0x32> + // 2c: ff c8 decl %eax + // 2e: 89 01 movl %eax, (%rcx) + // 30: 74 19 je 0x4b <_JIT_ENTRY+0x4b> + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4b: ff 15 00 00 00 00 callq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 51: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 56: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5f: 48 83 c4 28 addq $0x28, %rsp + // 63: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[99] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x8c, 0x24, + 0x80, 0x00, 0x00, 0x00, 0x49, 0x89, 0x84, 0x24, + 0x80, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, + 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x4); +} + +void +emit__STORE_FAST_7( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_FAST_7.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 45 f8 movq -0x8(%r13), %rax + // 8: 49 83 c5 f8 addq $-0x8, %r13 + // c: 49 8b 8c 24 88 00 00 00 movq 0x88(%r12), %rcx + // 14: 49 89 84 24 88 00 00 00 movq %rax, 0x88(%r12) + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 48 85 c9 testq %rcx, %rcx + // 24: 74 0c je 0x32 <_JIT_ENTRY+0x32> + // 26: 8b 01 movl (%rcx), %eax + // 28: 85 c0 testl %eax, %eax + // 2a: 78 06 js 0x32 <_JIT_ENTRY+0x32> + // 2c: ff c8 decl %eax + // 2e: 89 01 movl %eax, (%rcx) + // 30: 74 19 je 0x4b <_JIT_ENTRY+0x4b> + // 32: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 37: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4b: ff 15 00 00 00 00 callq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 51: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 56: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 5f: 48 83 c4 28 addq $0x28, %rsp + // 63: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6a <_JIT_ENTRY+0x6a> + // 0000000000000066: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[99] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x45, 0xf8, + 0x49, 0x83, 0xc5, 0xf8, 0x49, 0x8b, 0x8c, 0x24, + 0x88, 0x00, 0x00, 0x00, 0x49, 0x89, 0x84, 0x24, + 0x88, 0x00, 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0c, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, + 0x74, 0x19, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, + }; + // 0: CONTINUE + // 8: &_Py_Dealloc+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x4); +} + +void +emit__STORE_GLOBAL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_GLOBAL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 49 8b 4c 24 18 movq 0x18(%r12), %rcx + // 11: 48 8b 40 20 movq 0x20(%rax), %rax + // 15: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1c: 48 8b 54 d0 18 movq 0x18(%rax,%rdx,8), %rdx + // 21: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 26: 49 89 f0 movq %rsi, %r8 + // 29: ff 15 00 00 00 00 callq *(%rip) # 0x2f <_JIT_ENTRY+0x2f> + // 000000000000002b: IMAGE_REL_AMD64_REL32 __imp_PyDict_SetItem + // 2f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 34: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 3d: 8b 0e movl (%rsi), %ecx + // 3f: 85 c9 testl %ecx, %ecx + // 41: 78 06 js 0x49 <_JIT_ENTRY+0x49> + // 43: ff c9 decl %ecx + // 45: 89 0e movl %ecx, (%rsi) + // 47: 74 13 je 0x5c <_JIT_ENTRY+0x5c> + // 49: 49 83 c5 f8 addq $-0x8, %r13 + // 4d: 48 83 c4 28 addq $0x28, %rsp + // 51: 85 c0 testl %eax, %eax + // 53: 74 20 je 0x75 <_JIT_ENTRY+0x75> + // 55: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 5c: 48 89 f1 movq %rsi, %rcx + // 5f: 89 c6 movl %eax, %esi + // 61: ff 15 00 00 00 00 callq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 67: 89 f0 movl %esi, %eax + // 69: 49 83 c5 f8 addq $-0x8, %r13 + // 6d: 48 83 c4 28 addq $0x28, %rsp + // 71: 85 c0 testl %eax, %eax + // 73: 75 e0 jne 0x55 <_JIT_ENTRY+0x55> + // 75: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7c <_JIT_ENTRY+0x7c> + // 0000000000000078: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[117] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x4c, 0x24, + 0x18, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x54, 0xd0, + 0x18, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x49, 0x89, + 0xf0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, + 0x13, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x85, 0xc0, 0x74, 0x20, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x89, + 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, + 0xf0, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x85, 0xc0, 0x75, 0xe0, + }; + // 0: OPARG + // 8: &PyDict_SetItem+0x0 + // 10: ERROR_TARGET + // 18: &_Py_Dealloc+0x0 + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x2b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x14); +} + +void +emit__STORE_NAME( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_NAME.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 49 8b 04 24 movq (%r12), %rax + // c: 49 8b 4c 24 28 movq 0x28(%r12), %rcx + // 11: 48 8b 40 20 movq 0x20(%rax), %rax + // 15: 0f b7 15 00 00 00 00 movzwl (%rip), %edx # 0x1c <_JIT_ENTRY+0x1c> + // 0000000000000018: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 1c: 4c 8b 4c d0 18 movq 0x18(%rax,%rdx,8), %r9 + // 21: 48 85 c9 testq %rcx, %rcx + // 24: 74 20 je 0x46 <_JIT_ENTRY+0x46> + // 26: 48 8b 41 08 movq 0x8(%rcx), %rax + // 2a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2f: 4c 89 ca movq %r9, %rdx + // 32: 49 89 f0 movq %rsi, %r8 + // 35: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x3c <_JIT_ENTRY+0x3c> + // 0000000000000038: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 3c: 74 50 je 0x8e <_JIT_ENTRY+0x8e> + // 3e: ff 15 00 00 00 00 callq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: IMAGE_REL_AMD64_REL32 __imp_PyObject_SetItem + // 44: eb 4e jmp 0x94 <_JIT_ENTRY+0x94> + // 46: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 4b: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x52 <_JIT_ENTRY+0x52> + // 000000000000004e: IMAGE_REL_AMD64_REL32 __imp_PyExc_SystemError + // 52: 48 8b 10 movq (%rax), %rdx + // 55: 4c 8d 05 00 00 00 00 leaq (%rip), %r8 # 0x5c <_JIT_ENTRY+0x5c> + // 0000000000000058: IMAGE_REL_AMD64_REL32 ??_C@_0CA@PHPKHPGD@no?5locals?5found?5when?5storing?5?$CFR?$AA@ + // 5c: 4c 89 f1 movq %r14, %rcx + // 5f: ff 15 00 00 00 00 callq *(%rip) # 0x65 <_JIT_ENTRY+0x65> + // 0000000000000061: IMAGE_REL_AMD64_REL32 __imp__PyErr_Format + // 65: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 73: 8b 06 movl (%rsi), %eax + // 75: 85 c0 testl %eax, %eax + // 77: 78 06 js 0x7f <_JIT_ENTRY+0x7f> + // 79: ff c8 decl %eax + // 7b: 89 06 movl %eax, (%rsi) + // 7d: 74 62 je 0xe1 <_JIT_ENTRY+0xe1> + // 7f: 49 83 c5 f8 addq $-0x8, %r13 + // 83: 48 83 c4 28 addq $0x28, %rsp + // 87: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 8e: ff 15 00 00 00 00 callq *(%rip) # 0x94 <_JIT_ENTRY+0x94> + // 0000000000000090: IMAGE_REL_AMD64_REL32 __imp_PyDict_SetItem + // 94: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 99: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // a2: 8b 0e movl (%rsi), %ecx + // a4: 85 c9 testl %ecx, %ecx + // a6: 78 06 js 0xae <_JIT_ENTRY+0xae> + // a8: ff c9 decl %ecx + // aa: 89 0e movl %ecx, (%rsi) + // ac: 74 13 je 0xc1 <_JIT_ENTRY+0xc1> + // ae: 49 83 c5 f8 addq $-0x8, %r13 + // b2: 48 83 c4 28 addq $0x28, %rsp + // b6: 85 c0 testl %eax, %eax + // b8: 74 20 je 0xda <_JIT_ENTRY+0xda> + // ba: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc1 <_JIT_ENTRY+0xc1> + // 00000000000000bd: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // c1: 48 89 f1 movq %rsi, %rcx + // c4: 89 c6 movl %eax, %esi + // c6: ff 15 00 00 00 00 callq *(%rip) # 0xcc <_JIT_ENTRY+0xcc> + // 00000000000000c8: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // cc: 89 f0 movl %esi, %eax + // ce: 49 83 c5 f8 addq $-0x8, %r13 + // d2: 48 83 c4 28 addq $0x28, %rsp + // d6: 85 c0 testl %eax, %eax + // d8: 75 e0 jne 0xba <_JIT_ENTRY+0xba> + // da: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe1 <_JIT_ENTRY+0xe1> + // 00000000000000dd: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // e1: 48 89 f1 movq %rsi, %rcx + // e4: ff 15 00 00 00 00 callq *(%rip) # 0xea <_JIT_ENTRY+0xea> + // 00000000000000e6: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // ea: 49 83 c5 f8 addq $-0x8, %r13 + // ee: 48 83 c4 28 addq $0x28, %rsp + // f2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf9 <_JIT_ENTRY+0xf9> + // 00000000000000f5: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[249] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x49, 0x8b, 0x04, 0x24, 0x49, 0x8b, 0x4c, 0x24, + 0x28, 0x48, 0x8b, 0x40, 0x20, 0x0f, 0xb7, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0x4c, 0xd0, + 0x18, 0x48, 0x85, 0xc9, 0x74, 0x20, 0x48, 0x8b, + 0x41, 0x08, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, + 0x89, 0xca, 0x49, 0x89, 0xf0, 0x48, 0x3b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x50, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0xeb, 0x4e, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x8b, 0x10, 0x4c, 0x8d, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x89, 0xf1, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, 0x78, + 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x62, 0x49, + 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, + 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x06, + 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x13, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, + 0x74, 0x20, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x49, 0x83, + 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x85, 0xc0, + 0x75, 0xe0, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, + }; + // 0: 'no locals found when storing %R\x00' + // 20: OPARG + // 28: &PyDict_Type+0x0 + // 30: &PyObject_SetItem+0x0 + // 38: &PyExc_SystemError+0x0 + // 40: &_PyErr_Format+0x0 + // 48: ERROR_TARGET + // 50: &PyDict_SetItem+0x0 + // 58: &_Py_Dealloc+0x0 + // 60: CONTINUE + const unsigned char data_body[104] = { + 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x20, instruction->oparg); + patch_64(data + 0x28, (uintptr_t)&PyDict_Type); + patch_64(data + 0x30, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x38, (uintptr_t)&PyExc_SystemError); + patch_64(data + 0x40, (uintptr_t)&_PyErr_Format); + patch_64(data + 0x48, state->instruction_starts[instruction->error_target]); + patch_64(data + 0x50, (uintptr_t)&PyDict_SetItem); + patch_64(data + 0x58, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x60, (uintptr_t)code + sizeof(code_body)); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x18, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x2c); + patch_x86_64_32rx(code + 0x4e, (uintptr_t)data + 0x34); + patch_x86_64_32rx(code + 0x58, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x61, (uintptr_t)data + 0x3c); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0x90, (uintptr_t)data + 0x4c); + patch_x86_64_32rx(code + 0xbd, (uintptr_t)data + 0x44); + patch_x86_64_32rx(code + 0xc8, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xdd, (uintptr_t)data + 0x5c); + patch_x86_64_32rx(code + 0xe6, (uintptr_t)data + 0x54); + patch_x86_64_32rx(code + 0xf5, (uintptr_t)data + 0x44); +} + +void +emit__STORE_SLICE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SLICE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 8: 49 8b 4d f0 movq -0x10(%r13), %rcx + // c: 49 8b 7d e0 movq -0x20(%r13), %rdi + // 10: 49 8b 75 e8 movq -0x18(%r13), %rsi + // 14: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 19: ff 15 00 00 00 00 callq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__PyBuildSlice_ConsumeRefs + // 1f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 24: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 2d: 48 85 c0 testq %rax, %rax + // 30: 74 53 je 0x85 <_JIT_ENTRY+0x85> + // 32: 48 89 c3 movq %rax, %rbx + // 35: 49 83 c5 f0 addq $-0x10, %r13 + // 39: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 3e: 48 89 f1 movq %rsi, %rcx + // 41: 48 89 c2 movq %rax, %rdx + // 44: 49 89 f8 movq %rdi, %r8 + // 47: ff 15 00 00 00 00 callq *(%rip) # 0x4d <_JIT_ENTRY+0x4d> + // 0000000000000049: IMAGE_REL_AMD64_REL32 __imp_PyObject_SetItem + // 4d: 8b 0b movl (%rbx), %ecx + // 4f: 85 c9 testl %ecx, %ecx + // 51: 78 13 js 0x66 <_JIT_ENTRY+0x66> + // 53: ff c9 decl %ecx + // 55: 89 0b movl %ecx, (%rbx) + // 57: 75 0d jne 0x66 <_JIT_ENTRY+0x66> + // 59: 48 89 d9 movq %rbx, %rcx + // 5c: 89 c3 movl %eax, %ebx + // 5e: ff 15 00 00 00 00 callq *(%rip) # 0x64 <_JIT_ENTRY+0x64> + // 0000000000000060: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 64: 89 d8 movl %ebx, %eax + // 66: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 6b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 74: 49 83 c5 10 addq $0x10, %r13 + // 78: 85 c0 testl %eax, %eax + // 7a: 0f 94 c3 sete %bl + // 7d: 8b 07 movl (%rdi), %eax + // 7f: 85 c0 testl %eax, %eax + // 81: 79 0a jns 0x8d <_JIT_ENTRY+0x8d> + // 83: eb 17 jmp 0x9c <_JIT_ENTRY+0x9c> + // 85: 31 db xorl %ebx, %ebx + // 87: 8b 07 movl (%rdi), %eax + // 89: 85 c0 testl %eax, %eax + // 8b: 78 0f js 0x9c <_JIT_ENTRY+0x9c> + // 8d: ff c8 decl %eax + // 8f: 89 07 movl %eax, (%rdi) + // 91: 75 09 jne 0x9c <_JIT_ENTRY+0x9c> + // 93: 48 89 f9 movq %rdi, %rcx + // 96: ff 15 00 00 00 00 callq *(%rip) # 0x9c <_JIT_ENTRY+0x9c> + // 0000000000000098: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 9c: 8b 06 movl (%rsi), %eax + // 9e: 85 c0 testl %eax, %eax + // a0: 78 06 js 0xa8 <_JIT_ENTRY+0xa8> + // a2: ff c8 decl %eax + // a4: 89 06 movl %eax, (%rsi) + // a6: 74 13 je 0xbb <_JIT_ENTRY+0xbb> + // a8: 49 83 c5 e0 addq $-0x20, %r13 + // ac: 48 83 c4 28 addq $0x28, %rsp + // b0: 84 db testb %bl, %bl + // b2: 74 1c je 0xd0 <_JIT_ENTRY+0xd0> + // b4: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xbb <_JIT_ENTRY+0xbb> + // 00000000000000b7: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // bb: 48 89 f1 movq %rsi, %rcx + // be: ff 15 00 00 00 00 callq *(%rip) # 0xc4 <_JIT_ENTRY+0xc4> + // 00000000000000c0: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c4: 49 83 c5 e0 addq $-0x20, %r13 + // c8: 48 83 c4 28 addq $0x28, %rsp + // cc: 84 db testb %bl, %bl + // ce: 75 e4 jne 0xb4 <_JIT_ENTRY+0xb4> + // d0: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd7 <_JIT_ENTRY+0xd7> + // 00000000000000d3: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[215] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x55, 0xf8, + 0x49, 0x8b, 0x4d, 0xf0, 0x49, 0x8b, 0x7d, 0xe0, + 0x49, 0x8b, 0x75, 0xe8, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x53, 0x48, 0x89, 0xc3, 0x49, 0x83, 0xc5, + 0xf0, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, + 0xf1, 0x48, 0x89, 0xc2, 0x49, 0x89, 0xf8, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0b, 0x85, + 0xc9, 0x78, 0x13, 0xff, 0xc9, 0x89, 0x0b, 0x75, + 0x0d, 0x48, 0x89, 0xd9, 0x89, 0xc3, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xd8, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0x10, + 0x85, 0xc0, 0x0f, 0x94, 0xc3, 0x8b, 0x07, 0x85, + 0xc0, 0x79, 0x0a, 0xeb, 0x17, 0x31, 0xdb, 0x8b, + 0x07, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, + 0x07, 0x75, 0x09, 0x48, 0x89, 0xf9, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x06, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x06, 0x74, 0x13, + 0x49, 0x83, 0xc5, 0xe0, 0x48, 0x83, 0xc4, 0x28, + 0x84, 0xdb, 0x74, 0x1c, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, 0xc5, 0xe0, + 0x48, 0x83, 0xc4, 0x28, 0x84, 0xdb, 0x75, 0xe4, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &_PyBuildSlice_ConsumeRefs+0x0 + // 8: &PyObject_SetItem+0x0 + // 10: &_Py_Dealloc+0x0 + // 18: CONTINUE + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_PyBuildSlice_ConsumeRefs); + patch_64(data + 0x8, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x1b, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x49, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x60, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x98, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xb7, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc0, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0xd3, (uintptr_t)data + 0x1c); +} + +void +emit__STORE_SUBSCR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 8b 7d e8 movq -0x18(%r13), %r15 + // c: 49 8b 5d f0 movq -0x10(%r13), %rbx + // 10: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 15: 48 89 d9 movq %rbx, %rcx + // 18: 48 89 f2 movq %rsi, %rdx + // 1b: 4d 89 f8 movq %r15, %r8 + // 1e: ff 15 00 00 00 00 callq *(%rip) # 0x24 <_JIT_ENTRY+0x24> + // 0000000000000020: IMAGE_REL_AMD64_REL32 __imp_PyObject_SetItem + // 24: 89 c7 movl %eax, %edi + // 26: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 2b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 34: 41 8b 07 movl (%r15), %eax + // 37: 85 c0 testl %eax, %eax + // 39: 78 10 js 0x4b <_JIT_ENTRY+0x4b> + // 3b: ff c8 decl %eax + // 3d: 41 89 07 movl %eax, (%r15) + // 40: 75 09 jne 0x4b <_JIT_ENTRY+0x4b> + // 42: 4c 89 f9 movq %r15, %rcx + // 45: ff 15 00 00 00 00 callq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4b: 8b 03 movl (%rbx), %eax + // 4d: 85 c0 testl %eax, %eax + // 4f: 78 0f js 0x60 <_JIT_ENTRY+0x60> + // 51: ff c8 decl %eax + // 53: 89 03 movl %eax, (%rbx) + // 55: 75 09 jne 0x60 <_JIT_ENTRY+0x60> + // 57: 48 89 d9 movq %rbx, %rcx + // 5a: ff 15 00 00 00 00 callq *(%rip) # 0x60 <_JIT_ENTRY+0x60> + // 000000000000005c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 60: 8b 06 movl (%rsi), %eax + // 62: 85 c0 testl %eax, %eax + // 64: 78 06 js 0x6c <_JIT_ENTRY+0x6c> + // 66: ff c8 decl %eax + // 68: 89 06 movl %eax, (%rsi) + // 6a: 74 13 je 0x7f <_JIT_ENTRY+0x7f> + // 6c: 49 83 c5 e8 addq $-0x18, %r13 + // 70: 48 83 c4 28 addq $0x28, %rsp + // 74: 85 ff testl %edi, %edi + // 76: 74 1c je 0x94 <_JIT_ENTRY+0x94> + // 78: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7f <_JIT_ENTRY+0x7f> + // 000000000000007b: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 7f: 48 89 f1 movq %rsi, %rcx + // 82: ff 15 00 00 00 00 callq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 88: 49 83 c5 e8 addq $-0x18, %r13 + // 8c: 48 83 c4 28 addq $0x28, %rsp + // 90: 85 ff testl %edi, %edi + // 92: 75 e4 jne 0x78 <_JIT_ENTRY+0x78> + // 94: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9b <_JIT_ENTRY+0x9b> + // 0000000000000097: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[148] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x8b, 0x7d, 0xe8, 0x49, 0x8b, 0x5d, 0xf0, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xd9, + 0x48, 0x89, 0xf2, 0x4d, 0x89, 0xf8, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x89, 0xc7, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x8b, 0x07, 0x85, + 0xc0, 0x78, 0x10, 0xff, 0xc8, 0x41, 0x89, 0x07, + 0x75, 0x09, 0x4c, 0x89, 0xf9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x8b, 0x03, 0x85, 0xc0, 0x78, + 0x0f, 0xff, 0xc8, 0x89, 0x03, 0x75, 0x09, 0x48, + 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x06, 0x74, 0x13, 0x49, 0x83, 0xc5, 0xe8, + 0x48, 0x83, 0xc4, 0x28, 0x85, 0xff, 0x74, 0x1c, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf1, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x83, 0xc5, 0xe8, 0x48, 0x83, 0xc4, 0x28, + 0x85, 0xff, 0x75, 0xe4, + }; + // 0: &PyObject_SetItem+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: ERROR_TARGET + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_SetItem); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x20, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x7b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0x4); +} + +void +emit__STORE_SUBSCR_DICT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_DICT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 8: 48 8b 46 08 movq 0x8(%rsi), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyDict_Type + // 13: 74 0b je 0x20 <_JIT_ENTRY+0x20> + // 15: 48 83 c4 28 addq $0x28, %rsp + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 20: 4d 8b 45 e8 movq -0x18(%r13), %r8 + // 24: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 28: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 2d: 48 89 f1 movq %rsi, %rcx + // 30: ff 15 00 00 00 00 callq *(%rip) # 0x36 <_JIT_ENTRY+0x36> + // 0000000000000032: IMAGE_REL_AMD64_REL32 __imp__PyDict_SetItem_Take2 + // 36: 49 83 44 24 40 e8 addq $-0x18, 0x40(%r12) + // 3c: 8b 0e movl (%rsi), %ecx + // 3e: 85 c9 testl %ecx, %ecx + // 40: 78 13 js 0x55 <_JIT_ENTRY+0x55> + // 42: ff c9 decl %ecx + // 44: 89 0e movl %ecx, (%rsi) + // 46: 75 0d jne 0x55 <_JIT_ENTRY+0x55> + // 48: 48 89 f1 movq %rsi, %rcx + // 4b: 89 c6 movl %eax, %esi + // 4d: ff 15 00 00 00 00 callq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 53: 89 f0 movl %esi, %eax + // 55: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 5a: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 63: 48 83 c4 28 addq $0x28, %rsp + // 67: 85 c0 testl %eax, %eax + // 69: 74 07 je 0x72 <_JIT_ENTRY+0x72> + // 6b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x72 <_JIT_ENTRY+0x72> + // 000000000000006e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + // 72: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x79 <_JIT_ENTRY+0x79> + // 0000000000000075: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[114] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf0, + 0x48, 0x8b, 0x46, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8b, 0x45, 0xe8, 0x49, 0x8b, 0x55, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x83, + 0x44, 0x24, 0x40, 0xe8, 0x8b, 0x0e, 0x85, 0xc9, + 0x78, 0x13, 0xff, 0xc9, 0x89, 0x0e, 0x75, 0x0d, + 0x48, 0x89, 0xf1, 0x89, 0xc6, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x89, 0xf0, 0x4d, 0x8b, 0x6c, + 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x85, + 0xc0, 0x74, 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &PyDict_Type+0x0 + // 8: JUMP_TARGET + // 10: &_PyDict_SetItem_Take2+0x0 + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyDict_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_PyDict_SetItem_Take2); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x32, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x6e, (uintptr_t)data + 0x1c); +} + +void +emit__STORE_SUBSCR_LIST_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _STORE_SUBSCR_LIST_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 5d f8 movq -0x8(%r13), %rbx + // 8: 48 8b 43 08 movq 0x8(%rbx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // 13: 0f 85 c9 00 00 00 jne 0xe2 <_JIT_ENTRY+0xe2> + // 19: 49 8b 75 f0 movq -0x10(%r13), %rsi + // 1d: 48 8b 46 08 movq 0x8(%rsi), %rax + // 21: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x28 <_JIT_ENTRY+0x28> + // 0000000000000024: IMAGE_REL_AMD64_REL32 __imp_PyList_Type + // 28: 0f 85 b4 00 00 00 jne 0xe2 <_JIT_ENTRY+0xe2> + // 2e: 48 8b 43 10 movq 0x10(%rbx), %rax + // 32: 48 83 e0 fb andq $-0x5, %rax + // 36: 48 83 f8 09 cmpq $0x9, %rax + // 3a: 0f 83 a2 00 00 00 jae 0xe2 <_JIT_ENTRY+0xe2> + // 40: 8b 43 18 movl 0x18(%rbx), %eax + // 43: 48 39 46 10 cmpq %rax, 0x10(%rsi) + // 47: 0f 8e 95 00 00 00 jle 0xe2 <_JIT_ENTRY+0xe2> + // 4d: 49 8b 4d e8 movq -0x18(%r13), %rcx + // 51: 49 83 c5 e8 addq $-0x18, %r13 + // 55: 48 8b 56 18 movq 0x18(%rsi), %rdx + // 59: 48 8b 3c c2 movq (%rdx,%rax,8), %rdi + // 5d: 48 89 0c c2 movq %rcx, (%rdx,%rax,8) + // 61: 8b 03 movl (%rbx), %eax + // 63: 85 c0 testl %eax, %eax + // 65: 78 33 js 0x9a <_JIT_ENTRY+0x9a> + // 67: ff c8 decl %eax + // 69: 89 03 movl %eax, (%rbx) + // 6b: 75 2d jne 0x9a <_JIT_ENTRY+0x9a> + // 6d: 48 8b 0d 00 00 00 00 movq (%rip), %rcx # 0x74 <_JIT_ENTRY+0x74> + // 0000000000000070: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 74: 48 8b 81 60 25 00 00 movq 0x2560(%rcx), %rax + // 7b: 48 85 c0 testq %rax, %rax + // 7e: 74 11 je 0x91 <_JIT_ENTRY+0x91> + // 80: 4c 8b 81 68 25 00 00 movq 0x2568(%rcx), %r8 + // 87: 48 89 d9 movq %rbx, %rcx + // 8a: ba 01 00 00 00 movl $0x1, %edx + // 8f: ff d0 callq *%rax + // 91: 48 89 d9 movq %rbx, %rcx + // 94: ff 15 00 00 00 00 callq *(%rip) # 0x9a <_JIT_ENTRY+0x9a> + // 0000000000000096: IMAGE_REL_AMD64_REL32 __imp__PyLong_ExactDealloc + // 9a: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 9f: 8b 06 movl (%rsi), %eax + // a1: 85 c0 testl %eax, %eax + // a3: 78 0f js 0xb4 <_JIT_ENTRY+0xb4> + // a5: ff c8 decl %eax + // a7: 89 06 movl %eax, (%rsi) + // a9: 75 09 jne 0xb4 <_JIT_ENTRY+0xb4> + // ab: 48 89 f1 movq %rsi, %rcx + // ae: ff 15 00 00 00 00 callq *(%rip) # 0xb4 <_JIT_ENTRY+0xb4> + // 00000000000000b0: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // b4: 8b 07 movl (%rdi), %eax + // b6: 85 c0 testl %eax, %eax + // b8: 78 0f js 0xc9 <_JIT_ENTRY+0xc9> + // ba: ff c8 decl %eax + // bc: 89 07 movl %eax, (%rdi) + // be: 75 09 jne 0xc9 <_JIT_ENTRY+0xc9> + // c0: 48 89 f9 movq %rdi, %rcx + // c3: ff 15 00 00 00 00 callq *(%rip) # 0xc9 <_JIT_ENTRY+0xc9> + // 00000000000000c5: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // c9: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // ce: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // d7: 48 83 c4 28 addq $0x28, %rsp + // db: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xe2 <_JIT_ENTRY+0xe2> + // 00000000000000de: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // e2: 48 83 c4 28 addq $0x28, %rsp + // e6: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xed <_JIT_ENTRY+0xed> + // 00000000000000e9: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[237] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x5d, 0xf8, + 0x48, 0x8b, 0x43, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x85, 0xc9, 0x00, 0x00, + 0x00, 0x49, 0x8b, 0x75, 0xf0, 0x48, 0x8b, 0x46, + 0x08, 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x85, 0xb4, 0x00, 0x00, 0x00, 0x48, 0x8b, + 0x43, 0x10, 0x48, 0x83, 0xe0, 0xfb, 0x48, 0x83, + 0xf8, 0x09, 0x0f, 0x83, 0xa2, 0x00, 0x00, 0x00, + 0x8b, 0x43, 0x18, 0x48, 0x39, 0x46, 0x10, 0x0f, + 0x8e, 0x95, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x4d, + 0xe8, 0x49, 0x83, 0xc5, 0xe8, 0x48, 0x8b, 0x56, + 0x18, 0x48, 0x8b, 0x3c, 0xc2, 0x48, 0x89, 0x0c, + 0xc2, 0x8b, 0x03, 0x85, 0xc0, 0x78, 0x33, 0xff, + 0xc8, 0x89, 0x03, 0x75, 0x2d, 0x48, 0x8b, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x81, 0x60, + 0x25, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x11, + 0x4c, 0x8b, 0x81, 0x68, 0x25, 0x00, 0x00, 0x48, + 0x89, 0xd9, 0xba, 0x01, 0x00, 0x00, 0x00, 0xff, + 0xd0, 0x48, 0x89, 0xd9, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x06, 0x85, 0xc0, 0x78, 0x0f, 0xff, 0xc8, 0x89, + 0x06, 0x75, 0x09, 0x48, 0x89, 0xf1, 0xff, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x07, 0x85, 0xc0, + 0x78, 0x0f, 0xff, 0xc8, 0x89, 0x07, 0x75, 0x09, + 0x48, 0x89, 0xf9, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, + 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, + 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyLong_Type+0x0 + // 8: &PyList_Type+0x0 + // 10: &_PyRuntime+0x0 + // 18: &_PyLong_ExactDealloc+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: CONTINUE + // 30: JUMP_TARGET + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, (uintptr_t)&PyList_Type); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_PyLong_ExactDealloc); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x30, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x24, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x70, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x96, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xb0, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xde, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0xe9, (uintptr_t)data + 0x2c); +} + +void +emit__SWAP( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _SWAP.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 7: c1 e0 03 shll $0x3, %eax + // a: 4c 89 e9 movq %r13, %rcx + // d: 48 29 c1 subq %rax, %rcx + // 10: 48 8b 01 movq (%rcx), %rax + // 13: 49 8b 55 f8 movq -0x8(%r13), %rdx + // 17: 48 89 11 movq %rdx, (%rcx) + // 1a: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1e: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x25 <_JIT_ENTRY+0x25> + // 0000000000000021: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[30] = { + 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0xe0, 0x03, 0x4c, 0x89, 0xe9, 0x48, 0x29, 0xc1, + 0x48, 0x8b, 0x01, 0x49, 0x8b, 0x55, 0xf8, 0x48, + 0x89, 0x11, 0x49, 0x89, 0x45, 0xf8, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); +} + +void +emit__TIER2_RESUME_CHECK( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TIER2_RESUME_CHECK.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 46 18 movq 0x18(%r14), %rax + // 4: 84 c0 testb %al, %al + // 6: 74 07 je 0xf <_JIT_ENTRY+0xf> + // 8: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[15] = { + 0x49, 0x8b, 0x46, 0x18, 0x84, 0xc0, 0x74, 0x07, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: JUMP_TARGET + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); +} + +void +emit__TO_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 f1 movq %rsi, %rcx + // 10: ff 15 00 00 00 00 callq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyObject_IsTrue + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0e movl (%rsi), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0e movl %ecx, (%rsi) + // 2e: 74 32 je 0x62 <_JIT_ENTRY+0x62> + // 30: 85 c0 testl %eax, %eax + // 32: 78 3f js 0x73 <_JIT_ENTRY+0x73> + // 34: 75 16 jne 0x4c <_JIT_ENTRY+0x4c> + // 36: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x3d <_JIT_ENTRY+0x3d> + // 0000000000000039: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 3d: 49 89 45 f8 movq %rax, -0x8(%r13) + // 41: 48 83 c4 28 addq $0x28, %rsp + // 45: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4c <_JIT_ENTRY+0x4c> + // 0000000000000048: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4c: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 53: 49 89 45 f8 movq %rax, -0x8(%r13) + // 57: 48 83 c4 28 addq $0x28, %rsp + // 5b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x62 <_JIT_ENTRY+0x62> + // 000000000000005e: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 62: 48 89 f1 movq %rsi, %rcx + // 65: 89 c6 movl %eax, %esi + // 67: ff 15 00 00 00 00 callq *(%rip) # 0x6d <_JIT_ENTRY+0x6d> + // 0000000000000069: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6d: 89 f0 movl %esi, %eax + // 6f: 85 c0 testl %eax, %eax + // 71: 79 c1 jns 0x34 <_JIT_ENTRY+0x34> + // 73: 49 83 c5 f8 addq $-0x8, %r13 + // 77: 48 83 c4 28 addq $0x28, %rsp + // 7b: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x82 <_JIT_ENTRY+0x82> + // 000000000000007e: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[130] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x32, + 0x85, 0xc0, 0x78, 0x3f, 0x75, 0x16, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x89, 0xf1, 0x89, 0xc6, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, 0x85, + 0xc0, 0x79, 0xc1, 0x49, 0x83, 0xc5, 0xf8, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, + }; + // 0: &PyObject_IsTrue+0x0 + // 8: &_Py_FalseStruct+0x0 + // 10: CONTINUE + // 18: &_Py_TrueStruct+0x0 + // 20: &_Py_Dealloc+0x0 + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyObject_IsTrue); + patch_64(data + 0x8, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x39, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x48, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x5e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x69, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x7e, (uintptr_t)data + 0x24); +} + +void +emit__TO_BOOL_BOOL( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_BOOL.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 8b 40 08 movq 0x8(%rax), %rax + // 8: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xf <_JIT_ENTRY+0xf> + // 000000000000000b: IMAGE_REL_AMD64_REL32 __imp_PyBool_Type + // f: 74 07 je 0x18 <_JIT_ENTRY+0x18> + // 11: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x18 <_JIT_ENTRY+0x18> + // 0000000000000014: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x40, 0x08, + 0x48, 0x3b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x07, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyBool_Type+0x0 + // 8: JUMP_TARGET + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyBool_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xb, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x14, (uintptr_t)data + 0x4); +} + +void +emit__TO_BOOL_INT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_INT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 41 08 movq 0x8(%rcx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyLong_Type + // 13: 74 0b je 0x20 <_JIT_ENTRY+0x20> + // 15: 48 83 c4 28 addq $0x28, %rsp + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 20: 8b 41 10 movl 0x10(%rcx), %eax + // 23: 83 e0 03 andl $0x3, %eax + // 26: 83 f8 01 cmpl $0x1, %eax + // 29: 75 16 jne 0x41 <_JIT_ENTRY+0x41> + // 2b: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0x32 <_JIT_ENTRY+0x32> + // 000000000000002e: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 32: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 36: 48 83 c4 28 addq $0x28, %rsp + // 3a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x41 <_JIT_ENTRY+0x41> + // 000000000000003d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 41: 8b 01 movl (%rcx), %eax + // 43: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 4a: 85 c0 testl %eax, %eax + // 4c: 78 e4 js 0x32 <_JIT_ENTRY+0x32> + // 4e: ff c8 decl %eax + // 50: 89 01 movl %eax, (%rcx) + // 52: 75 de jne 0x32 <_JIT_ENTRY+0x32> + // 54: ff 15 00 00 00 00 callq *(%rip) # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 5a: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 5e: 48 83 c4 28 addq $0x28, %rsp + // 62: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[98] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x41, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x41, 0x10, 0x83, 0xe0, 0x03, 0x83, 0xf8, + 0x01, 0x75, 0x16, 0x48, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x8b, 0x01, 0x48, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0xe4, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0xde, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, + }; + // 0: &PyLong_Type+0x0 + // 8: JUMP_TARGET + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: &_Py_TrueStruct+0x0 + // 28: &_Py_Dealloc+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyLong_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x28, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x2e, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x3d, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x24); +} + +void +emit__TO_BOOL_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_LIST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 41 08 movq 0x8(%rcx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyList_Type + // 13: 74 0b je 0x20 <_JIT_ENTRY+0x20> + // 15: 48 83 c4 28 addq $0x28, %rsp + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 20: 48 8b 71 10 movq 0x10(%rcx), %rsi + // 24: 8b 01 movl (%rcx), %eax + // 26: 85 c0 testl %eax, %eax + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c8 decl %eax + // 2c: 89 01 movl %eax, (%rcx) + // 2e: 74 1b je 0x4b <_JIT_ENTRY+0x4b> + // 30: 48 85 f6 testq %rsi, %rsi + // 33: 75 21 jne 0x56 <_JIT_ENTRY+0x56> + // 35: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x3c <_JIT_ENTRY+0x3c> + // 0000000000000038: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 3c: 49 89 45 f8 movq %rax, -0x8(%r13) + // 40: 48 83 c4 28 addq $0x28, %rsp + // 44: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x4b <_JIT_ENTRY+0x4b> + // 0000000000000047: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 4b: ff 15 00 00 00 00 callq *(%rip) # 0x51 <_JIT_ENTRY+0x51> + // 000000000000004d: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 51: 48 85 f6 testq %rsi, %rsi + // 54: 74 df je 0x35 <_JIT_ENTRY+0x35> + // 56: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x5d <_JIT_ENTRY+0x5d> + // 0000000000000059: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 5d: 49 89 45 f8 movq %rax, -0x8(%r13) + // 61: 48 83 c4 28 addq $0x28, %rsp + // 65: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[101] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x41, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x71, 0x10, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, 0x74, 0x1b, + 0x48, 0x85, 0xf6, 0x75, 0x21, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xf6, 0x74, 0xdf, 0x48, 0x8b, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, + 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &PyList_Type+0x0 + // 8: JUMP_TARGET + // 10: &_Py_FalseStruct+0x0 + // 18: CONTINUE + // 20: &_Py_Dealloc+0x0 + // 28: &_Py_TrueStruct+0x0 + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyList_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x28, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x38, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x47, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x4d, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x59, (uintptr_t)data + 0x24); +} + +void +emit__TO_BOOL_NONE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_NONE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 45 f8 movq -0x8(%r13), %rax + // 4: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // b: 74 07 je 0x14 <_JIT_ENTRY+0x14> + // d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 14: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x1b <_JIT_ENTRY+0x1b> + // 0000000000000017: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 1b: 49 89 45 f8 movq %rax, -0x8(%r13) + // 1f: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x26 <_JIT_ENTRY+0x26> + // 0000000000000022: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[31] = { + 0x49, 0x8b, 0x45, 0xf8, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x07, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + }; + // 0: &_Py_NoneStruct+0x0 + // 8: JUMP_TARGET + // 10: &_Py_FalseStruct+0x0 + const unsigned char data_body[24] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_Py_FalseStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x17, (uintptr_t)data + 0xc); +} + +void +emit__TO_BOOL_STR( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _TO_BOOL_STR.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 41 08 movq 0x8(%rcx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyUnicode_Type + // 13: 74 0b je 0x20 <_JIT_ENTRY+0x20> + // 15: 48 83 c4 28 addq $0x28, %rsp + // 19: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 20: b8 08 87 00 00 movl $0x8708, %eax # imm = 0x8708 + // 25: 48 03 05 00 00 00 00 addq (%rip), %rax # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__PyRuntime + // 2c: 48 39 c1 cmpq %rax, %rcx + // 2f: 74 22 je 0x53 <_JIT_ENTRY+0x53> + // 31: 8b 01 movl (%rcx), %eax + // 33: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 06 js 0x44 <_JIT_ENTRY+0x44> + // 3e: ff c8 decl %eax + // 40: 89 01 movl %eax, (%rcx) + // 42: 74 25 je 0x69 <_JIT_ENTRY+0x69> + // 44: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 48: 48 83 c4 28 addq $0x28, %rsp + // 4c: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x53 <_JIT_ENTRY+0x53> + // 000000000000004f: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 53: 48 8b 35 00 00 00 00 movq (%rip), %rsi # 0x5a <_JIT_ENTRY+0x5a> + // 0000000000000056: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 5a: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 5e: 48 83 c4 28 addq $0x28, %rsp + // 62: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x69 <_JIT_ENTRY+0x69> + // 0000000000000065: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 69: ff 15 00 00 00 00 callq *(%rip) # 0x6f <_JIT_ENTRY+0x6f> + // 000000000000006b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 6f: 49 89 75 f8 movq %rsi, -0x8(%r13) + // 73: 48 83 c4 28 addq $0x28, %rsp + // 77: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x7e <_JIT_ENTRY+0x7e> + // 000000000000007a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[119] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x41, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x0b, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x08, 0x87, 0x00, 0x00, 0x48, 0x03, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x39, 0xc1, 0x74, + 0x22, 0x8b, 0x01, 0x48, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, + 0x89, 0x01, 0x74, 0x25, 0x49, 0x89, 0x75, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x8b, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x75, 0xf8, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x75, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &PyUnicode_Type+0x0 + // 8: JUMP_TARGET + // 10: &_PyRuntime+0x0 + // 18: &_Py_TrueStruct+0x0 + // 20: CONTINUE + // 28: &_Py_FalseStruct+0x0 + // 30: &_Py_Dealloc+0x0 + const unsigned char data_body[56] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyUnicode_Type); + patch_64(data + 0x8, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x10, (uintptr_t)&_PyRuntime); + patch_64(data + 0x18, (uintptr_t)&_Py_TrueStruct); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x30, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x4f, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x56, (uintptr_t)data + 0x24); + patch_x86_64_32rx(code + 0x65, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)data + 0x2c); +} + +void +emit__UNARY_INVERT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_INVERT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 f1 movq %rsi, %rcx + // 10: ff 15 00 00 00 00 callq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyNumber_Invert + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0e movl (%rsi), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0e movl %ecx, (%rsi) + // 2e: 74 14 je 0x44 <_JIT_ENTRY+0x44> + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 23 je 0x58 <_JIT_ENTRY+0x58> + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 48 83 c4 28 addq $0x28, %rsp + // 3d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 44: 48 89 f1 movq %rsi, %rcx + // 47: 48 89 c6 movq %rax, %rsi + // 4a: ff 15 00 00 00 00 callq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 50: 48 89 f0 movq %rsi, %rax + // 53: 48 85 c0 testq %rax, %rax + // 56: 75 dd jne 0x35 <_JIT_ENTRY+0x35> + // 58: 49 83 c5 f8 addq $-0x8, %r13 + // 5c: 48 83 c4 28 addq $0x28, %rsp + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[103] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x14, + 0x48, 0x85, 0xc0, 0x74, 0x23, 0x49, 0x89, 0x45, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x48, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf0, 0x48, 0x85, 0xc0, 0x75, 0xdd, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyNumber_Invert+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyNumber_Invert); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x14); +} + +void +emit__UNARY_NEGATIVE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NEGATIVE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 8: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // d: 48 89 f1 movq %rsi, %rcx + // 10: ff 15 00 00 00 00 callq *(%rip) # 0x16 <_JIT_ENTRY+0x16> + // 0000000000000012: IMAGE_REL_AMD64_REL32 __imp_PyNumber_Negative + // 16: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 1b: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 24: 8b 0e movl (%rsi), %ecx + // 26: 85 c9 testl %ecx, %ecx + // 28: 78 06 js 0x30 <_JIT_ENTRY+0x30> + // 2a: ff c9 decl %ecx + // 2c: 89 0e movl %ecx, (%rsi) + // 2e: 74 14 je 0x44 <_JIT_ENTRY+0x44> + // 30: 48 85 c0 testq %rax, %rax + // 33: 74 23 je 0x58 <_JIT_ENTRY+0x58> + // 35: 49 89 45 f8 movq %rax, -0x8(%r13) + // 39: 48 83 c4 28 addq $0x28, %rsp + // 3d: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x44 <_JIT_ENTRY+0x44> + // 0000000000000040: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 44: 48 89 f1 movq %rsi, %rcx + // 47: 48 89 c6 movq %rax, %rsi + // 4a: ff 15 00 00 00 00 callq *(%rip) # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 50: 48 89 f0 movq %rsi, %rax + // 53: 48 85 c0 testq %rax, %rax + // 56: 75 dd jne 0x35 <_JIT_ENTRY+0x35> + // 58: 49 83 c5 f8 addq $-0x8, %r13 + // 5c: 48 83 c4 28 addq $0x28, %rsp + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[103] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x75, 0xf8, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x89, 0xf1, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8b, + 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0e, 0x85, 0xc9, + 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0e, 0x74, 0x14, + 0x48, 0x85, 0xc0, 0x74, 0x23, 0x49, 0x89, 0x45, + 0xf8, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x48, + 0x89, 0xc6, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x89, 0xf0, 0x48, 0x85, 0xc0, 0x75, 0xdd, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyNumber_Negative+0x0 + // 8: CONTINUE + // 10: &_Py_Dealloc+0x0 + // 18: ERROR_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyNumber_Negative); + patch_64(data + 0x8, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x10, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x18, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x12, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x40, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x63, (uintptr_t)data + 0x14); +} + +void +emit__UNARY_NOT( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNARY_NOT.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x7 <_JIT_ENTRY+0x7> + // 0000000000000003: IMAGE_REL_AMD64_REL32 __imp__Py_FalseStruct + // 7: 49 39 45 f8 cmpq %rax, -0x8(%r13) + // b: 75 07 jne 0x14 <_JIT_ENTRY+0x14> + // d: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x14 <_JIT_ENTRY+0x14> + // 0000000000000010: IMAGE_REL_AMD64_REL32 __imp__Py_TrueStruct + // 14: 49 89 45 f8 movq %rax, -0x8(%r13) + // 18: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x1f <_JIT_ENTRY+0x1f> + // 000000000000001b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[24] = { + 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x39, 0x45, 0xf8, 0x75, 0x07, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x45, 0xf8, + }; + // 0: &_Py_FalseStruct+0x0 + // 8: &_Py_TrueStruct+0x0 + const unsigned char data_body[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&_Py_FalseStruct); + patch_64(data + 0x8, (uintptr_t)&_Py_TrueStruct); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x3, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x10, (uintptr_t)data + 0x4); +} + +void +emit__UNPACK_EX( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_EX.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 8b 05 00 00 00 00 movl (%rip), %eax # 0xa <_JIT_ENTRY+0xa> + // 0000000000000006: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // a: 49 8b 7d f8 movq -0x8(%r13), %rdi + // e: 0f b6 f0 movzbl %al, %esi + // 11: 48 8d 0c f5 00 00 00 00 leaq (,%rsi,8), %rcx + // 19: 4c 01 e9 addq %r13, %rcx + // 1c: 0f b6 dc movzbl %ah, %ebx + // 1f: 48 8d 04 d9 leaq (%rcx,%rbx,8), %rax + // 23: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 28: 48 89 44 24 20 movq %rax, 0x20(%rsp) + // 2d: 4c 89 f1 movq %r14, %rcx + // 30: 48 89 fa movq %rdi, %rdx + // 33: 41 89 f0 movl %esi, %r8d + // 36: 41 89 d9 movl %ebx, %r9d + // 39: ff 15 00 00 00 00 callq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__PyEval_UnpackIterableStackRef + // 3f: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 44: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 4d: 8b 0f movl (%rdi), %ecx + // 4f: 85 c9 testl %ecx, %ecx + // 51: 78 06 js 0x59 <_JIT_ENTRY+0x59> + // 53: ff c9 decl %ecx + // 55: 89 0f movl %ecx, (%rdi) + // 57: 74 16 je 0x6f <_JIT_ENTRY+0x6f> + // 59: 85 c0 testl %eax, %eax + // 5b: 74 23 je 0x80 <_JIT_ENTRY+0x80> + // 5d: 01 de addl %ebx, %esi + // 5f: 4d 8d 6c f5 00 leaq (%r13,%rsi,8), %r13 + // 64: 48 83 c4 28 addq $0x28, %rsp + // 68: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6f <_JIT_ENTRY+0x6f> + // 000000000000006b: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 6f: 48 89 f9 movq %rdi, %rcx + // 72: 89 c7 movl %eax, %edi + // 74: ff 15 00 00 00 00 callq *(%rip) # 0x7a <_JIT_ENTRY+0x7a> + // 0000000000000076: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 7a: 89 f8 movl %edi, %eax + // 7c: 85 c0 testl %eax, %eax + // 7e: 75 dd jne 0x5d <_JIT_ENTRY+0x5d> + // 80: 49 83 c5 f8 addq $-0x8, %r13 + // 84: 48 83 c4 28 addq $0x28, %rsp + // 88: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8f <_JIT_ENTRY+0x8f> + // 000000000000008b: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[143] = { + 0x48, 0x83, 0xec, 0x28, 0x8b, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x8b, 0x7d, 0xf8, 0x0f, 0xb6, + 0xf0, 0x48, 0x8d, 0x0c, 0xf5, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x01, 0xe9, 0x0f, 0xb6, 0xdc, 0x48, + 0x8d, 0x04, 0xd9, 0x4d, 0x89, 0x6c, 0x24, 0x40, + 0x48, 0x89, 0x44, 0x24, 0x20, 0x4c, 0x89, 0xf1, + 0x48, 0x89, 0xfa, 0x41, 0x89, 0xf0, 0x41, 0x89, + 0xd9, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x8b, 0x6c, 0x24, 0x40, 0x49, 0xc7, 0x44, 0x24, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x0f, 0x85, + 0xc9, 0x78, 0x06, 0xff, 0xc9, 0x89, 0x0f, 0x74, + 0x16, 0x85, 0xc0, 0x74, 0x23, 0x01, 0xde, 0x4d, + 0x8d, 0x6c, 0xf5, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x89, 0xf9, 0x89, 0xc7, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x89, 0xf8, 0x85, 0xc0, 0x75, 0xdd, + 0x49, 0x83, 0xc5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x6, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6b, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x76, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8b, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 48 8b 3d 00 00 00 00 movq (%rip), %rdi # 0xb <_JIT_ENTRY+0xb> + // 0000000000000007: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // b: 44 0f b7 c7 movzwl %di, %r8d + // f: 49 8b 75 f8 movq -0x8(%r13), %rsi + // 13: 4a 8d 04 c5 f8 ff ff ff leaq -0x8(,%r8,8), %rax + // 1b: 4c 01 e8 addq %r13, %rax + // 1e: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 23: 48 89 44 24 20 movq %rax, 0x20(%rsp) + // 28: 4c 89 f1 movq %r14, %rcx + // 2b: 48 89 f2 movq %rsi, %rdx + // 2e: 41 b9 ff ff ff ff movl $0xffffffff, %r9d # imm = 0xFFFFFFFF + // 34: ff 15 00 00 00 00 callq *(%rip) # 0x3a <_JIT_ENTRY+0x3a> + // 0000000000000036: IMAGE_REL_AMD64_REL32 __imp__PyEval_UnpackIterableStackRef + // 3a: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 3f: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // 48: 8b 0e movl (%rsi), %ecx + // 4a: 85 c9 testl %ecx, %ecx + // 4c: 78 06 js 0x54 <_JIT_ENTRY+0x54> + // 4e: ff c9 decl %ecx + // 50: 89 0e movl %ecx, (%rsi) + // 52: 74 17 je 0x6b <_JIT_ENTRY+0x6b> + // 54: 85 c0 testl %eax, %eax + // 56: 74 24 je 0x7c <_JIT_ENTRY+0x7c> + // 58: 0f b7 c7 movzwl %di, %eax + // 5b: 4d 8d 6c c5 f8 leaq -0x8(%r13,%rax,8), %r13 + // 60: 48 83 c4 28 addq $0x28, %rsp + // 64: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6b <_JIT_ENTRY+0x6b> + // 0000000000000067: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 6b: 48 89 f1 movq %rsi, %rcx + // 6e: 89 c6 movl %eax, %esi + // 70: ff 15 00 00 00 00 callq *(%rip) # 0x76 <_JIT_ENTRY+0x76> + // 0000000000000072: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 76: 89 f0 movl %esi, %eax + // 78: 85 c0 testl %eax, %eax + // 7a: 75 dc jne 0x58 <_JIT_ENTRY+0x58> + // 7c: 49 83 c5 f8 addq $-0x8, %r13 + // 80: 48 83 c4 28 addq $0x28, %rsp + // 84: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8b <_JIT_ENTRY+0x8b> + // 0000000000000087: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[139] = { + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x44, 0x0f, 0xb7, 0xc7, 0x49, + 0x8b, 0x75, 0xf8, 0x4a, 0x8d, 0x04, 0xc5, 0xf8, + 0xff, 0xff, 0xff, 0x4c, 0x01, 0xe8, 0x4d, 0x89, + 0x6c, 0x24, 0x40, 0x48, 0x89, 0x44, 0x24, 0x20, + 0x4c, 0x89, 0xf1, 0x48, 0x89, 0xf2, 0x41, 0xb9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0x49, + 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x8b, 0x0e, 0x85, 0xc9, 0x78, 0x06, 0xff, 0xc9, + 0x89, 0x0e, 0x74, 0x17, 0x85, 0xc0, 0x74, 0x24, + 0x0f, 0xb7, 0xc7, 0x4d, 0x8d, 0x6c, 0xc5, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x89, 0xf1, 0x89, 0xc6, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x89, 0xf0, + 0x85, 0xc0, 0x75, 0xdc, 0x49, 0x83, 0xc5, 0xf8, + 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, + 0x00, 0x00, 0x00, + }; + // 0: OPARG + // 8: &_PyEval_UnpackIterableStackRef+0x0 + // 10: CONTINUE + // 18: &_Py_Dealloc+0x0 + // 20: ERROR_TARGET + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + patch_64(data + 0x8, (uintptr_t)&_PyEval_UnpackIterableStackRef); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x20, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x7, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x36, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x67, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x72, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x87, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE_LIST( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_LIST.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 41 08 movq 0x8(%rcx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyList_Type + // 13: 75 4e jne 0x63 <_JIT_ENTRY+0x63> + // 15: 48 8b 71 10 movq 0x10(%rcx), %rsi + // 19: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 20: 48 39 c6 cmpq %rax, %rsi + // 23: 75 3e jne 0x63 <_JIT_ENTRY+0x63> + // 25: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 2c: 66 85 c0 testw %ax, %ax + // 2f: 74 3d je 0x6e <_JIT_ENTRY+0x6e> + // 31: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 35: 48 8b 51 18 movq 0x18(%rcx), %rdx + // 39: 48 8d 7e 01 leaq 0x1(%rsi), %rdi + // 3d: eb 11 jmp 0x50 <_JIT_ENTRY+0x50> + // 3f: 90 nop + // 40: 4c 89 00 movq %r8, (%rax) + // 43: 48 83 c0 08 addq $0x8, %rax + // 47: 48 ff cf decq %rdi + // 4a: 48 83 ff 01 cmpq $0x1, %rdi + // 4e: 76 1e jbe 0x6e <_JIT_ENTRY+0x6e> + // 50: 4c 8b 44 fa f0 movq -0x10(%rdx,%rdi,8), %r8 + // 55: 41 8b 18 movl (%r8), %ebx + // 58: 85 db testl %ebx, %ebx + // 5a: 78 e4 js 0x40 <_JIT_ENTRY+0x40> + // 5c: ff c3 incl %ebx + // 5e: 41 89 18 movl %ebx, (%r8) + // 61: eb dd jmp 0x40 <_JIT_ENTRY+0x40> + // 63: 48 83 c4 28 addq $0x28, %rsp + // 67: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6e <_JIT_ENTRY+0x6e> + // 000000000000006a: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 6e: 8b 01 movl (%rcx), %eax + // 70: 85 c0 testl %eax, %eax + // 72: 78 06 js 0x7a <_JIT_ENTRY+0x7a> + // 74: ff c8 decl %eax + // 76: 89 01 movl %eax, (%rcx) + // 78: 74 10 je 0x8a <_JIT_ENTRY+0x8a> + // 7a: 4d 8d 6c f5 f8 leaq -0x8(%r13,%rsi,8), %r13 + // 7f: 48 83 c4 28 addq $0x28, %rsp + // 83: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x8a <_JIT_ENTRY+0x8a> + // 0000000000000086: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 8a: ff 15 00 00 00 00 callq *(%rip) # 0x90 <_JIT_ENTRY+0x90> + // 000000000000008c: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 90: 4d 8d 6c f5 f8 leaq -0x8(%r13,%rsi,8), %r13 + // 95: 48 83 c4 28 addq $0x28, %rsp + // 99: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xa0 <_JIT_ENTRY+0xa0> + // 000000000000009c: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[153] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x41, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x4e, 0x48, 0x8b, 0x71, + 0x10, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x39, 0xc6, 0x75, 0x3e, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x3d, 0x49, 0x8d, 0x45, 0xf8, 0x48, 0x8b, 0x51, + 0x18, 0x48, 0x8d, 0x7e, 0x01, 0xeb, 0x11, 0x90, + 0x4c, 0x89, 0x00, 0x48, 0x83, 0xc0, 0x08, 0x48, + 0xff, 0xcf, 0x48, 0x83, 0xff, 0x01, 0x76, 0x1e, + 0x4c, 0x8b, 0x44, 0xfa, 0xf0, 0x41, 0x8b, 0x18, + 0x85, 0xdb, 0x78, 0xe4, 0xff, 0xc3, 0x41, 0x89, + 0x18, 0xeb, 0xdd, 0x48, 0x83, 0xc4, 0x28, 0x48, + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x01, + 0x85, 0xc0, 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, + 0x74, 0x10, 0x4d, 0x8d, 0x6c, 0xf5, 0xf8, 0x48, + 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x8d, 0x6c, 0xf5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, + }; + // 0: &PyList_Type+0x0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: CONTINUE + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyList_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x6a, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x86, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8c, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 41 08 movq 0x8(%rcx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyTuple_Type + // 13: 75 4c jne 0x61 <_JIT_ENTRY+0x61> + // 15: 48 8b 71 10 movq 0x10(%rcx), %rsi + // 19: 0f b7 05 00 00 00 00 movzwl (%rip), %eax # 0x20 <_JIT_ENTRY+0x20> + // 000000000000001c: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 20: 48 39 c6 cmpq %rax, %rsi + // 23: 75 3c jne 0x61 <_JIT_ENTRY+0x61> + // 25: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x2c <_JIT_ENTRY+0x2c> + // 0000000000000028: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 2c: 66 85 c0 testw %ax, %ax + // 2f: 74 3b je 0x6c <_JIT_ENTRY+0x6c> + // 31: 49 8d 45 f8 leaq -0x8(%r13), %rax + // 35: 48 8d 56 01 leaq 0x1(%rsi), %rdx + // 39: eb 15 jmp 0x50 <_JIT_ENTRY+0x50> + // 3b: 0f 1f 44 00 00 nopl (%rax,%rax) + // 40: 48 89 38 movq %rdi, (%rax) + // 43: 48 83 c0 08 addq $0x8, %rax + // 47: 48 ff ca decq %rdx + // 4a: 48 83 fa 01 cmpq $0x1, %rdx + // 4e: 76 1c jbe 0x6c <_JIT_ENTRY+0x6c> + // 50: 48 8b 7c d1 08 movq 0x8(%rcx,%rdx,8), %rdi + // 55: 8b 1f movl (%rdi), %ebx + // 57: 85 db testl %ebx, %ebx + // 59: 78 e5 js 0x40 <_JIT_ENTRY+0x40> + // 5b: ff c3 incl %ebx + // 5d: 89 1f movl %ebx, (%rdi) + // 5f: eb df jmp 0x40 <_JIT_ENTRY+0x40> + // 61: 48 83 c4 28 addq $0x28, %rsp + // 65: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + // 6c: 8b 01 movl (%rcx), %eax + // 6e: 85 c0 testl %eax, %eax + // 70: 78 06 js 0x78 <_JIT_ENTRY+0x78> + // 72: ff c8 decl %eax + // 74: 89 01 movl %eax, (%rcx) + // 76: 74 10 je 0x88 <_JIT_ENTRY+0x88> + // 78: 4d 8d 6c f5 f8 leaq -0x8(%r13,%rsi,8), %r13 + // 7d: 48 83 c4 28 addq $0x28, %rsp + // 81: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x88 <_JIT_ENTRY+0x88> + // 0000000000000084: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 88: ff 15 00 00 00 00 callq *(%rip) # 0x8e <_JIT_ENTRY+0x8e> + // 000000000000008a: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 8e: 4d 8d 6c f5 f8 leaq -0x8(%r13,%rsi,8), %r13 + // 93: 48 83 c4 28 addq $0x28, %rsp + // 97: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x9e <_JIT_ENTRY+0x9e> + // 000000000000009a: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[151] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x41, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x4c, 0x48, 0x8b, 0x71, + 0x10, 0x0f, 0xb7, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x39, 0xc6, 0x75, 0x3c, 0x48, 0x8b, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x85, 0xc0, 0x74, + 0x3b, 0x49, 0x8d, 0x45, 0xf8, 0x48, 0x8d, 0x56, + 0x01, 0xeb, 0x15, 0x0f, 0x1f, 0x44, 0x00, 0x00, + 0x48, 0x89, 0x38, 0x48, 0x83, 0xc0, 0x08, 0x48, + 0xff, 0xca, 0x48, 0x83, 0xfa, 0x01, 0x76, 0x1c, + 0x48, 0x8b, 0x7c, 0xd1, 0x08, 0x8b, 0x1f, 0x85, + 0xdb, 0x78, 0xe5, 0xff, 0xc3, 0x89, 0x1f, 0xeb, + 0xdf, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x85, 0xc0, + 0x78, 0x06, 0xff, 0xc8, 0x89, 0x01, 0x74, 0x10, + 0x4d, 0x8d, 0x6c, 0xf5, 0xf8, 0x48, 0x83, 0xc4, + 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x8d, + 0x6c, 0xf5, 0xf8, 0x48, 0x83, 0xc4, 0x28, + }; + // 0: &PyTuple_Type+0x0 + // 8: OPARG + // 10: JUMP_TARGET + // 18: CONTINUE + // 20: &_Py_Dealloc+0x0 + const unsigned char data_body[40] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, instruction->oparg); + patch_64(data + 0x10, state->instruction_starts[instruction->jump_target]); + patch_64(data + 0x18, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x20, (uintptr_t)&_Py_Dealloc); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x1c, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x28, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x84, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0x8a, (uintptr_t)data + 0x1c); +} + +void +emit__UNPACK_SEQUENCE_TWO_TUPLE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _UNPACK_SEQUENCE_TWO_TUPLE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 28 subq $0x28, %rsp + // 4: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 8: 48 8b 41 08 movq 0x8(%rcx), %rax + // c: 48 3b 05 00 00 00 00 cmpq (%rip), %rax # 0x13 <_JIT_ENTRY+0x13> + // 000000000000000f: IMAGE_REL_AMD64_REL32 __imp_PyTuple_Type + // 13: 75 4c jne 0x61 <_JIT_ENTRY+0x61> + // 15: 48 83 79 10 02 cmpq $0x2, 0x10(%rcx) + // 1a: 75 45 jne 0x61 <_JIT_ENTRY+0x61> + // 1c: 48 8b 71 18 movq 0x18(%rcx), %rsi + // 20: 8b 06 movl (%rsi), %eax + // 22: 85 c0 testl %eax, %eax + // 24: 78 04 js 0x2a <_JIT_ENTRY+0x2a> + // 26: ff c0 incl %eax + // 28: 89 06 movl %eax, (%rsi) + // 2a: 48 8b 79 20 movq 0x20(%rcx), %rdi + // 2e: 8b 07 movl (%rdi), %eax + // 30: 85 c0 testl %eax, %eax + // 32: 78 04 js 0x38 <_JIT_ENTRY+0x38> + // 34: ff c0 incl %eax + // 36: 89 07 movl %eax, (%rdi) + // 38: 8b 01 movl (%rcx), %eax + // 3a: 85 c0 testl %eax, %eax + // 3c: 78 0c js 0x4a <_JIT_ENTRY+0x4a> + // 3e: ff c8 decl %eax + // 40: 89 01 movl %eax, (%rcx) + // 42: 75 06 jne 0x4a <_JIT_ENTRY+0x4a> + // 44: ff 15 00 00 00 00 callq *(%rip) # 0x4a <_JIT_ENTRY+0x4a> + // 0000000000000046: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 4a: 49 89 7d f8 movq %rdi, -0x8(%r13) + // 4e: 49 89 75 00 movq %rsi, (%r13) + // 52: 49 83 c5 08 addq $0x8, %r13 + // 56: 48 83 c4 28 addq $0x28, %rsp + // 5a: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x61 <_JIT_ENTRY+0x61> + // 000000000000005d: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // 61: 48 83 c4 28 addq $0x28, %rsp + // 65: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x6c <_JIT_ENTRY+0x6c> + // 0000000000000068: IMAGE_REL_AMD64_REL32 __imp__JIT_JUMP_TARGET + const unsigned char code_body[108] = { + 0x48, 0x83, 0xec, 0x28, 0x49, 0x8b, 0x4d, 0xf8, + 0x48, 0x8b, 0x41, 0x08, 0x48, 0x3b, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x4c, 0x48, 0x83, 0x79, + 0x10, 0x02, 0x75, 0x45, 0x48, 0x8b, 0x71, 0x18, + 0x8b, 0x06, 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, + 0x89, 0x06, 0x48, 0x8b, 0x79, 0x20, 0x8b, 0x07, + 0x85, 0xc0, 0x78, 0x04, 0xff, 0xc0, 0x89, 0x07, + 0x8b, 0x01, 0x85, 0xc0, 0x78, 0x0c, 0xff, 0xc8, + 0x89, 0x01, 0x75, 0x06, 0xff, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x89, 0x7d, 0xf8, 0x49, 0x89, + 0x75, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x28, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x28, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyTuple_Type+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: CONTINUE + // 18: JUMP_TARGET + const unsigned char data_body[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyTuple_Type); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x18, state->instruction_starts[instruction->jump_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0xf, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x46, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x5d, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x68, (uintptr_t)data + 0x14); +} + +void +emit__WITH_EXCEPT_START( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _WITH_EXCEPT_START.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 48 83 ec 48 subq $0x48, %rsp + // 4: 49 8b 7d f8 movq -0x8(%r13), %rdi + // 8: 49 8b 75 d8 movq -0x28(%r13), %rsi + // c: 49 8b 5d e0 movq -0x20(%r13), %rbx + // 10: 4c 8b 7f 08 movq 0x8(%rdi), %r15 + // 14: 48 89 f9 movq %rdi, %rcx + // 17: ff 15 00 00 00 00 callq *(%rip) # 0x1d <_JIT_ENTRY+0x1d> + // 0000000000000019: IMAGE_REL_AMD64_REL32 __imp_PyException_GetTraceback + // 1d: 48 85 c0 testq %rax, %rax + // 20: 74 27 je 0x49 <_JIT_ENTRY+0x49> + // 22: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 27: 8b 08 movl (%rax), %ecx + // 29: 85 c9 testl %ecx, %ecx + // 2b: 78 15 js 0x42 <_JIT_ENTRY+0x42> + // 2d: ff c9 decl %ecx + // 2f: 89 08 movl %ecx, (%rax) + // 31: 75 0f jne 0x42 <_JIT_ENTRY+0x42> + // 33: 48 89 c1 movq %rax, %rcx + // 36: 49 89 c5 movq %rax, %r13 + // 39: ff 15 00 00 00 00 callq *(%rip) # 0x3f <_JIT_ENTRY+0x3f> + // 000000000000003b: IMAGE_REL_AMD64_REL32 __imp__Py_Dealloc + // 3f: 4c 89 e8 movq %r13, %rax + // 42: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // 47: eb 07 jmp 0x50 <_JIT_ENTRY+0x50> + // 49: 48 8b 05 00 00 00 00 movq (%rip), %rax # 0x50 <_JIT_ENTRY+0x50> + // 000000000000004c: IMAGE_REL_AMD64_REL32 __imp__Py_NoneStruct + // 50: 48 c7 44 24 20 00 00 00 00 movq $0x0, 0x20(%rsp) + // 59: 48 89 5c 24 28 movq %rbx, 0x28(%rsp) + // 5e: 48 8d 54 24 30 leaq 0x30(%rsp), %rdx + // 63: 4c 89 7c 24 30 movq %r15, 0x30(%rsp) + // 68: 48 89 7c 24 38 movq %rdi, 0x38(%rsp) + // 6d: 48 89 44 24 40 movq %rax, 0x40(%rsp) + // 72: 48 b8 03 00 00 00 00 00 00 80 movabsq $-0x7ffffffffffffffd, %rax # imm = 0x8000000000000003 + // 7c: 4c 8d 40 01 leaq 0x1(%rax), %r8 + // 80: 31 c9 xorl %ecx, %ecx + // 82: 48 85 db testq %rbx, %rbx + // 85: 0f 95 c1 setne %cl + // 88: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 8d: 4c 0f 44 c0 cmoveq %rax, %r8 + // 91: c1 e1 03 shll $0x3, %ecx + // 94: 48 29 ca subq %rcx, %rdx + // 97: 48 89 f1 movq %rsi, %rcx + // 9a: 45 31 c9 xorl %r9d, %r9d + // 9d: ff 15 00 00 00 00 callq *(%rip) # 0xa3 <_JIT_ENTRY+0xa3> + // 000000000000009f: IMAGE_REL_AMD64_REL32 __imp_PyObject_Vectorcall + // a3: 4d 8b 6c 24 40 movq 0x40(%r12), %r13 + // a8: 49 c7 44 24 40 00 00 00 00 movq $0x0, 0x40(%r12) + // b1: 48 85 c0 testq %rax, %rax + // b4: 74 13 je 0xc9 <_JIT_ENTRY+0xc9> + // b6: 49 89 45 00 movq %rax, (%r13) + // ba: 49 83 c5 08 addq $0x8, %r13 + // be: 48 83 c4 48 addq $0x48, %rsp + // c2: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xc9 <_JIT_ENTRY+0xc9> + // 00000000000000c5: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + // c9: 48 83 c4 48 addq $0x48, %rsp + // cd: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0xd4 <_JIT_ENTRY+0xd4> + // 00000000000000d0: IMAGE_REL_AMD64_REL32 __imp__JIT_ERROR_TARGET + const unsigned char code_body[212] = { + 0x48, 0x83, 0xec, 0x48, 0x49, 0x8b, 0x7d, 0xf8, + 0x49, 0x8b, 0x75, 0xd8, 0x49, 0x8b, 0x5d, 0xe0, + 0x4c, 0x8b, 0x7f, 0x08, 0x48, 0x89, 0xf9, 0xff, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x74, 0x27, 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x8b, + 0x08, 0x85, 0xc9, 0x78, 0x15, 0xff, 0xc9, 0x89, + 0x08, 0x75, 0x0f, 0x48, 0x89, 0xc1, 0x49, 0x89, + 0xc5, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0xe8, 0x4d, 0x8b, 0x6c, 0x24, 0x40, 0xeb, + 0x07, 0x48, 0x8b, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xc7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x89, 0x5c, 0x24, 0x28, 0x48, 0x8d, + 0x54, 0x24, 0x30, 0x4c, 0x89, 0x7c, 0x24, 0x30, + 0x48, 0x89, 0x7c, 0x24, 0x38, 0x48, 0x89, 0x44, + 0x24, 0x40, 0x48, 0xb8, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x4c, 0x8d, 0x40, 0x01, + 0x31, 0xc9, 0x48, 0x85, 0xdb, 0x0f, 0x95, 0xc1, + 0x4d, 0x89, 0x6c, 0x24, 0x40, 0x4c, 0x0f, 0x44, + 0xc0, 0xc1, 0xe1, 0x03, 0x48, 0x29, 0xca, 0x48, + 0x89, 0xf1, 0x45, 0x31, 0xc9, 0xff, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x4d, 0x8b, 0x6c, 0x24, 0x40, + 0x49, 0xc7, 0x44, 0x24, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x85, 0xc0, 0x74, 0x13, 0x49, 0x89, + 0x45, 0x00, 0x49, 0x83, 0xc5, 0x08, 0x48, 0x83, + 0xc4, 0x48, 0x48, 0xff, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x83, 0xc4, 0x48, 0x48, 0xff, 0x25, + 0x00, 0x00, 0x00, 0x00, + }; + // 0: &PyException_GetTraceback+0x0 + // 8: &_Py_Dealloc+0x0 + // 10: &_Py_NoneStruct+0x0 + // 18: &PyObject_Vectorcall+0x0 + // 20: CONTINUE + // 28: ERROR_TARGET + const unsigned char data_body[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, (uintptr_t)&PyException_GetTraceback); + patch_64(data + 0x8, (uintptr_t)&_Py_Dealloc); + patch_64(data + 0x10, (uintptr_t)&_Py_NoneStruct); + patch_64(data + 0x18, (uintptr_t)&PyObject_Vectorcall); + patch_64(data + 0x20, (uintptr_t)code + sizeof(code_body)); + patch_64(data + 0x28, state->instruction_starts[instruction->error_target]); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x19, (uintptr_t)data + -0x4); + patch_x86_64_32rx(code + 0x3b, (uintptr_t)data + 0x4); + patch_x86_64_32rx(code + 0x4c, (uintptr_t)data + 0xc); + patch_x86_64_32rx(code + 0x9f, (uintptr_t)data + 0x14); + patch_x86_64_32rx(code + 0xc5, (uintptr_t)data + 0x1c); + patch_x86_64_32rx(code + 0xd0, (uintptr_t)data + 0x24); +} + +void +emit__YIELD_VALUE( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state) +{ + // + // _YIELD_VALUE.o: file format coff-x86-64 + // + // Disassembly of section .text: + // + // 0000000000000000 <_JIT_ENTRY>: + // 0: 49 8b 4d f8 movq -0x8(%r13), %rcx + // 4: 49 83 44 24 38 02 addq $0x2, 0x38(%r12) + // a: 49 83 c5 f8 addq $-0x8, %r13 + // e: 0f b6 05 00 00 00 00 movzbl (%rip), %eax # 0x15 <_JIT_ENTRY+0x15> + // 0000000000000011: IMAGE_REL_AMD64_REL32 __imp__JIT_OPARG + // 15: 04 fe addb $-0x2, %al + // 17: 41 88 44 24 fb movb %al, -0x5(%r12) + // 1c: 4d 89 6c 24 40 movq %r13, 0x40(%r12) + // 21: 49 8b 44 24 e8 movq -0x18(%r12), %rax + // 26: 49 89 46 78 movq %rax, 0x78(%r14) + // 2a: 49 c7 44 24 e8 00 00 00 00 movq $0x0, -0x18(%r12) + // 33: 41 ff 46 2c incl 0x2c(%r14) + // 37: 49 8b 44 24 08 movq 0x8(%r12), %rax + // 3c: 49 89 46 48 movq %rax, 0x48(%r14) + // 40: 49 c7 44 24 08 00 00 00 00 movq $0x0, 0x8(%r12) + // 49: 4c 8b 68 40 movq 0x40(%rax), %r13 + // 4d: 48 c7 40 40 00 00 00 00 movq $0x0, 0x40(%rax) + // 55: 49 89 4d 00 movq %rcx, (%r13) + // 59: 49 83 c5 08 addq $0x8, %r13 + // 5d: 49 89 c4 movq %rax, %r12 + // 60: 48 ff 25 00 00 00 00 jmpq *(%rip) # 0x67 <_JIT_ENTRY+0x67> + // 0000000000000063: IMAGE_REL_AMD64_REL32 __imp__JIT_CONTINUE + const unsigned char code_body[96] = { + 0x49, 0x8b, 0x4d, 0xf8, 0x49, 0x83, 0x44, 0x24, + 0x38, 0x02, 0x49, 0x83, 0xc5, 0xf8, 0x0f, 0xb6, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0x41, + 0x88, 0x44, 0x24, 0xfb, 0x4d, 0x89, 0x6c, 0x24, + 0x40, 0x49, 0x8b, 0x44, 0x24, 0xe8, 0x49, 0x89, + 0x46, 0x78, 0x49, 0xc7, 0x44, 0x24, 0xe8, 0x00, + 0x00, 0x00, 0x00, 0x41, 0xff, 0x46, 0x2c, 0x49, + 0x8b, 0x44, 0x24, 0x08, 0x49, 0x89, 0x46, 0x48, + 0x49, 0xc7, 0x44, 0x24, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x4c, 0x8b, 0x68, 0x40, 0x48, 0xc7, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0x89, 0x4d, + 0x00, 0x49, 0x83, 0xc5, 0x08, 0x49, 0x89, 0xc4, + }; + // 0: OPARG + const unsigned char data_body[8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + memcpy(data, data_body, sizeof(data_body)); + patch_64(data + 0x0, instruction->oparg); + memcpy(code, code_body, sizeof(code_body)); + patch_x86_64_32rx(code + 0x11, (uintptr_t)data + -0x4); +} + +static_assert(SYMBOL_MASK_WORDS >= 1, "SYMBOL_MASK_WORDS too small"); + +typedef struct { + void (*emit)( + unsigned char *code, unsigned char *data, _PyExecutorObject *executor, + const _PyUOpInstruction *instruction, jit_state *state); + size_t code_size; + size_t data_size; + symbol_mask trampoline_mask; +} StencilGroup; + +static const StencilGroup shim = {emit_shim, 178, 8, {0}}; + +static const StencilGroup stencil_groups[MAX_UOP_ID + 1] = { + [_BINARY_OP] = {emit__BINARY_OP, 143, 40, {0}}, + [_BINARY_OP_ADD_FLOAT] = {emit__BINARY_OP_ADD_FLOAT, 69, 24, {0}}, + [_BINARY_OP_ADD_INT] = {emit__BINARY_OP_ADD_INT, 191, 40, {0}}, + [_BINARY_OP_ADD_UNICODE] = {emit__BINARY_OP_ADD_UNICODE, 191, 40, {0}}, + [_BINARY_OP_EXTEND] = {emit__BINARY_OP_EXTEND, 123, 24, {0}}, + [_BINARY_OP_INPLACE_ADD_UNICODE] = {emit__BINARY_OP_INPLACE_ADD_UNICODE, 217, 56, {0}}, + [_BINARY_OP_MULTIPLY_FLOAT] = {emit__BINARY_OP_MULTIPLY_FLOAT, 69, 24, {0}}, + [_BINARY_OP_MULTIPLY_INT] = {emit__BINARY_OP_MULTIPLY_INT, 191, 40, {0}}, + [_BINARY_OP_SUBSCR_CHECK_FUNC] = {emit__BINARY_OP_SUBSCR_CHECK_FUNC, 114, 16, {0}}, + [_BINARY_OP_SUBSCR_DICT] = {emit__BINARY_OP_SUBSCR_DICT, 195, 56, {0}}, + [_BINARY_OP_SUBSCR_INIT_CALL] = {emit__BINARY_OP_SUBSCR_INIT_CALL, 192, 0, {0}}, + [_BINARY_OP_SUBSCR_LIST_INT] = {emit__BINARY_OP_SUBSCR_LIST_INT, 226, 56, {0}}, + [_BINARY_OP_SUBSCR_STR_INT] = {emit__BINARY_OP_SUBSCR_STR_INT, 367, 48, {0}}, + [_BINARY_OP_SUBSCR_TUPLE_INT] = {emit__BINARY_OP_SUBSCR_TUPLE_INT, 223, 56, {0}}, + [_BINARY_OP_SUBTRACT_FLOAT] = {emit__BINARY_OP_SUBTRACT_FLOAT, 69, 24, {0}}, + [_BINARY_OP_SUBTRACT_INT] = {emit__BINARY_OP_SUBTRACT_INT, 191, 40, {0}}, + [_BINARY_SLICE] = {emit__BINARY_SLICE, 196, 40, {0}}, + [_BUILD_LIST] = {emit__BUILD_LIST, 83, 32, {0}}, + [_BUILD_MAP] = {emit__BUILD_MAP, 219, 40, {0}}, + [_BUILD_SET] = {emit__BUILD_SET, 407, 40, {0}}, + [_BUILD_SLICE] = {emit__BUILD_SLICE, 216, 40, {0}}, + [_BUILD_STRING] = {emit__BUILD_STRING, 174, 48, {0}}, + [_BUILD_TUPLE] = {emit__BUILD_TUPLE, 83, 32, {0}}, + [_CALL_BUILTIN_CLASS] = {emit__CALL_BUILTIN_CLASS, 325, 40, {0}}, + [_CALL_BUILTIN_FAST] = {emit__CALL_BUILTIN_FAST, 357, 48, {0}}, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = {emit__CALL_BUILTIN_FAST_WITH_KEYWORDS, 357, 48, {0}}, + [_CALL_BUILTIN_O] = {emit__CALL_BUILTIN_O, 294, 48, {0}}, + [_CALL_INTRINSIC_1] = {emit__CALL_INTRINSIC_1, 120, 40, {0}}, + [_CALL_INTRINSIC_2] = {emit__CALL_INTRINSIC_2, 149, 40, {0}}, + [_CALL_ISINSTANCE] = {emit__CALL_ISINSTANCE, 326, 56, {0}}, + [_CALL_KW_NON_PY] = {emit__CALL_KW_NON_PY, 353, 40, {0}}, + [_CALL_LEN] = {emit__CALL_LEN, 272, 56, {0}}, + [_CALL_LIST_APPEND] = {emit__CALL_LIST_APPEND, 200, 40, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST] = {emit__CALL_METHOD_DESCRIPTOR_FAST, 357, 48, {0}}, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = {emit__CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 357, 48, {0}}, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = {emit__CALL_METHOD_DESCRIPTOR_NOARGS, 306, 48, {0}}, + [_CALL_METHOD_DESCRIPTOR_O] = {emit__CALL_METHOD_DESCRIPTOR_O, 357, 48, {0}}, + [_CALL_NON_PY_GENERAL] = {emit__CALL_NON_PY_GENERAL, 309, 40, {0}}, + [_CALL_STR_1] = {emit__CALL_STR_1, 135, 48, {0}}, + [_CALL_TUPLE_1] = {emit__CALL_TUPLE_1, 135, 48, {0}}, + [_CALL_TYPE_1] = {emit__CALL_TYPE_1, 127, 32, {0}}, + [_CHECK_AND_ALLOCATE_OBJECT] = {emit__CHECK_AND_ALLOCATE_OBJECT, 274, 64, {0}}, + [_CHECK_ATTR_CLASS] = {emit__CHECK_ATTR_CLASS, 45, 24, {0}}, + [_CHECK_ATTR_METHOD_LAZY_DICT] = {emit__CHECK_ATTR_METHOD_LAZY_DICT, 26, 16, {0}}, + [_CHECK_ATTR_MODULE_PUSH_KEYS] = {emit__CHECK_ATTR_MODULE_PUSH_KEYS, 72, 32, {0}}, + [_CHECK_ATTR_WITH_HINT] = {emit__CHECK_ATTR_WITH_HINT, 35, 16, {0}}, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 57, 24, {0}}, + [_CHECK_EG_MATCH] = {emit__CHECK_EG_MATCH, 336, 56, {0}}, + [_CHECK_EXC_MATCH] = {emit__CHECK_EXC_MATCH, 206, 56, {0}}, + [_CHECK_FUNCTION] = {emit__CHECK_FUNCTION, 33, 24, {0}}, + [_CHECK_FUNCTION_EXACT_ARGS] = {emit__CHECK_FUNCTION_EXACT_ARGS, 61, 24, {0}}, + [_CHECK_FUNCTION_VERSION] = {emit__CHECK_FUNCTION_VERSION, 63, 40, {0}}, + [_CHECK_FUNCTION_VERSION_INLINE] = {emit__CHECK_FUNCTION_VERSION_INLINE, 35, 32, {0}}, + [_CHECK_FUNCTION_VERSION_KW] = {emit__CHECK_FUNCTION_VERSION_KW, 63, 40, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE] = {emit__CHECK_IS_NOT_PY_CALLABLE, 58, 40, {0}}, + [_CHECK_IS_NOT_PY_CALLABLE_KW] = {emit__CHECK_IS_NOT_PY_CALLABLE_KW, 58, 40, {0}}, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = {emit__CHECK_MANAGED_OBJECT_HAS_VALUES, 33, 16, {0}}, + [_CHECK_METHOD_VERSION] = {emit__CHECK_METHOD_VERSION, 85, 40, {0}}, + [_CHECK_METHOD_VERSION_KW] = {emit__CHECK_METHOD_VERSION_KW, 91, 40, {0}}, + [_CHECK_PEP_523] = {emit__CHECK_PEP_523, 21, 8, {0}}, + [_CHECK_PERIODIC] = {emit__CHECK_PERIODIC, 59, 16, {0}}, + [_CHECK_PERIODIC_IF_NOT_YIELD_FROM] = {emit__CHECK_PERIODIC_IF_NOT_YIELD_FROM, 70, 24, {0}}, + [_CHECK_STACK_SPACE] = {emit__CHECK_STACK_SPACE, 75, 16, {0}}, + [_CHECK_STACK_SPACE_OPERAND] = {emit__CHECK_STACK_SPACE_OPERAND, 52, 16, {0}}, + [_CHECK_VALIDITY] = {emit__CHECK_VALIDITY, 20, 16, {0}}, + [_CHECK_VALIDITY_AND_SET_IP] = {emit__CHECK_VALIDITY_AND_SET_IP, 32, 24, {0}}, + [_COMPARE_OP] = {emit__COMPARE_OP, 273, 64, {0}}, + [_COMPARE_OP_FLOAT] = {emit__COMPARE_OP_FLOAT, 216, 48, {0}}, + [_COMPARE_OP_INT] = {emit__COMPARE_OP_INT, 275, 48, {0}}, + [_COMPARE_OP_STR] = {emit__COMPARE_OP_STR, 202, 56, {0}}, + [_CONTAINS_OP] = {emit__CONTAINS_OP, 173, 56, {0}}, + [_CONTAINS_OP_DICT] = {emit__CONTAINS_OP_DICT, 197, 72, {0}}, + [_CONTAINS_OP_SET] = {emit__CONTAINS_OP_SET, 212, 80, {0}}, + [_CONVERT_VALUE] = {emit__CONVERT_VALUE, 134, 40, {0}}, + [_COPY] = {emit__COPY, 37, 8, {0}}, + [_COPY_FREE_VARS] = {emit__COPY_FREE_VARS, 166, 16, {0}}, + [_CREATE_INIT_FRAME] = {emit__CREATE_INIT_FRAME, 292, 56, {0}}, + [_DELETE_ATTR] = {emit__DELETE_ATTR, 112, 32, {0}}, + [_DELETE_DEREF] = {emit__DELETE_DEREF, 150, 40, {0}}, + [_DELETE_FAST] = {emit__DELETE_FAST, 175, 136, {0}}, + [_DELETE_GLOBAL] = {emit__DELETE_GLOBAL, 147, 80, {0}}, + [_DELETE_NAME] = {emit__DELETE_NAME, 183, 112, {0}}, + [_DELETE_SUBSCR] = {emit__DELETE_SUBSCR, 118, 24, {0}}, + [_DEOPT] = {emit__DEOPT, 40, 16, {0}}, + [_DICT_MERGE] = {emit__DICT_MERGE, 213, 48, {0}}, + [_DICT_UPDATE] = {emit__DICT_UPDATE, 263, 112, {0}}, + [_END_FOR] = {emit__END_FOR, 78, 16, {0}}, + [_END_SEND] = {emit__END_SEND, 60, 16, {0}}, + [_ERROR_POP_N] = {emit__ERROR_POP_N, 47, 16, {0}}, + [_EXIT_INIT_CHECK] = {emit__EXIT_INIT_CHECK, 86, 80, {0}}, + [_EXIT_TRACE] = {emit__EXIT_TRACE, 434, 32, {0}}, + [_EXPAND_METHOD] = {emit__EXPAND_METHOD, 140, 24, {0}}, + [_EXPAND_METHOD_KW] = {emit__EXPAND_METHOD_KW, 140, 24, {0}}, + [_FATAL_ERROR] = {emit__FATAL_ERROR, 24, 48, {0}}, + [_FORMAT_SIMPLE] = {emit__FORMAT_SIMPLE, 164, 40, {0}}, + [_FORMAT_WITH_SPEC] = {emit__FORMAT_WITH_SPEC, 132, 32, {0}}, + [_FOR_ITER_GEN_FRAME] = {emit__FOR_ITER_GEN_FRAME, 106, 32, {0}}, + [_FOR_ITER_TIER_TWO] = {emit__FOR_ITER_TIER_TWO, 186, 56, {0}}, + [_GET_AITER] = {emit__GET_AITER, 350, 200, {0}}, + [_GET_ANEXT] = {emit__GET_ANEXT, 68, 24, {0}}, + [_GET_AWAITABLE] = {emit__GET_AWAITABLE, 110, 40, {0}}, + [_GET_ITER] = {emit__GET_ITER, 103, 32, {0}}, + [_GET_LEN] = {emit__GET_LEN, 82, 32, {0}}, + [_GET_YIELD_FROM_ITER] = {emit__GET_YIELD_FROM_ITER, 217, 136, {0}}, + [_GUARD_BINARY_OP_EXTEND] = {emit__GUARD_BINARY_OP_EXTEND, 63, 24, {0}}, + [_GUARD_BOTH_FLOAT] = {emit__GUARD_BOTH_FLOAT, 41, 16, {0}}, + [_GUARD_BOTH_INT] = {emit__GUARD_BOTH_INT, 41, 16, {0}}, + [_GUARD_BOTH_UNICODE] = {emit__GUARD_BOTH_UNICODE, 41, 16, {0}}, + [_GUARD_BUILTINS_VERSION_PUSH_KEYS] = {emit__GUARD_BUILTINS_VERSION_PUSH_KEYS, 56, 32, {0}}, + [_GUARD_DORV_NO_DICT] = {emit__GUARD_DORV_NO_DICT, 33, 8, {0}}, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = {emit__GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 33, 16, {0}}, + [_GUARD_GLOBALS_VERSION] = {emit__GUARD_GLOBALS_VERSION, 48, 32, {0}}, + [_GUARD_GLOBALS_VERSION_PUSH_KEYS] = {emit__GUARD_GLOBALS_VERSION_PUSH_KEYS, 56, 32, {0}}, + [_GUARD_IS_FALSE_POP] = {emit__GUARD_IS_FALSE_POP, 24, 16, {0}}, + [_GUARD_IS_NONE_POP] = {emit__GUARD_IS_NONE_POP, 105, 32, {0}}, + [_GUARD_IS_NOT_NONE_POP] = {emit__GUARD_IS_NOT_NONE_POP, 79, 32, {0}}, + [_GUARD_IS_TRUE_POP] = {emit__GUARD_IS_TRUE_POP, 24, 16, {0}}, + [_GUARD_KEYS_VERSION] = {emit__GUARD_KEYS_VERSION, 40, 24, {0}}, + [_GUARD_NOS_FLOAT] = {emit__GUARD_NOS_FLOAT, 24, 16, {0}}, + [_GUARD_NOS_INT] = {emit__GUARD_NOS_INT, 24, 16, {0}}, + [_GUARD_NOT_EXHAUSTED_LIST] = {emit__GUARD_NOT_EXHAUSTED_LIST, 52, 16, {0}}, + [_GUARD_NOT_EXHAUSTED_RANGE] = {emit__GUARD_NOT_EXHAUSTED_RANGE, 24, 16, {0}}, + [_GUARD_NOT_EXHAUSTED_TUPLE] = {emit__GUARD_NOT_EXHAUSTED_TUPLE, 37, 16, {0}}, + [_GUARD_TOS_FLOAT] = {emit__GUARD_TOS_FLOAT, 24, 16, {0}}, + [_GUARD_TOS_INT] = {emit__GUARD_TOS_INT, 24, 16, {0}}, + [_GUARD_TYPE_VERSION] = {emit__GUARD_TYPE_VERSION, 36, 24, {0}}, + [_GUARD_TYPE_VERSION_AND_LOCK] = {emit__GUARD_TYPE_VERSION_AND_LOCK, 36, 24, {0}}, + [_IMPORT_FROM] = {emit__IMPORT_FROM, 91, 32, {0}}, + [_IMPORT_NAME] = {emit__IMPORT_NAME, 160, 40, {0}}, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = {emit__INIT_CALL_BOUND_METHOD_EXACT_ARGS, 140, 24, {0}}, + [_INIT_CALL_PY_EXACT_ARGS] = {emit__INIT_CALL_PY_EXACT_ARGS, 528, 8, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_0] = {emit__INIT_CALL_PY_EXACT_ARGS_0, 195, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_1] = {emit__INIT_CALL_PY_EXACT_ARGS_1, 213, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_2] = {emit__INIT_CALL_PY_EXACT_ARGS_2, 222, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_3] = {emit__INIT_CALL_PY_EXACT_ARGS_3, 231, 0, {0}}, + [_INIT_CALL_PY_EXACT_ARGS_4] = {emit__INIT_CALL_PY_EXACT_ARGS_4, 240, 0, {0}}, + [_IS_NONE] = {emit__IS_NONE, 87, 40, {0}}, + [_IS_OP] = {emit__IS_OP, 121, 40, {0}}, + [_ITER_CHECK_LIST] = {emit__ITER_CHECK_LIST, 24, 16, {0}}, + [_ITER_CHECK_RANGE] = {emit__ITER_CHECK_RANGE, 24, 16, {0}}, + [_ITER_CHECK_TUPLE] = {emit__ITER_CHECK_TUPLE, 24, 16, {0}}, + [_ITER_NEXT_LIST] = {emit__ITER_NEXT_LIST, 46, 0, {0}}, + [_ITER_NEXT_RANGE] = {emit__ITER_NEXT_RANGE, 63, 24, {0}}, + [_ITER_NEXT_TUPLE] = {emit__ITER_NEXT_TUPLE, 43, 0, {0}}, + [_JUMP_TO_TOP] = {emit__JUMP_TO_TOP, 7, 8, {0}}, + [_LIST_APPEND] = {emit__LIST_APPEND, 105, 32, {0}}, + [_LIST_EXTEND] = {emit__LIST_EXTEND, 293, 128, {0}}, + [_LOAD_ATTR] = {emit__LOAD_ATTR, 239, 48, {0}}, + [_LOAD_ATTR_CLASS] = {emit__LOAD_ATTR_CLASS, 66, 24, {0}}, + [_LOAD_ATTR_INSTANCE_VALUE] = {emit__LOAD_ATTR_INSTANCE_VALUE, 115, 32, {0}}, + [_LOAD_ATTR_METHOD_LAZY_DICT] = {emit__LOAD_ATTR_METHOD_LAZY_DICT, 33, 8, {0}}, + [_LOAD_ATTR_METHOD_NO_DICT] = {emit__LOAD_ATTR_METHOD_NO_DICT, 33, 8, {0}}, + [_LOAD_ATTR_METHOD_WITH_VALUES] = {emit__LOAD_ATTR_METHOD_WITH_VALUES, 33, 8, {0}}, + [_LOAD_ATTR_MODULE] = {emit__LOAD_ATTR_MODULE, 116, 32, {0}}, + [_LOAD_ATTR_MODULE_FROM_KEYS] = {emit__LOAD_ATTR_MODULE_FROM_KEYS, 145, 32, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = {emit__LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 51, 16, {0}}, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = {emit__LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 51, 16, {0}}, + [_LOAD_ATTR_PROPERTY_FRAME] = {emit__LOAD_ATTR_PROPERTY_FRAME, 258, 24, {0}}, + [_LOAD_ATTR_SLOT] = {emit__LOAD_ATTR_SLOT, 86, 32, {0}}, + [_LOAD_ATTR_WITH_HINT] = {emit__LOAD_ATTR_WITH_HINT, 155, 32, {0}}, + [_LOAD_BUILD_CLASS] = {emit__LOAD_BUILD_CLASS, 151, 80, {0}}, + [_LOAD_COMMON_CONSTANT] = {emit__LOAD_COMMON_CONSTANT, 55, 32, {0}}, + [_LOAD_CONST_IMMORTAL] = {emit__LOAD_CONST_IMMORTAL, 28, 8, {0}}, + [_LOAD_CONST_INLINE] = {emit__LOAD_CONST_INLINE, 25, 8, {0}}, + [_LOAD_CONST_INLINE_BORROW] = {emit__LOAD_CONST_INLINE_BORROW, 15, 8, {0}}, + [_LOAD_CONST_MORTAL] = {emit__LOAD_CONST_MORTAL, 38, 8, {0}}, + [_LOAD_DEREF] = {emit__LOAD_DEREF, 105, 32, {0}}, + [_LOAD_FAST] = {emit__LOAD_FAST, 30, 8, {0}}, + [_LOAD_FAST_0] = {emit__LOAD_FAST_0, 23, 0, {0}}, + [_LOAD_FAST_1] = {emit__LOAD_FAST_1, 23, 0, {0}}, + [_LOAD_FAST_2] = {emit__LOAD_FAST_2, 23, 0, {0}}, + [_LOAD_FAST_3] = {emit__LOAD_FAST_3, 23, 0, {0}}, + [_LOAD_FAST_4] = {emit__LOAD_FAST_4, 23, 0, {0}}, + [_LOAD_FAST_5] = {emit__LOAD_FAST_5, 23, 0, {0}}, + [_LOAD_FAST_6] = {emit__LOAD_FAST_6, 26, 0, {0}}, + [_LOAD_FAST_7] = {emit__LOAD_FAST_7, 26, 0, {0}}, + [_LOAD_FAST_AND_CLEAR] = {emit__LOAD_FAST_AND_CLEAR, 29, 8, {0}}, + [_LOAD_FAST_CHECK] = {emit__LOAD_FAST_CHECK, 129, 128, {0}}, + [_LOAD_FROM_DICT_OR_DEREF] = {emit__LOAD_FROM_DICT_OR_DEREF, 249, 48, {0}}, + [_LOAD_GLOBAL] = {emit__LOAD_GLOBAL, 100, 32, {0}}, + [_LOAD_GLOBAL_BUILTINS] = {emit__LOAD_GLOBAL_BUILTINS, 76, 24, {0}}, + [_LOAD_GLOBAL_BUILTINS_FROM_KEYS] = {emit__LOAD_GLOBAL_BUILTINS_FROM_KEYS, 71, 24, {0}}, + [_LOAD_GLOBAL_MODULE] = {emit__LOAD_GLOBAL_MODULE, 76, 24, {0}}, + [_LOAD_GLOBAL_MODULE_FROM_KEYS] = {emit__LOAD_GLOBAL_MODULE_FROM_KEYS, 71, 24, {0}}, + [_LOAD_LOCALS] = {emit__LOAD_LOCALS, 99, 48, {0}}, + [_LOAD_NAME] = {emit__LOAD_NAME, 90, 32, {0}}, + [_LOAD_SMALL_INT] = {emit__LOAD_SMALL_INT, 34, 16, {0}}, + [_LOAD_SMALL_INT_0] = {emit__LOAD_SMALL_INT_0, 20, 8, {0}}, + [_LOAD_SMALL_INT_1] = {emit__LOAD_SMALL_INT_1, 20, 8, {0}}, + [_LOAD_SMALL_INT_2] = {emit__LOAD_SMALL_INT_2, 20, 8, {0}}, + [_LOAD_SMALL_INT_3] = {emit__LOAD_SMALL_INT_3, 20, 8, {0}}, + [_LOAD_SPECIAL] = {emit__LOAD_SPECIAL, 190, 56, {0}}, + [_LOAD_SUPER_ATTR_ATTR] = {emit__LOAD_SUPER_ATTR_ATTR, 222, 56, {0}}, + [_LOAD_SUPER_ATTR_METHOD] = {emit__LOAD_SUPER_ATTR_METHOD, 311, 64, {0}}, + [_MAKE_CALLARGS_A_TUPLE] = {emit__MAKE_CALLARGS_A_TUPLE, 188, 48, {0}}, + [_MAKE_CELL] = {emit__MAKE_CELL, 125, 40, {0}}, + [_MAKE_FUNCTION] = {emit__MAKE_FUNCTION, 137, 40, {0}}, + [_MAKE_WARM] = {emit__MAKE_WARM, 40, 16, {0}}, + [_MAP_ADD] = {emit__MAP_ADD, 78, 24, {0}}, + [_MATCH_CLASS] = {emit__MATCH_CLASS, 198, 48, {0}}, + [_MATCH_KEYS] = {emit__MATCH_KEYS, 75, 24, {0}}, + [_MATCH_MAPPING] = {emit__MATCH_MAPPING, 54, 24, {0}}, + [_MATCH_SEQUENCE] = {emit__MATCH_SEQUENCE, 54, 24, {0}}, + [_MAYBE_EXPAND_METHOD] = {emit__MAYBE_EXPAND_METHOD, 171, 32, {0}}, + [_MAYBE_EXPAND_METHOD_KW] = {emit__MAYBE_EXPAND_METHOD_KW, 168, 32, {0}}, + [_NOP] = {emit__NOP, 0, 0, {0}}, + [_POP_EXCEPT] = {emit__POP_EXCEPT, 81, 16, {0}}, + [_POP_TOP] = {emit__POP_TOP, 45, 16, {0}}, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = {emit__POP_TOP_LOAD_CONST_INLINE_BORROW, 68, 16, {0}}, + [_PUSH_EXC_INFO] = {emit__PUSH_EXC_INFO, 48, 8, {0}}, + [_PUSH_FRAME] = {emit__PUSH_FRAME, 36, 0, {0}}, + [_PUSH_NULL] = {emit__PUSH_NULL, 12, 0, {0}}, + [_PUSH_NULL_CONDITIONAL] = {emit__PUSH_NULL_CONDITIONAL, 29, 8, {0}}, + [_PY_FRAME_GENERAL] = {emit__PY_FRAME_GENERAL, 198, 32, {0}}, + [_PY_FRAME_KW] = {emit__PY_FRAME_KW, 235, 40, {0}}, + [_REPLACE_WITH_TRUE] = {emit__REPLACE_WITH_TRUE, 63, 24, {0}}, + [_RESUME_CHECK] = {emit__RESUME_CHECK, 31, 16, {0}}, + [_RETURN_GENERATOR] = {emit__RETURN_GENERATOR, 489, 32, {0}}, + [_RETURN_VALUE] = {emit__RETURN_VALUE, 68, 8, {0}}, + [_SAVE_RETURN_OFFSET] = {emit__SAVE_RETURN_OFFSET, 13, 8, {0}}, + [_SEND_GEN_FRAME] = {emit__SEND_GEN_FRAME, 114, 32, {0}}, + [_SETUP_ANNOTATIONS] = {emit__SETUP_ANNOTATIONS, 290, 120, {0}}, + [_SET_ADD] = {emit__SET_ADD, 114, 32, {0}}, + [_SET_FUNCTION_ATTRIBUTE] = {emit__SET_FUNCTION_ATTRIBUTE, 41, 16, {0}}, + [_SET_IP] = {emit__SET_IP, 12, 8, {0}}, + [_SET_UPDATE] = {emit__SET_UPDATE, 121, 40, {0}}, + [_START_EXECUTOR] = {emit__START_EXECUTOR, 93, 16, {0}}, + [_STORE_ATTR] = {emit__STORE_ATTR, 138, 32, {0}}, + [_STORE_ATTR_INSTANCE_VALUE] = {emit__STORE_ATTR_INSTANCE_VALUE, 188, 24, {0}}, + [_STORE_ATTR_SLOT] = {emit__STORE_ATTR_SLOT, 123, 24, {0}}, + [_STORE_ATTR_WITH_HINT] = {emit__STORE_ATTR_WITH_HINT, 225, 40, {0}}, + [_STORE_DEREF] = {emit__STORE_DEREF, 78, 16, {0}}, + [_STORE_FAST] = {emit__STORE_FAST, 100, 24, {0}}, + [_STORE_FAST_0] = {emit__STORE_FAST_0, 93, 16, {0}}, + [_STORE_FAST_1] = {emit__STORE_FAST_1, 93, 16, {0}}, + [_STORE_FAST_2] = {emit__STORE_FAST_2, 93, 16, {0}}, + [_STORE_FAST_3] = {emit__STORE_FAST_3, 93, 16, {0}}, + [_STORE_FAST_4] = {emit__STORE_FAST_4, 93, 16, {0}}, + [_STORE_FAST_5] = {emit__STORE_FAST_5, 93, 16, {0}}, + [_STORE_FAST_6] = {emit__STORE_FAST_6, 99, 16, {0}}, + [_STORE_FAST_7] = {emit__STORE_FAST_7, 99, 16, {0}}, + [_STORE_GLOBAL] = {emit__STORE_GLOBAL, 117, 32, {0}}, + [_STORE_NAME] = {emit__STORE_NAME, 249, 104, {0}}, + [_STORE_SLICE] = {emit__STORE_SLICE, 215, 40, {0}}, + [_STORE_SUBSCR] = {emit__STORE_SUBSCR, 148, 24, {0}}, + [_STORE_SUBSCR_DICT] = {emit__STORE_SUBSCR_DICT, 114, 40, {0}}, + [_STORE_SUBSCR_LIST_INT] = {emit__STORE_SUBSCR_LIST_INT, 237, 56, {0}}, + [_SWAP] = {emit__SWAP, 30, 8, {0}}, + [_TIER2_RESUME_CHECK] = {emit__TIER2_RESUME_CHECK, 15, 8, {0}}, + [_TO_BOOL] = {emit__TO_BOOL, 130, 48, {0}}, + [_TO_BOOL_BOOL] = {emit__TO_BOOL_BOOL, 24, 16, {0}}, + [_TO_BOOL_INT] = {emit__TO_BOOL_INT, 98, 48, {0}}, + [_TO_BOOL_LIST] = {emit__TO_BOOL_LIST, 101, 48, {0}}, + [_TO_BOOL_NONE] = {emit__TO_BOOL_NONE, 31, 24, {0}}, + [_TO_BOOL_STR] = {emit__TO_BOOL_STR, 119, 56, {0}}, + [_UNARY_INVERT] = {emit__UNARY_INVERT, 103, 32, {0}}, + [_UNARY_NEGATIVE] = {emit__UNARY_NEGATIVE, 103, 32, {0}}, + [_UNARY_NOT] = {emit__UNARY_NOT, 24, 16, {0}}, + [_UNPACK_EX] = {emit__UNPACK_EX, 143, 40, {0}}, + [_UNPACK_SEQUENCE] = {emit__UNPACK_SEQUENCE, 139, 40, {0}}, + [_UNPACK_SEQUENCE_LIST] = {emit__UNPACK_SEQUENCE_LIST, 153, 40, {0}}, + [_UNPACK_SEQUENCE_TUPLE] = {emit__UNPACK_SEQUENCE_TUPLE, 151, 40, {0}}, + [_UNPACK_SEQUENCE_TWO_TUPLE] = {emit__UNPACK_SEQUENCE_TWO_TUPLE, 108, 32, {0}}, + [_WITH_EXCEPT_START] = {emit__WITH_EXCEPT_START, 212, 48, {0}}, + [_YIELD_VALUE] = {emit__YIELD_VALUE, 96, 8, {0}}, +}; + +static const void * const symbols_map[1] = { + 0 +};